> For the complete documentation index, see [llms.txt](https://stacked-rwx.gitbook.io/public/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://stacked-rwx.gitbook.io/public/reverse-engineering/engenharia-reversa-code-injection-code-cave.md).

# Engenharia Reversa: Code Injection — Code Cave

\- “[O homem inteligente encontra em toda a parte inteligência, o louco projecta sobre todas as paredes a sombra da sua fronte estreita e inerte. Escolhei o melhor que puderdes; mas procurai que tudo seja bom, largo, aberto ao bem, prudente e progressivo.” (A vida intelectual — 1920)](https://kdfrases.com/usuario/FreitasSabino/frase/15944f)”

***- Cabeçalho***

* Nesse artigo, estarei utilizando uma ferramenta crucial para todo esse processo que estarei escrevendo durante este artigo.\
  Download: [x32dbg](https://x64dbg.com/)

***- O que é Code Injection?***

* Essa é uma técnica muito utilizada na exploração de binários e análise de malware. Consiste em fazer uma injeção de código dentro do programa que está sendo debugado. Seja lá qual for o motivo, é uma técnica bastante interessante e também bastante perigosa, pois dependendo da ética de algumas pessoas, essa técnica acaba se tornando um ponto de partida para fazer invasões a computadores.

***- O que é Code Cave?***

* Code Cave é uma série de Bytes não utilizados na memória de um processo. O Code Cave dentro da memória de um processo geralmente é uma referência a uma seção que tem capacidade para injetar instruções personalizadas. Utilizarei do Code Cave para injetar meu código malicioso durante a escrita deste artigo.

***- Explorando o programa***

* Bom, aqui estarei dando início a todo processo de exploração do programa e vocês acompanharão calmamente todo processo de exploração. Caso tenha alguma dúvida durante todo este artigo, procure-me nas redes sociais ou então faça algumas breves buscas no senhor Google!

<figure><img src="/files/diOD7Gg2c7ednu3YQb3k" alt=""><figcaption></figcaption></figure>

* Utilizando o x32dbg, estou agora debugando todo o programa e é nesse momento que a nossa mente acaba bagunçando com esse tanto de informação. Acalme-se! Nada disso é importante para nós, pois estamos a procura da “main”. Com o comando “bp main”, eu consigo criar um **breakpoint** na “main” do meu programa e isso facilita eu encontrar o meu foco principal. Irei até a aba “Breakpoints” e lá estará a nossa “main” marcada.

<figure><img src="/files/xSvnKYVKDYGZUssIknTP" alt=""><figcaption></figcaption></figure>

* A main é classificada como EntryPoint, ou seja, o nosso ponto de entrada, o início de toda função do nosso programa. Cliquei duas vezes sobre o Breakpoint marcado e fui redirecionado até onde eu queria chegar.

<figure><img src="/files/3L5akIWjLo1Kc9ApQg8q" alt=""><figcaption></figcaption></figure>

* A nossa main inicia-se com “push 0” e em comentários está como “EntryPoint”. Observe que logo abaixo de “push 0” temos uma função de chamada, uma call. Ela aponta para “GetModuleHandleA”. Para não perder tudo isso, vou anotar na aba “notas”.

<figure><img src="/files/dPRgT675L8o9nL1aFQNy" alt=""><figcaption></figcaption></figure>

* Uma coisa que talvez passe pela mente de algumas pessoas é: “Por que você simplesmente não escreve um código Assembly e substitui todo esse código do programa?” A resposta em si é bem clara: Não funcionará! Todo o código Assembly exibido no debugger é o nosso programa, portanto, caso seja feita alguma modificação mal feita, há um risco do nosso programa gerar um erro. Pare de preguiça e torne-se um bom engenheiro reverso! :)
* E como irei escrever dentro do programa? Lembre-se de alguns parágrafos acima, é crucial nesse momento ter o entendimento do que é o Code Cave. Vamos procurar então por Bytes vazios, ou seja, 00. Para isso, procurei na função “Find Pattern” pelos bytes vazios.

<figure><img src="/files/opuwqpDIbsBykLG2Hnxe" alt=""><figcaption></figcaption></figure>

* Habilitei o NumLock e coloquei vários 00 em hexadecimal (equivalente a null, vazio). Dei um ok e fui redirecionado para uma tabela gigante de bytes vazios.

<figure><img src="/files/qnhBksedJKMrLudf9dTc" alt=""><figcaption><p>Sim, você está vendo na sua frente um exemplo real de Code Cave</p></figcaption></figure>

* Irei selecionar um endereço, lembrando que não importa a localização desse endereço, qualquer um serve. Irei pegar o oitavo endereço!

<figure><img src="/files/9FMm9pKo0u5f8BTQTnGO" alt=""><figcaption></figcaption></figure>

* Observe que eu adicionei um **x** entre os dois zeros e há uma explicação para isso: “**0x** ou **0X** é um prefixo que foi inicialmente utilizado por compiladores Assembly da AT\&T no final da década de 1960 para representar valores numéricos **hexadecimais**.”
* Agora darei um jump (jmp) no meu “push 0” para esse endereço do Code Cave.

<figure><img src="/files/cUuXGs6cFZFUh7RhQLP5" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/xoNIxJUpTMUNHcjfHHoU" alt=""><figcaption></figcaption></figure>

* Observe que duas funções foram criadas e são chamadas de “NOP”. Ela basicamente é uma função determinada para não deixar bytes soltos de instruções que não existem.
* Executando o nosso programa, veja que ele fará um pulo até o nosso endereço do Code Cave.

<figure><img src="/files/vMTYZJGE45KchlnPVfiL" alt=""><figcaption></figcaption></figure>

* É exatamente isso que precisamos para início de nosso programa. Agora o que precisamos é fazer com que o depois desse jmp, dentro desses bytes vazios, ele execute uma função que eu desejo. Vamos lá.
* A minha meta é exibir uma MessageBoxA() que imprima uma mensagem na tela dizendo que o programa sofreu uma tentativa de injeção de código com sucesso!
* Para isso, precisarei primeiro procurar por uma região na qual irei converter os bytes vazios por esse texto.

<figure><img src="/files/fljr5k2QJRsFWyFv9Bcy" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/wWOHTMc4Qe0Yh6S8bpSX" alt=""><figcaption></figcaption></figure>

* Irei utilizar essa região para escrever a mensagem. Para isso, terei que visualizar o endereço selecionado no “despejo 1”, selecionar os bytes vazios e modificá-los digitar minha mensagem.

<figure><img src="/files/VADrtvMMN7l3Q28lU6Ov" alt=""><figcaption></figcaption></figure>

* Confira o Gif abaixo e repetirei mais uma vez o mesmo processo do Gif para criar a segunda mensagem!

<figure><img src="/files/2i2eYjbQf2Ensg20GIxC" alt=""><figcaption></figcaption></figure>

* Perfeito! Agora precisamos copiar os endereços das mensagens que injetamos no nosso código.

<figure><img src="/files/F5jJerzraTG39irco8VE" alt=""><figcaption></figcaption></figure>

* Agora o que falta ser feito? Bom, vamos voltar ao nosso primeiro endereço do Code Cave que pegamos para injetarmos o código.

<figure><img src="/files/hduCFQyKCTFBzMKbenbC" alt=""><figcaption></figcaption></figure>

* O que eu fiz aqui foi o seguinte. Dei um “push 0” na primeira instrução e logo após eu declarei um “push 0x76f51232” para ser o título da MessageBoxA(). O “push 0x76f51242” foi declarado para ser o texto principal da MessageBoxA(). “Push 0” novamente. Logo após, observe que eu já adicionei duas instruções de chamadas e elas funcionam da seguinte forma: “call \<user32.MessageBoxA>” indica uma instrução que criará uma caixa de mensagem exibindo as mensagens que foram setadas. A próxima chamada, “call \<kernel32.GetModuleHandleA>” recupera um identificador de módulo para o módulo especificado. Finalmente temos então o nosso jmp, que nesse caso, voltará para a main do nosso programa, fazendo assim, ele executar o programa normalmente.

<figure><img src="/files/gRs82AlrXa0n4eGY9O2c" alt=""><figcaption></figcaption></figure>

* Observe claramente que o código foi injetado e todo esse processo funcionou normalmente! Agora irei patchear o programa e mostrar a injeção funcionando sem usar o debugger! Confiram também um Gif em execução antes de verem o patch do programa!

<figure><img src="/files/rzqO77EcWaM8q9uE2efv" alt=""><figcaption></figcaption></figure>

* Execução perfeita! Nenhum erro, tudo funcionando perfeitamente. Agora confiram o programa patcheado.

<figure><img src="/files/iahLfPXEYsRWLkWKbKSC" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/fCc48tURXrlvvBUQkrSR" alt=""><figcaption></figcaption></figure>

* **yeah, conseguimos! Agora é hora de relaxar! Espero que tenham gostado do artigo. Vejos vocês no próximo, em! :)**

“Não tenho nenhum talento especial, sou apenas apaixonadamente curioso.”\
\- *Albert Einstein*
