###

domingo, 31 de maio de 2009

Code Inject

Bom pessoal vou falar sobre Code Inject  , essa técnica é muito útil para desvio de rotinas particularmente em ER , hoje eu vou ser bem sucinto , vou envolver Code Inject e AutoKeygenning.

Vou também tentar exemplificar bem o que vou fazer , para isso escolhi novamente o crackme que meu amigo Rafael fez para teste , então vamos lá.

Primeiramente cheguei até a rotina principal por referência as strings de mensagem de erro ,dei um breakpoint no inicio dela e executei meu alvo , preenchi meus campos , e agora vou seguir trançando com F8.

Em 4531E4 eu tenho a instrução MOV EDX,[EBP-4] , essa instrução move o conteúdo armazenado em 16F620 para EDX que é a senha para nosso nome (em BASE64) , essa instrução é importante pra nós por isso vamos usá-la mais adiante.

Na linha seguinte temos uma Call zera nossos registros , logo após um JNZ que nos joga na mensagem de erro, aqui vemos a estrutura da nossa MessageBox , nós também vamos altera-la para ficar com um aspecto melhor:

453203 PUSH 10                        Style   MB_OK
453205 MOV ECX,0045330C   Title    "Tente Novamente"
45320A
MOV EDX,00453324   Text    "Valores Incorretos !"

Bem é essas três estruturas que iremos modificar , o nosso style de janela , o title e o text que vai ser nosso valor correto para o nome , depois dessa pequena analise vamos voltar a executar o programa e perceber que a CALL que vem depois de 4531E4 limpa nossos registros , se irmos ao dump e digitar o endereço 16F620 vamos notar que mesmo essa CALL tendo limpado nossos registros , ainda temos o nosso serial guardado na memória , então poderemos fazer referência por esse endereço , mas não especificamente ele porque em outros casos o programa pode altenar de endereço ao guardar esse conteúdo , então vamos gerar vicios bons, vamos usar a operação de
MOV EDX,[EBP-4] já que mesmo depois desse CALL nosso EBP não é limpo.

Bem já que não vamos acertar de primeira mesmo vamos usar o JNZ que há em 4531EC para nos jogar para um code cave , eu por exemplo usei o endereço 4535E1 e 4535E4 , respectivamente para injetar o serial em EDX e pular novamente pra rotina , para exemplificar melhor :



Então no meu ficou assim :

4531EC     JMP 4535E1
453203     PUSH 30
453205     MOV ECX,4532F0
45320A     MOV EDX,EDX
4535E1     MOV EDX,[EBP-4]
4535E4     JMP 453203

Agora é só pegar o OFFSET dos endereços e modificar pelos bytes correspondentes , como essa parte é muito chata e exige muita atenção coisa que não tenho muito (conheço alguém que ira discordar) , eu já fiz pra vocês e apliquei em um source para "patchear" escrito em C :

#include <stdio.h> 
#define name "gg.exe"

  void patchr(long int offset,int byte)
 {
     FILE *arquivo;
     arquivo=fopen(name,"rb+");
     fseek (arquivo,offset,SEEK_CUR);
     fprintf(arquivo,"%c",byte);
     fclose(arquivo);

 } 

 main()
 {  
 
       patchr(0x525EC,0xE9);patchr(0x529E4,0xE9);
       patchr(0x525ED,0xF0);patchr(0x52606,0xF0);
       patchr(0x525EE,0x03);
       patchr(0x525EF,0x00);patchr(0x525F0,0x00);
       patchr(0x52604,0x30);
       patchr(0x52607,0x32);
       patchr(0x5260A,0x8B);patchr(0x529E1,0x8B);
       patchr(0x5260B,0xD2);
       patchr(0x529E2,0x55);
       patchr(0x529E3,0xFC);patchr(0x529E6,0xFC);
       patchr(0x529E5,0x1A);
       patchr(0x529E7,0xFF);patchr(0x529E8,0xFF);

  
       return 0
 } 

Abaixo o link com o alvo , o meu script para calcular o OFFSET e o source em C , e espero que tenham entendido

http://gustavosh.110mb.com/sources/injectc.zip


1 comentários:

Anônimo disse...

Muito bom Gustavo. Parabéns! Legal pra entender

Postar um comentário

http://i563.photobucket.com/albums/ss79/smoker_album/bbbbbbbbbbbbbbbn.jpg
Spirit Tutoriais