Executando verificação de segurança...
16

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.

imports_js

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

exports

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.

strings

Offsets

LEA - load effective address

rdata1
rdata2

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.

offsets1

Seguindo a ordem, PLAYER + 0x334 aponta para m_iHealth do jogador.

offsets2

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 ).

global_vars

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.

gvars_sub

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.

data

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

data2

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.

globalvarsbase

Desenhando os dados na tela com meu "framework", que fiz para facilitar leitura/escrita na memoria e desenhar na tela.

finished

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!

Carregando publicação patrocinada...
3

Execlente artigo, muito bom mesmo. Taí um tipo de conteúdo que gostaria de ver mais por aqui. Todo software é open source se você sabe fazer sua engnheria reversa, ha!

Mas cuidado, engenheira reversa costuma ser quase sempre, com poquissimas exções - ilegal. Não deveria, mas é. No geral, você pode fazer engenharia reversa para descobrir como o software funciona e então escrever seu próprio programa que faça a mesma coisa, qualquer coisa além disto - como modificar o software original - costumar sim ser crime, seja no Brasil, Europa, ou Eua.

Software, reverse engineering and the law
A ENGENHARIA REVERSA DE SOFTWARE NO BRASIL: UMA ANÁLISE SOBRE A SUA VIABILIDADE LEGAL
The legal boundaries of reverse engineering in the EU

1

Obrigado, low level é um conteudo muito insano pra quem gosta ou só tem curisodade, porem, hoje em dia creio que só existe desenvolvimento web como área, é uma realidade bem triste sendo sincero, acabei conhecendo pessoas que não gostam de desenvolvimento web e/ou que não são de áreas mainstream ( frontend, backend e mobile ) e sempre relatam a mesma coisa.

E sobre as regras, elas são para mais para CRACKERS, boa parte do time por trás do Vanguard e EAC são graças ao maior forum de cheaters dos anos 2000, afinal, pra saber como defender-se precisa saber como atacam.

3

Cara, com todo respeito mas eu sugiro dedicar mais atenção enquanto escreve um artigo. Tá faltando (e muito) coesão no seu texto.

Além disso para um artigo que tem "entendendo como os programas funcionam" não faria sentido... Tipo assim... Explicar como programas funcionam? Porque o artigo todo presume conhecimento prévio do leitor sobre como programas funcionam. O que não faz o menor sentido para um artigo que já começa falando isso:

Cansado de apenas ler sobre desenvolvimento web, como usar trocentos termos que só resultam em OverEngineering ou mais do mesmo? boa leitura.

O que dá a entender que seu público alvo são pessoas que não estão acostumadas a lerem sobre esse tipo de coisa. Logo, supostamente, tem pouco ou nenhum conhecimento prévio sobre o assunto. É isso que o título e o início do artigo dá a entender, mas daí em diante presume um monte de conhecimento prévio do leitor... Isso não faz sentido.

Vou apontar alguns problemas abaixo. Não vou apontar tudo que vi de errado para também não precisar escrever muito.


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.

O que que em todo sistema operacional se chama DLL? Não tem explicação nenhuma, é só uma frase solta. Parece até que foi recortada de outro texto e por isso perdeu o contexto da frase. Além de que a informação tá errada, só no Windows se chama DLL. O nome genérico é biblioteca compartilhada.

[...]Injetam DLL para obter informações e poder "desenhar" na tela desejada[...]

Não foi dedicada uma linha de texto sequer para explicar o que é injeção de DLL, nem muito menos para explicar como funciona.

Os endereços podem mudar caso o programa atualize.

Mais uma frase solta e completamente fora de contexto. Também sem explicar nada sobre nada.

Olhando nos imports percebe-se que utiliza da v8 e há partes do jogo que pode rodar JS, e isso resultou em um XSS.

Não explicou nada sobre símbolos, bibliotecas dinâmicas, nada... Só jogou a palavra "imports" no ar e presumiu que todo mundo que tá lendo sabe do que tá sendo falado e como funciona.

Entrypoint, resumindo a função main de um programa compilado, porém, em DLL's são bastante diferente.

Primeiro que a frase é mal formulada, o que torna bem difícil de entender que ela está se propondo a explicar o que é "entrypoint". Eu precisei reler umas 3 vezes para entender isso.

Segundo que a explicação está errada. E se você disser que deu uma explicação tecnicamente errada para "facilitar o entendimento"... Aí que eu não vou entender o teu artigo mesmo, amigo. Porque o artigo todo presume conhecimento prévio do leitor sobre como programas funcionam, aí nessa frase presume que ele não tem capacidade técnica suficiente para entender o que é entrypoint? Não faz sentido.

LEA - load effective address

De novo: fora de contexto, sem explicação, nem sequer menciona que é uma instrução. Só joga a sigla "pro ar". Quem não conhece a instrução LEA jamais vai entender isso daqui, jamais.

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

De novo o problema de coesão do texto. Mas além disso:

  • Não explicou nada sobre seções e segmentos de memória, só mandou um .rdata do nada.
  • Não explica o que é OFFSET.
  • Não explica sobre o que é mapear seções do executável na memória.
  • Não diz o que é xref.

as Offsets seguem a ordem de que foram chamadas.

De novo: frase solta, fora de contexto, sem explicação.


Enfim, tem vários outros pontos mas acho que é o bastante para entender o que eu quero dizer. Seu artigo tem boa intenção mas o aproveitamento dele é 0 se quem ler não consegue entender do que você está falando. É como falar Russo com quem só fala Espanhol.

Não tem problema escrever artigo presumindo algum conhecimento prévio. Mas você precisa decidir para quem você está escrevendo. Não dá para escrever para leigos no assunto ao mesmo tempo que presume que o leigo entende tudo do assunto, isso não faz sentido.

3

Cara, ontem você alugou um triplex na minha cabeça , fui dormir pensando e realmente depois percebi que não ficou tão legal como esperava e principalmente para quem não estava na mesma página. Muito obrigado pelo feedback detalhado de todos os pontos.