Arte da engenharia reversa, entendendo como os programas funcionam.
Consegui embedar, obrigado @Vitormedeiro
Meu Linkedisney: https://www.linkedin.com/in/vinicius-gabriel-09741623b/
Meu Github: https://github.com/vsaint1
Cansado de apenas ler sobre desenvolvimento web, como usar trocentos termos que só resultam em OverEngineering ou mais do mesmo? boa leitura.
Sempre fui apaixonado por Anti-Cheat e Cheat em geral. Compartilhando conhecimento, exemplos reais de uma área pouco explorada e vista com outros olhos.
Aprendendo ASM (x64), sem saber programar ASM? :O
Nesse artigo irei mostrar como funciona a engenharia reversa para curiosos e interessados, pratica e teoria, e como ela pode te ajudar a melhorar com desenvolvedor.
Você sempre utilizou hacks e nunca soube ( ou será que não ? )
Em todos sistemas operacionais se chama DLL - Dynamic linking library, só muda o sufixo.
Windows - DLL
Linux - .so
Mac - .dylib
Overlay - Sobreposição na tela
Programas de gravação ou que adicionam um Overlay -> nvidia, amd, discord, steam, metal, obs e etc.
Injetam DLL para obter informações e poder "desenhar" na tela desejada, mas calma que você não será banido por isso, essas DLL's possuem assinatura digital e seu check_sum é verificado para que não seja possivel qualquer um poder injetar steamoverlay64.dll modificada no jogo valorant por exemplo.
Irei análisar o jogo CS2, versão windows com compilador MSVC ( sim, tudo isso importa ), a teoria é a mesma, mas muda bastante de programa, assembly gerado pelo compilador e sistema operacional.
Ferramentas utilizadas:
- IDA
- Reclass
- Qualquer editor de texto
- Muita coragem
Quando analisamos qualquer tipo de programa seja ele malware, jogo, aplicativo desktop, aplicativo mobile e etc, precisamos entender como compreender o fluxo e ter a noção de instruções ASM da arquitetura do programa ( você não precisa ter migrado o Roler coaster Tycoon de ASM x86 para x64, apenas precisa compreender oque cada instrução significa ).
Análise
Os endereços podem mudar caso o programa atualize.
Imports
Olhando nos imports percebe-se que utiliza da v8 e há partes do jogo que pode rodar JS, e isso resultou em um XSS.
Exports
- Entrypoint, resumindo a função main de um programa compilado, porém, em DLL's são bastante diferente.
A DLL client.dll
expõe o EntryPoint é onde roda toda lógica client-side e possivelmente irá ter informações sobre entities, player_local, inputs e etc
Strings
Aqui onde tudo se torna visivel e "Open Source".
Podemos observar nas Strings
Licensas de libs utilizadas, classes, mensagens em geral, diretorio de arquivos relacionados a source, Offsets e etc.
Offsets
LEA - load effective address
Descobrimos onde guarda na .rdata, mas isso não é o suficiente, precisamos descobrir em qual endereço essa OFFSET é carregada quando mapeada para memória, então xref
para a instrução e se você entende o básico de ASM, existe uma INSTRUÇÃO chamada LEA
as Offsets seguem a ordem de que foram chamadas.
Seguindo a ordem, PLAYER + 0x334 aponta para m_iHealth
do jogador.
Explorando e decompilando a classe CGlobalVarsBase
Em resumo, essa classe guarda váriaveis como intervalo por ticks, o tempo real, o tempo atual, arquivo do mapa .vpk
e o nome do Mapa atual que está jogando.
Buscando por Strings que estão presentes pela source engine 2, encontramos isso e iremos investigar qual subrotinas são chamadas ( o fluxo ).
sub_180681BB0, podemos gerar uma SIGNATURE
para a subrotina e com isso teremos um enderço estático para ela
usando o plugin SIGMAKER, teremos 48 89 0D ? ? ? ? 48 89 41
, esse pattern representa os bytes onde essa subrotina sempre será mapeada quando client.dll for carregada na memória ram.
Partindo para a Análise dinâmica da classe CGlobalVarsBase
Utilizando da SIGNATURE
, gerada no modulo anterior nos sempre teremos o endereço estático para a Offset da subrotina.
Se fizessemos Rebase no programa, poderiamos ter acesso a offset 0x171CE70
diretamente e mais visivel, porém, sem rebase você pode pegar o TAMANHO DE BYTES DO MODULO CLIENT.DLL - O ENDEREÇO DA SUBROTINA
, que resultará no mesmo.
- Análisando com Reclass.net
MODULE_BASE + OFFSET == CGlobalVarsBase
<client.dll> + 0x171CE70
Quando adicionamos os dados coletados anteriormente no reclass, temos acesso a vários BYTES "DESCONHECIDOS", ponteiros para outros HEAP
objects e etc.
Entrando mais a fundo no ponteiro criado na HEAP + 1C8CE730120
Agora todas as peças se encaixaram, conseguimos ver claramente todas váriaveis da classe CGlobalVarsBase
Depois de mapear e exportar para o C++, teremos essas estruturas.
class GlobalVarsInstance
{
public:
class GlobalVarsBase *g_vars; //0x0000
char pad_0008[120]; //0x0008
}; //Size: 0x0080
static_assert(sizeof(GlobalVarsInstance) == 0x80);
class N00000512
{
public:
char pad_0000[8]; //0x0000
}; //Size: 0x0008
static_assert(sizeof(N00000512) == 0x8);
class GlobalVarsBase
{
public:
float m_flRealTime; //0x0000
char pad_0004[44]; //0x0004
float m_flcurrentTime; //0x0030
float m_flIntervalPerTick; //0x0034
float m_flIntervalPerTick2; //0x0038
char pad_003C[324]; //0x003C
uint64_t m_currentMap; //0x0180
uint64_t m_currentMapName; //0x0188
char pad_0190[8]; //0x0190
uint64_t m_maxClients; //0x0198
char pad_01A0[304]; //0x01A0
}; //Size: 0x02D0
static_assert(sizeof(GlobalVarsBase) == 0x2D0);
Você deve está se perguntando oque é esse pad_ + numero aleatorio. Isso é PAD ( Data structure Alignment, serve para alinhar a estrutura) nem todas váriaveis da Classe está uma abaixo da outra, por isso o PADDING.
https://en.wikipedia.org/wiki/Data_structure_alignment
Utilizando os dados de reverse engineering na prática
- Um simples Temporizador da C4, GlobalVars + C4Bomb
Nos precisamos ler a memoria e dereferencia para a nossa classe
class GlobalVarsBase;
OBS: abstrai toda a lógica que utilizo para renderizar textos e formatos geométricos ficando mais simples de entender.
Desenhando os dados na tela com meu "framework", que fiz para facilitar leitura/escrita na memoria e desenhar na tela.
Fim
Se você leu até aqui, espero que tenha gostado do artigo e lembre-se, curta o caminho ate chegar no resultado, essa é a melhor parte. Hacking não é ilegal, a briga de Gato e Ratos só existe por isso, para se criar ferramentas de defesa, precisa de um conhecimento muito avançado sobre como eles atacam!