Photo d’Ecran Ver 1.0 1er et 2ème
version
Infection :
Ecran Shareware au lancement de l'application : Version Non Enregistrée, et date d'installation
Time limit
Boite d'enregistrement
Avant propos :
Photo d'Ecran est un logiciel qui se décompresse en mémoire, ce qui rend sa " lisibilité
" beaucoup plus problématique en attaquant le programme bille en tête avec SoftIce. Et puis,
au regard de la taille de photo.exe (32ko), il est peu probable que ce soit l'application maître en elle
même, mais plutôt un Loader/décompresseur. Du coup, une recherche du call appelant l'écran
Shareware , en traçant avec F10, devient délicate. Pourtant, celui ci, ou le message qu'il contient,
doit très certainement être soumis à un drapeau utilisateur Enregistré/non-enregistré.
La boite " A propos " réplique de l'écran Shareware, doit l'être également…
Bien que l'exercice ne porte pas sur la recherche du numéro de série j'ai commencé par regarder
comment réagissait Photo d'Ecran à l'entrée d'un sérial quelconque.
Je tiens à signaler que, dans un premier temps, le programme mis à disposition par ATP TEAM n'était
pas celui du VRAI exercice. Par manque de courage, je n'ai pas franchement eu envie de réécrire un
texte complet. Je me contenterai de signaler les différences entre les deux versions quand il le faudra.
Le Flag Utilisateur Reg/Unreg
Après avoir rempli la boite d'enregistrement, je suis passé sous SoftIce pour poser un BPX HMEMCPY,
avant de valider le champ de la boite de dialogue.
POP !
Après 7 appuis sur la touche [F12], j'ai atterri en douceur dans REGDLL.dll. Si avant d'attaquer le Soft
vous avez eu la curiosité de noter le nom des fichiers contenus dans le répertoire de Photo.exe,
vous n'aurez pas été sans repérer cette dll de 241 ko , la seule laissant à supposer
que l'application maître est en fait ce fichier.
A partir de ce point d'entrée, j'ai commencé à tracer doucement avec [F10], à la recherche
du nag screen " clé non valide " pour cerner ma zone de travail. (Les lignes qui suivent font
parties de la Version 1)
0177:00B98932 8BC6 MOV EAX,ESI
0177:00B98934 E85B31FFFF CALL 00B8BA94 > saisie des champs
0177:00B98939 5E POP ESI
0177:00B9893A 5B POP EBX
0177:00B9893B C3 RET
Vous verrez dans les lignes qui vont suivre que SoftIce et Wdasm ne donnent pas
les mêmes offsets
0177:00B9F502 E889A5FEFF CALL 00B89A90
0177:00B9F507 8B45F4 MOV EAX,[EBP-0C] > notre code
0177:00B9F50A 8D55FC LEA EDX,[EBP-04] > rien
0177:00B9F50D E8BA5FFDFF CALL 00B754CC > contrôle validité
0177:00B9F512 8B45FC MOV EAX,[EBP-04] > notre code
0177:00B9F515 E8763FFDFF CALL 00B73490 > calcul de la longueur
0177:00B9F51A 83F810 CMP EAX,10 > 16(d) caractères ?
0177:00B9F51D 741A JZ 00B9F539 > si oui, saute
0177:00B9F51F 6A00 PUSH 00
0177:00B9F521 668B0D50F6B900 MOV CX,[00B9F650] > charge "clé non valide"
0177:00B9F528 B201 MOV DL,01
0177:00B9F52A B85CF6B900 MOV EAX,00B9F65C
0177:00B9F52F E8CCC3FFFF CALL 00B9B900 > 1er nag screen
0177:00B9F534 E9D7000000 JMP 00B9F610
snips
0177:00B9F54C 83F808 CMP EAX,08
0177:00B9F54F 741A JZ 00B9F56B > vers code OK
0177:00B9F551 6A00 PUSH 00
0177:00B9F553 668B0D50F6B900 MOV CX,[00B9F650]
0177:00B9F55A B201 MOV DL,01
0177:00B9F55C B85CF6B900 MOV EAX,00B9F65C
0177:00B9F561 E89AC3FFFF CALL 00B9B900 > 2eme nag screen
snips
0177:00B9F59B 58 POP EAX
0177:00B9F59C E8FF3FFDFF CALL 00B735A0
0177:00B9F5A1 754F JNZ 00B9F5F2 > vers 3eme nag
snips
0177:00B9F5AE B874F6B900 MOV EAX,00B9F674
0177:00B9F5B3 E848C3FFFF CALL 00B9B900 > merci de vous être…
snips
0177:00B9F5DC B89CF6B900 MOV EAX,00B9F69C
0177:00B9F5E1 E87AD5FFFF CALL 00B9CB60
0177:00B9F5E6 C7050C18BA0001000000MOV DWORD PTR [00BA180C],00000001
0177:00B9F5F0 EB17 JMP 00B9F609 > Fin routine code OK
0177:00B9F5F2 6A00 PUSH 00
0177:00B9F5F4 668B0D50F6B900 MOV CX,[00B9F650]
0177:00B9F5FB B201 MOV DL,01
0177:00B9F5FD B85CF6B900 MOV EAX,00B9F65C
0177:00B9F602 E8F9C2FFFF CALL 00B9B900 > 3eme nag screen
0177:00B9F607 EB07 JMP 00B9F610
Ci dessus, vous avez trouvé un extrait de la routine de vérification
du sérial. Le premier contrôle concerne la validité des caractères entrés :
8A02 mov al , [edx] > 1 caractère du code entré dans al
3C61 cmp al, 61 > comparaison avec la valeur ascii de " a "
7206 jb 004054F9 > saute si inférieur
3C7A cmp al, 7A > comparaison avec " z "
7702 ja 004054F9 > saute si supérieur
Le second vérifie que le nombre de caractères entrés est égale
à 16 (ou 10 en hexadécimal), et continue, ou évite le premier écran " Clé
non valide ". Ensuite, chaque contrôle disposera de son call 00B9B900 -> nag screen.
En inversant le Zéro-Flag du JNZ 00B95F2, vous allez forcer l'apparition de l'écran " merci
de vous être enregistré ", et à la fin de cette routine, vous aurez un MOV DWORD PTR [00BA180C],00000001
qui ressemble beaucoup à un drapeau Utilisateur Enregistré. On y reviendra…
Après être sortie de SoftIce, allez faire un tour dans le menu " A propos ", vous y êtes
identifié comme Gentil Utilisateur. Après avoir quitté Photo d'Ecran, en relançant
l'application, vous retrouvez l'écran shareware du début. Bon !
Revenons au MOV DWORD PTR [00BA180C],00000001. C'est certainement lui le drapeau Utilisateur Reg/Unreg. Et au lancement
du programme, il doit y avoir, très en amont, un contrôle de ce statut, avant que Photo d'Ecran ne
choisisse de continuer vers le test de la Time Limit, et vers l'affichage de l'écran Shareware " Version
Non enregistrée ".
Si mon hypothèse est exacte, en posant un BPM 00BA180C, je devrais obtenir un break avant ce contrôle…
F5 pour sortir de SoftIce, Fermeture et Réouverture de Photo d'Ecran…
POP !
0177:00B9F1BB 33DB XOR EBX,EBX
0177:00B9F1BD 33C0 XOR EAX,EAX
0177:00B9F1BF A30C18BA00 MOV [00BA180C],EAX > le Flag
0177:00B9F1C4 8D45E4 LEA EAX,[EBP-1C]
0177:00B9F1C7 E8F8D6FFFF CALL 00B9C8C4
Un rapide coup d'œil dans la fenêtre des Registres, EAX = 0. Changeons les
données en forçant EAX à 1 (r eax = 1).
Bingo !
L'écran shareware apparaît, mais cette fois ci en indiquant " Version Enregistrée "
tout comme le menu " A propos " , mais plus de bouton " Enregistrer ".
Reste à faire la modification suivante :
0177:00B9F1BD 40 INC EAX > EAX = 1
0177:00B9F1BE 90 NOP > équilibrage du nb d'octets
0177:00B9F1BF A30C18BA00 MOV [00BA180C],EAX > Flag = 1
Et surtout à la trouver dans REGDLL.dll…
Et oui !, Hiew ne va pas trouver les mêmes adresses que celles que j'ai relevées dans SoftIce…
Qu'est ce qui sera toujours identique, si on ne prend pas en compte les offsets, les adresses mémoires…
?
0177:00B9F1BB 33DB XOR EBX,EBX > ça
0177:00B9F1BD 33C0 XOR EAX,EAX > ça
0177:00B9F1BF A30C18BA00 MOV [00BA180C],EAX > mais là...
Inutile de s'attendre à trouver une occurrence sur 00BA180C, par contre en
cherchant une chaîne du type 33DB33C0A30C, j'ai de forte chance, en contrôlant suffisamment d'octets,
de tomber dessus :
:0042F1BB 33DB xor ebx, ebx
:0042F1BD 33C0 xor eax, eax
:0042F1BF A30C184300 mov [0043180C], eax
:0042F1C4 8D45E4 lea eax, [ebp-1C]
:0042F1C7 E8F8D6FFFF call 0042C8C4
Et les adresses ne sont pas si différentes de cela, calculons :
BA180C - 43180C = 770000, un compte bien rond …
Contrôlez avec d'autres adresses, vous retrouverez la même valeur. Sur le principe ça ne vous
servira plus à grand chose, mais enfin…
Recherche et modifications faites dans Hiew, tout va fonctionner comme il faut.
Ca marche !
Pour " détourner " l'écran Shareware, il y a une autre possibilité pour que le programme
(semble) se transforme(r) en Full Version. Comme la modification ci dessus, il répond aux impératifs
de la Time Limit, et affiche " Version Enregistrée " dans l'écran " A Propos ".
C'est en relançant SoftIce après le premier Break sur BPM 00BA180C, que je suis tombé dessus
:
:0042FC06 E85904FFFF call 00420064
:0042FC0B 833D0C18430001 cmp dword ptr [0043180C], 00000001
:0042FC12 0F8437020000 je 0042FE4F
Je vous laisse le soin de faire l'opération, cette fois ci, pour trouver
la correspondance avec SoftIce.
En remplaçant 833D0C18430001 par 833D0C18430000, vous comparez [0043180C] (notre 00BA180C de softIce) avec
00, et le branchement suivant vous fais passer par dessus les routines " Contrôle de la Time Limit ",
et " Version Non Enregistrée ".
Par contre comme il y a 2 autres occurrences (en 0042FF6C, et 0042F454) sur ce CMP il y a de fortes probabilités
pour que ces comparaisons vous posent un problème si vous ne les modifiez pas également. Dans un
cas vous n'aurez que 2 octets à modifier, dans l'autre 3.
Reste que l'ex-écran shareware continue d'apparaître au lancement de l'application, et comme Photo.exe
est placé dans le menu démarrage de Windows, ça a un petit coté polluant…
Je doute que l'auteur du Soft ai voulu cela !
A l'aide de Hiew, j'ai refais une recherche sur mov dword [0043180C], 00000001, et j'en ai trouvé un second
en 0042F345. Ajouté à 770000, vous aurez l'adresse B9F356 pour SoftIce. En remontant de quelques
lignes vous verrez un joli saut conditionnel :
:00B9F340 E85B42FDFF call 00B735A0
:00B9F345 740D je 00B9F354 > saut conditionnel
:00B9F347 837DE001 cmp [ebp-20], 00000001
:00B9F34B 7513 jne 00B9F360
:00B9F34D E8260D0000 call 00BA0078
:00B9F352 EB0C jmp 00B9F360
:00B9F354 B301 mov bl, 01 > pour ici...
:00B9F356 C7050C18430001000000 mov dword ptr [00BA180C], 00000001
Pour la version 2, vous obtenez la correspondance en 00B9F2E5 pour 00B9F345
A l'aide d'un petit bpx B9F345, allons voir ce qu'il y a moyen de faire :
POP !
Bonne nouvelle, le point d'arrêt fonctionne
Remplacement du JE 0042F354 par un JMP, F5, et…
Cette fois ci, c'est le bon : plus d'écran Shareware au lancement, et l'écran " A propos "
indique " Version Enregistrée ". Good !
A tout fin utile, que peut il y avoir dans le call 004035A0 ?
Une routine de comparaison, mais qui ne doit pas être à l'usage unique du contrôle du sérial
(un bpx 4055A0 retourne trop de break…), donc mieux vaut y éviter des modifications !
Les Rushs
Je ne fais pas parti de ces privilégiés surdoués qui trouvent du premier coup l'endroit exacte
à patcher. Parfois je trouve la réponse rapidement, parfois non. A la lecture d'un essai comme celui
ci, on pourrait croire qu'il ne m'a fallu que quelques minutes pour cracker la cible.
En fait, je n'ai pas vu immédiatement le Flag Utilisateur Enregistré (l'inconvénient de SoftIce
et de sa petite fenêtre de codes), ça n'est qu'en y revenant, et en continuant à tracer après
l'inversion du Zéro-Flag que j'ai eu la réponse à ma question : Pourquoi la boite " A
propos " m'indiquait "Version Enregistrée " ?
Avant de mettre la main sur ce Drapeau, j'ai regardé du coté de la base de registres, de la Time
Limit, et dans le cas de cette dernière, j'avais trouvé une autre façon de rendre le Soft
éternel en jouant sur la date.
La Time Limit
En posant un BPX GetLocalTime, vous allez revenir à REGDLL (en appuyant sur [F12]) :
* Reference To: kernel32.GetLocalTime, Ord:0000h |
:00B76354 E85FE3FFFF Call KERNEL 32 !GetLocalTime
:00B76359 668B4C240E mov cx, [esp + 0E] > jour = 28
:00B7635E 668B54240A mov dx, [esp + 0A] > mois = 9
:00B76363 668B442408 mov ax, [esp + 08] > année = 1999
Avancez d'un jour votre date, et vous ferrez la valeur de CX se modifier. Il y a
donc moyen de forcer la Time Limit a toujours se croire au premier jour de son installation en faisant :
:00B76354 E85FE3FFFF Call KERNEL 32 !GetLocalTime
:00B76359 66B91E00 mov cx, 1C > 28 hexa
:00B7635D 90 nop
:00B7635E 66BA0900 mov dx, 09 > 9 hexa
:00B76362 90 nop
:00B76363 66B8CF07 mov ax, 07C > 1999 hexa
:00B76367 90 nop
Par contre si il y a des fonctions limitées dans la version shareware, vous
ne les lèverez pas, et l'écran Shareware continuera à indiquer " version Non Enregistrée
"
Pour ne pas s'arrêter en si bon chemin, il y a d'autres endroits où vous pourrez jouer avec la date
:
:0042FDB9 770D ja 0042FDC8
:0042FDBB 8B45EC mov eax, [ebp-14] > 19991027 > réfléchissez !
:0042FDBE 8B55F8 mov edx, [ebp-08] > 19991028 > idem
:0042FDC1 E8DA37FDFF call 004035A0 > comparaison
:0042FDC6 7371 jnb 0042FE39 > branchement si non inférieur
Et si la date du jour [ebp-08] est inférieur à la date d'installation
+30 - 1 jour [ebp-14] ?
C'est que vous avez reculé votre horloge, et vous aurez le droit à une inscription dans la base de
registres, du genre de celle qui force ensuite un affichage " Période d'essai terminée "
en
[HKEY_CURRENT_USER\Software\Mlog\Photo\1.0] dans la ligne d2.
Par contre, en remettant votre horloge à l'heure, le programme reviendra à la normale, et corrigera
de lui même la valeur de la ligne d2 dans la base de registres.
En mettant
:0042FDBB 8B45EC mov eax, [ebp-14]
:0042FDBE 8B55EC mov edx, [ebp-14] > EC à la place de F8
Vous corrigerez ce " défaut " !
Comment sont ensuite utilisées ces informations ?
:0042FDAE 8B45F0 mov eax, [ebp-10] > date du jour
:0042FDB1 8B55F8 mov edx, [ebp-08] > date install +30
:0042FDB4 E8E737FDFF call 004035A0 > comparaison
:0042FDB9 770D ja 0042FDC8 > saut si supérieur
Je pense que c'est assez parlant, non ?
Et en fonction du saut si supérieur, vous aurez droit à un message " Période d'essai
terminée ".
:0042FD59 8B45F0 mov eax, [ebp-10] > date du jour
:0042FD5C 8B55F8 mov edx, [ebp-08] > date install +30
:0042FD5F E83C38FDFF call 004035A0 > comparaison -1
:0042FD64 7529 jne 0042FD8F
Ici, la comparaison va se faire sur date du jour et la date du jour d'installation
+29. Si la comparaison est exacte, le message qui s'affichera sera " Dernier jour d'essai ".
Dans ces deux cas, il y a encore moyen de jouer avec les dates et faire croire à Photo d'Ecran ce qui n'est
pas…
Patchage à partir de Photo.exe
Pour faire plus sport, et parce que ça faisait parti de l'exercice, j'ai essayé de patcher REGDLL
à partir de Photo.exe.
En Vain pour la première version !
De toutes les adresses que j'avais trouvées, et qui pourraient permettre " d'améliorer "
la protection, seule la routine de saisie de la date ne se décompressait pas APRES l'arrivée dans
REGDLL.dll. Partant de là, je n'ai pas vu comment réussir à patcher une adresse à partir
de l'exécutable ALORS QU'ELLE N'EXISTAIT PAS ENCORE…
Photo.exe dans la deuxième version est le MEME exécutable que dans la première (pour autant
que je n'en sois rendu compte), seul le point d'entrée sera différent, les adresses restant identiques.
En traçant avec F10, j'avais mis la main sur le call qui faisait la bascule entre l'exécutable et
la DLL :
004026C6 CALL [USER32 !RegisterHotKey]
004026CC CALL [0040D618]
En faisant un d 40D618, j'ai obtenu BA085CB8 pour la 1er version et BA07FC pour
la deuxième, soit l'entry point de REGDLL. Comme cette valeur n'est pas arrivée par hasard dans [0040D618],
j'ai posé ensuite un BPM 40D618, pour arriver ici :
0137:00401FD7 8B35E0F24000 MOV ESI,[KERNEL32!GetProcAddress]
0137:00401FDD 68ACA14000 PUSH 0040A1AC
0137:00401FE2 50 PUSH EAX
0137:00401FE3 FFD6 CALL ESI
0137:00401FE5 85C0 TEST EAX,EAX
0137:00401FE7 A318D64000 MOV [0040D618],EAX > POP !
0137:00401FEC 7502 JNZ 00401FF0
0137:00401FEE 5E POP ESI
0137:00401FEF C3 RET
0137:00401FF0 A1B8D54000 MOV EAX,[0040D5B8]
Dans le Call ESI, eax va prendre la valeur BA07FC. A bien y réfléchir,
on devrait pouvoir récupérer un vingtaine d'octets dans ces parages… (de 00401FDD à 00401FEF,
puisque le JNZ en 00401FEC saute toujours en 00401FF0).
Et comme à ce niveau du programme, vous êtes tout prés de la sortie vers REGDLL, que Photo.exe
est décompressé, il devrait y avoir moyen d'y placer un patch, non ?
Bon ! mais ce patch, il va falloir l'écrire à partir d'une section non compressée de l'exécutable…
Commençons par chercher une zone de ce genre à l'aide de Hiew.
En scrollant à partir du début du listing donné par l'hexéditeur, j'ai recherché
les premiers symptômes d'une compression: des 00 00 00 ou des tripotés de ADD, ou d'un fin de compression
du genre POPAD:
:004125CF 61 popad
:004125D0 669D popf
:004125D2 E9F904FFFF jmp 00402AD0 > fin de la zone compressée
snips
0137:004125E9 0100 ADD [EAX],EAX
0137:004125EB 000C0F ADD [ECX+EDI],CL
0137:004125EE 0100 ADD [EAX],EAX
Partant de l'idée que la routine de décompression se trouvait au dessus,
j'ai cherché une zone qui semblait " clean " :
0137:0041255A 754B JNZ 004125A7 (JUMP)
0137:0041255C 3986E8B50000 CMP [ESI+0000B5E8],EAX
snips
0137:004125A4 017D0C ADD [EBP+0C],EDI
0137:004125A7 8B4510 MOV EAX,[EBP+10]
Et il m'a semblé qu'ici j'avais largement la place pour " m'exprimer
"…
En 0041255A le JNZ 004125A7 saute TOUJOURS, donc la place comprise entre 0041255A et 004125A7 va être déclarée
Disponible !
Bien ! A partir de cette section (et après contrôle de son accessibilité dans Hiew), je devrais
pouvoir disposer de 2 options :
1- Patcher la zone de 19 octets en 00401FDD, et pour y libérer de la place, et pour y écrire une
modification de REGDLL
2- Et en cas de manque de place, patcher à l'adresse 00401FDD pour obliger le programme à revenir
en 0041255A modifier REGDLL, avant de continuer sa route.
Voilà ce que ça donne :
01:00412557 39450C CMP [EBP+0C],EAX
02:0041255A 803DDD1F400068 CMP BYTE PTR [00401FDD],68
03:00412561 7544 JNZ 004125A7
04:00412563 C705DD1F4000C70518D6MOV DWORD PTR [00401FDD],D61805C7
05:0041256D C705E11F40004000FC07MOV DWORD PTR [00401FE1],07FC0040
06:00412577 C705E51F4000BA00C605MOV DWORD PTR [00401FE5],05C600BA
07:00412581 C705E91F4000E5F2B900MOV DWORD PTR [00401FE9],00B9F2E5
08:0041258B 66C705ED1F4000EB40 MOV WORD PTR [00401FED],40EB
09:00412594 C605EF1F400048 MOV BYTE PTR [00401FEF],48
10:0041259B EB0A JMP 004125A7
11:0041259D 90 NOP
12:0041259E 017DFC ADD [EBP-04],EDI
12:004125A1 83C40C ADD ESP,0C
- Je commence à modifier en ligne 2 : La zone 00401FDD est elle décompressée
? (test de la valeur 68 qui est sensée s'y trouver après décompression).
- Saut en 00412A5A7 si ça n'est pas le cas.
- Sinon, je crée un [0040D618] <- 00BA07FC pour placer l'Entry Point de REGDLL dans EAX.
- Ensuite j'ai remplacé le 74 (JE) par un EB (JMP) en B9F2E5 dans REGDLL
- Puis un INC EAX DEC EAX (opération nulle qui ne modifie pas l'état des registres) pour compléter
les deux octets restant et rééquilibrer les codes
- Finalement, le Jmp 004125A7 va reprendre le cours normal des choses.
Voici l'aspect (en couleur )que prend la modification en 00401FDD, zone fraîchement décompressée
:
0177:00401FD7 8B35E0F24000 MOV ESI,[KERNEL32!GetProcAddress]
0177:00401FDD C70518D64000FC07BA00MOV DWORD PTR [0040D618],00BA07FC
0177:00401FE7 C605E5F2B900EB MOV BYTE PTR [00B9F2E5],EB
0177:00401FEE 40 INC EAX
0177:00401FEF 48 DEC EAX
0177:00401FF0 A1B8D54000 MOV EAX,[0040D5B8]
Pour les adeptes de listing Wdasm avec références, il y a moyen d'en
obtenir un:
1- Réaliser un dump à l'aide de SoftIce et de ProcDump:
On a vu que Photo.exe passait la main à Regdll.dll en 004026CC Call [0040D618].
Donc à partir de cette adresse, je vais vous proposer de réaliser une copie-mémoire de photo.exe.
Au break en 004026CC, changez le call en JMP EIP. Vous allez obliger le programme à boucler sur lui même,
et stopper toute activité de l'application, par contre elle sera présente en mémoire...
Sournoisement, profitez en pour lancer ProcDump, cliquez sur [Options], et choisisez dans le menu proposé
"Rebuilt Import Table". Puis vous sélectionnerez "Photo.exe" dans la fenêtre des
applications actives de ProcDump, par un clic_droit, et enfin vous opterez pour "Dump (Full)".
Quand ProcDump aura fini son boulot, il vous proposera de sauvegarder un bel exécutable (de 114 ko) tout
neuf, désassemblable à souhait, avec références et ressources (mais elles ne m'ont
pas parues très intéressantes...)
Seul (petit) inconvénient, cet exécutable plante au lancement… On ne peut pas tout avoir!
Pour ceux d'entres vous qui s'en chagrinerai, il y a encore une solution:
2- Réaliser un Script qui automatiserait la copie mémoire.
ProcDump est décidément un outils fabuleux, dés que l'on sait s'en servir un peu…
Si dans notre précédent Dump, l'exécutable plantait, c'est entre autre parce qu'il n'appréciait
pas le JMP EIP. Or cette partie de Photo.exe étant compressée, il faudrait lancer la copie mémoire
dés la fin de la décompression, et à partir d'une zone "clean".
Si vous vous en rappelez, nous avions déjà pointé une telle adresse:
:004125CF 61 popad
:004125D0 669D popf
:004125D2 E9F904FFFF jmp 00402AD0 > fin de la décompression
A partir de 00402AD0, vous n'aurez plus la possibilité de trouver des occurrences
avec votre éditeur hexadécimal sur les codes relevés dans SoftIce. C'est ici que l'on va intervenir,
et voici le Script que je vous propose:
[Photo 1.0]
L1=LOOK 61,66,9D > recherche la chaîne POPAD POPF
L2=BP > pose un breakpoint (comme dans SI)
L3=STEP > commence l'analyse du programme
OPTL1=00000000
OPTL2=01000101
OPTL3=01010001
OPTL4=00030000
OPTL5=00000000
Sans oublier de rajouter le nom de votre bidouille dans l'index du fichier Script.ini
de ProcDump
[Index]
P1E=Photo 1.0
Que reste-t-il à faire?
Lancez ProcDump, sélectionnez Photo 1.0 dans la liste, puis Photo.exe, patientez un peu, et vous aurez un
exemplaire de plus, de 110 ko, désassemblable (comme il faut SVP), exécutable, et patchable directement
aux adresses 00401FDD/00401FEF, comme vu précedement.
0177:00401FD7 8B35E0F24000 MOV ESI,[KERNEL32!GetProcAddress]
0177:00401FDD C70518D64000FC07BA00MOV DWORD PTR [0040D618],00BA07FC > restore EAX
0177:00401FE7 C605E5F2B900EB MOV BYTE PTR [00B9F2E5],EB > patch REGDLL
0177:00401FEE 40 INC EAX > équilibre
0177:00401FEF 48 DEC EAX
0177:00401FF0 A1B8D54000 MOV EAX,[0040D5B8]
|