sábado, 26 de abril de 2008

INJETANDO CÓDIGOS

INJETANDO CÓDIGOS






Neste tutorial vamos ver como injetar novos códigos em um
executável já compilado. Vamos modificar o bloco de notas do
windows para que exiba uma simples mensagem de texto ( pois é uma
das função mais fáceis que o Windows fornece ) quando for
iniciado.



Antes de tudo, faça uma cópia do bloco de notas ( C:\WINDOWS\notepad.exe
) para uma pasta qualquer ( vamos usar essa cópia, pra preservar o
original ). O que nós vamos fazer é o seguinte: desviar o início
do código do notepad para outro local, exibir a mensagem e depois
retornar ao ponto original.



Imagem



Para fazer isso, precisamos encontrar na seção do código do
notepad, um local vazio, que não altere a

funcionalidade
do programa, o que é chamado de "Code-cave".
Abra o notepad.exe no Olly e role o código para baixo. Lá pelo
offset 8747 você deve encontrar o início da code-cave, uma seção
sem código algum, apenas com valores 00:



Imagem



Essa região a partir de 8747 é a que vamos utilizar para escrever
nosso código. Como disse, vamos adicionar uma MessageBox no início
da execução. Vamos dar uma olhada na função MessageBoxA para ver o
que nós precisamos:





Código:

Selecionar tudo

int MessageBox(



HWND hWnd, // handle of owner window

LPCTSTR lpText, // address of text in message box

LPCTSTR lpCaption, // address of title of message box

UINT uType // style of message box



);






Para chamar a função, precisamos passar 4 argumentos. hWnd indica
à qual janela a Msgbox pertence. lpText e lpCaption são o texto da
mensagem e o título da janela, respectivamente. E por útlimo,
uType indica o estilo da janela, como número de botões e ícones.

Precisamos gravar o texto e o título da janela em algum lugar, e
esse lugar é a própria code-cave. Vamos ao título primeiro.



A partir do início da code-cave, selecione o número de linhas que
você vai usar para armazenar o título, sendo que cada linha que
você selecionar vai ocupar o espaco de 1 caractere. Vou usar como
título "F3rGO!", que contém 6 caracteres. Então seleciono 6 linhas
a partir do início da CV ( code-cave ), usando SHIFT, clico com o
botão direito sobre a seleção e em seguida "Binary->Edit". Em
seguida, marque a caixa "Keep Size" e digite a sua mensagem no
campo ASCII:



Imagem



Aperte OK. O Olly primeiramente entede o que você digitou como uma
sequência de comandos, por isso a sua mensagem não apareceu
corretamente na janela de código. Aperte CTRL+A para o Olly
analisar o cógido novamente e aí sim você deve ver a sua string
corretamente. Repita o mesmo processo para o texto da janela (
selecionando as linhas a partir da linha que contém o seu título
). Eu usei como texto "Notepad modificado!", que contém 19
caracteres ( espaços contam como caracteres ). Selecione as 19
linhas e faça o mesmo que você fez para o título. No final, terá
algo assim:



Imagem



Já temos armazenado as nossas strings, então podemos chamar a
função. Lembre-se que os argumentos da função são puxados na ordem
inversa, ou seja, devemos usar o comando PUSH partido da uType
para o hWnd. Escolha um offset qualquer da CV ( pode ser logo
abaixo das strings ). Eu usei o 01008763. Escreva o código da
chamda da função ( na hora de puxar o título e texto, indique o
endereço de cada um no código ( 01008747 e 0100874E no meu caso
)). Para escrever o código, basta dar 2 cliques sobre a linha e
entrar com o comando. Seu código deve ficar assim ( os comentários
eu adicionei ):



Imagem



Já temos o código da msgbox, precisamos desviar o ínicio do
programa 01008763 para chamar a mensagem e depois retornar à
sequência de código original. Ainda não vamos adicionar o JMP de
retorno após a chamada por motivos que vou explicar adiante.
Memorize o endereço 01008763, pois é para ele que vamos desviar (
ja que é onde tem início a chamada da msgbox ).



Clique com o botão direito em qualquer lugar do código e em
seguida "Goto->Origin *". Fomos levado até o EntryPoint ( ponto de
entrada ) do programa.





Código:

Selecionar tudo

0100739D 6A 70 PUSH 70

0100739F 68 98180001 PUSH NOTEPAD.01001898

010073A4 E8 BF010000 CALL NOTEPAD.01007568

010073A9 33DB XOR EBX,EBX






Vamos ter que alterar o PUSH 70 para um jump até o endereço
01008763. Antes de alterar, anote os comandos desses 2 primeiros
offsets ( PUSH 70 e PUSH NOTEPAD... ). Já explico o porquê. Agora
dê um duplo clique sobre o PUSH 70 e altere para JMP 01008763 (
marque a opção Fill with NOP's ). Certo, desviamos o nosso código,
mas repare que foram perdidos 2 comandos devido a esse jump ( os 2
que você anotou ). Isso se dá ao fato que o comando JMP ocupa o
espaço do PUSH 70 e de parte do outro PUSH, completando com NOPs
os bytes que sobraram. Não podemos deixar assim, precisamos de
alguma maneira adicionar esses 2 comandos perdidos em algum lugar.
Onde? Na code-cave após a chamada da MessageBoxA.



Antes de voltar para a MessageBox, anote o offset do CALL
NOTEPAD.01007568 ( 010073A4 ), pois depois da msgbox ser exibida,
nós vamos ter que pular nesse endereço, para que a execução
continue.



Volte para a região da sua MessageBox e adicione os 2 comandos
anotados ( quando for adicionar o segundo comando, deixe somente o
push com o endereço, remova o texto "NOTEPAD." ). Agora podemos
realizar o jump de retorno ao código normal. Basta adicionar um
novo JMP após o fim do código injetado para o endereço 010073A4 (
offset que você acabou de anotar ). No final das contas, seu
código deve ter ficado semelhante a isso:



Imagem



Pode salvar seu arquivo ( "Botão Direito->Copy to Exetuable->All
Modifications->Copy All->Botão Direito->Save File" ) e testar. Se
você fez tudo certo, deve ter visto isso ao iniciar o seu bloco de
notas modificado



Imagem



Até a próxima!



F3rGO!



--

Fonte: fergo.110mb.com/engrev/tut10/tut_engrev10.html

Autor: Fergo



Não podia deixar de postar esse tutorial magnífico do senhor Fergo
..

Ótimo conteúdo .. muito bom mesmo .. !



Espero que aproveitem .. !







Nenhum comentário: