Le Derviche Tourneur
de Lise Grim
par Amenesia


But: Remplacer 'personne' par son pseudo.

Approche choisit: Toucher le moins possible au code

Outils:  W32Dasm / LordPE / éditeur hexa / API Spy / Softice

Solution: Rajout d'une Section et modification de la Table d'Import



 
 
 
 

Étape 1:  Étude du Crackme (API Spy )

API Spy nous apprend que le programme utilise l'api SetDlgItemTextA pour afficher  "CRACKED by personne :)".
 Donc pour changer le texte il suffit d'intercepter l'appel a cet api puis de remplacer sur la pile l'adresse du texte original par l'adresse du nouveau texte
 
 

pop eax
pop ecx
pop edx
pop ebx
push [NouvelleChaine]
push edx
push ecx
push eax
 jmp  [SetDlgItemTextA_initial ]

NouvelleChaine db  "CRACKED by Amenesia",0

depile adresse retour du Call
dépile handle
dépile l'identificateur
dépile l'adresse de la chaîne a afficher
empile l'adresse de notre chaîne
rempile l'identificateur
rempile handle
rempile adresse retour du Call

 

Reste plus qu'a intercepter l'appel a l'api... ;) Je crois que la solution la plus simple est de modifier la table d'import afin de pouvoir  contrôler l'appel de SetDlgItemTextA par le programme...  et obtenir quel chose qui ressemble a cela:

Interception de SetDlgTextA




Mais petit problème le programme est compressé: Comment faire pour obtenir la table d'import originale ?
 
 


Étape 2: Obtenir la Table d'Import originale

La deux solution possible, soit décompresser le programme avec upx:
Il ne reste plus qu'a le désassembler et rechercher l'api SetDlgItemTextA
* Référence To: USER32.SetDlgItemTextA, Ord:0000h
:00401B0A     Jmp dword ptr [00402054]

ou alors utiliser LordPE:
Le programme étant compressé, la Table d'Import de l'exe ne nous apprendra rien, donc dump du programme
- recherche de l'adresse de SetDlgItemTextA en mémoire ( Softice )  ( pour moi 77D3272Dh )
- recherche dans le dump de la valeur inversée ( pour moi 2D27D377h )
Elle se trouve a l'offset 2050h  ie 402050h ( Image Base + Virtual Offset or dans un dump, Virtual Offset  = Raw Offset)
 

Avec les deux méthodes on trouve donc 00402054 qui correspond a l'endroit du programme où  l'adresse de l'api SetDlgItemTextA est stocke par upx lors de la reconstruction de la table d'import ,et à l'endroit où le programme vient la lire lorsqu'il a besoin de faire appel a cet api.

Ce qu'il faut donc faire c'est prendre le contrôle du programme, une fois que upx a reconstruit la table d'import mais avant que le programme ne la consulte, afin de la modifier...  Ainsi chaque fois que le programme fera appel a SetDlgItemTextA le code se trouvant a l'adresse INTER_API s'exécutera...

    Modification de la Table d'Import

lea eax,  [00402054] 
mov [SetDlgItemTextA_Initial  ] , eax 

call Delta
Delta: 
pop eax 
add eax, ( offset INTER_API  - inter Delta )
mov [00402054], eax

jmp porgramme_decompressé

SetDlgItemTextA_Initial    dd 0

INTER_API:


Copie de l'addresse de SetDlgItemTextA
 
 
 

Calcul de l'addresse de INTER_API en mémoire
Que l'on copie dans la table d'import a la place de SetDlgItemTextA


Étape 3: Prendre le controle entre upx et le programme decompresse afin de modifier la table

Classique: recherche du popa terminal qui suit logiquement le pusha initial...  afin de trouver et remplacer le saut vers le programme décompressé par un saut vers notre code (qui se charge de sauter ensuite vers le programme décompressé).

TableImport



 
 
 

Étape 4: Réunion des différents éléments
 

Il ne reste plus qu'a copier les instructions precedentes ( dans une nouvelle section pour etre sûr qu'elles ne se feront pas ecraser lors de la decompression )
 

lea eax,  [00402054] 
mov [ SetDlgItemTextA_Initial ] , eax 

call Delta
Delta: 
pop eax 
add eax, ( offset INTER_API  - inter Delta )
mov [00402054], eax

jmp porgramme_decopressé

Stock_SetDlgItemTextA_Original   dd 0

INTER_API:
pop eax
pop ecx
pop edx
pop ebx
push [NouvelleChaine]
push edx
push ecx
push eax
 jmp  [SetDlgItemTextA_Initial ]

NouvelleChaine db  "CRACKED by Amenesia",0

DervicheC



En esperant ne pas avoir été trop embrouillé... ;)
Bonne continuation...