24 de maio de 2026

Reverse Engineering da Proteção de Captura de Tela de um Jogo

Começou com uma frustração simples: eu e meus amigos jogamos um jogo online juntos, e não conseguimos compartilhar tela no Discord. O jogo bloqueia. Tela preta, toda vez.

Eu poderia ter aceitado isso. Mas algo em saber que um software no meu computador estava deliberadamente me impedindo de fazer algo inofensivo me deixou curioso. Passei o dia inteiro nessa toca de coelho.

A primeira pista

Antes de tocar em qualquer ferramenta, notei algo estranho: semanas atrás, por alguns minutos, todo mundo no grupo conseguiu compartilhar tela ao mesmo tempo. Depois parou de novo. Pra todo mundo, simultaneamente.

Se a proteção fosse puramente client-side, cada computador decidiria isso de forma independente. O fato de ter quebrado e voltado em sincronia apontava pra algo server-side.

Encontrando o mecanismo

Uma busca rápida confirmou a API usada: SetWindowDisplayAffinity, do user32.dll. Com a flag WDA_EXCLUDEFROMCAPTURE, qualquer captura de tela (Discord, OBS, navegador) enxerga a janela como preta.

Abrindo a caixa preta com Ghidra

Nunca tinha feito engenharia reversa antes. Instalei o Ghidra, carreguei o executável do jogo, e busquei no import table por SetWindowDisplayAffinity. Um único resultado: um único lugar no código inteiro onde essa função era chamada.

void FUN_00be4080(int param_1, char param_2) {
    DWORD dwAffinity = 0x11;
    if (param_2 == '\0') 
    {
        dwAffinity = 0;
    }
    SetWindowDisplayAffinity(*(HWND *)(param_1 + 4), dwAffinity);
}

Testei patchar o binário diretamente, trocando a instrução que passava a flag de bloqueio por uma que sempre passava zero. Funcionou. E ver o decompilador atualizar em tempo real, refletindo a mudança, foi o momento em que entendi visceralmente o que é engenharia reversa.

A camada de rede

Capturando tráfego com Wireshark, descobri que a decisão não vinha dos servidores do próprio jogo, mas de um SDK de terceiros (otimização de rede) embutido no cliente. Isso explicava a sincronização: quando o servidor deles caía, o sinal de bloqueio sumia pra todo mundo ao mesmo tempo.

O que ficou

Não resolvi o problema original: meus amigos ainda não conseguem ver minha stream do jogo. Mas saí entendendo, na prática, como Windows controla captura de tela a nível de API, como anti-cheats protegem memória de processo, e como hooks funcionam a nível de byte.

A parte melhor não foi nenhuma descoberta específica. Foi tratar algo opaco e aparentemente fixo como um sistema que podia ser entendido.

← Voltar pro blog