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
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:
Muito bom Gustavo. Parabéns! Legal pra entender
Postar um comentário