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:
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
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
|
É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é).
É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
jmp porgramme_decopressé Stock_SetDlgItemTextA_Original dd 0 INTER_API:
NouvelleChaine db "CRACKED by Amenesia",0 |