Transformation du Notepad de Windows en Shareware |
Avancé | |
|
||
fra_00xx 021122 Anubis 0001 AD PC | Your wonderful work has influenced an army of Reversers all around the world. None of us has not spend hours and nights reading all the essays published in your fortress to enter this magic world of the Reverse Engineering. The reverse engineering has now become the Reverse Engineering, an Art! I would like to personally thank you as well as all the "first hour" Reversers (too much of them to give names, I would miss some ;) who have open and shown the way to light. We miss you Fravia. As I have seen by great Reversers, there is sometimes a moment where one thinks "I have no longer fun or energy for it..." and so did I think and do too. But I am always coming back, and it would be really great if by a cold winter day the Legend were back ;) | |
fc 1.exe 2.exe > ici.txt...et on a le résultat dans le fichier ici.txt, automatiquement créé:
Comparaison des fichiers 1.exe et 2.exe 0000A000: 00 03 0000A01E: 00 03On voit donc que pour griser et désactiver un menu, on doit passer 00 en 03 à l'endroit qui convient (résultat à regarder en parallèle sous l'éditeur hexa).
//******************** Program Entry Point ******** :004010CC 55 push ebp :004010CD 8BEC mov ebp, esp :004010CF 83EC44 sub esp, 00000044 :004010D2 56 push esimodifié en :
//******************** Program Entry Point ******** :004010CC E97FC90000 jmp 0040DA50 :004010D1 90 nop :004010D2 56 push esiA la fin du programme, on copie les instructions que l'on a écrasé en mettant le jump au PEP, puis on code directement l'API pour tester la présence du fichier "sharepad.key". L'API choisie est "_lopen". Elle se trouve dans la DLL kernel32.dll et ne possède que deux paramètres à passer. Bien que maintenant obsolète, elle rend encore de fiers services et est très courte à coder. Ceci simplifie beaucoup la tache comparé à "CreateFileA" par exemple (regardez cette API dans le win32hlp).
HFILE _lopen( LPCSTR lpPathName, // pointer to name of file to open int iReadWrite // file access mode );avec pour file access mode :
Value Meaning Code OF_READ Opens the file for reading only 01 OF_READWRITE Opens the file for reading and writing 02 OF_WRITE Opens the file for writing only 03Ici, on va choisir le PathName "C:\sharepad.key" car tout le monde a ce répertoire sur son disque dur, et on va prendre un file access mode en READWRITE, soit une valeur de 2. On peut bien sûr mettre le fichier sharepad.key dans le même répertoire que l'exe. A ce moment là, il faudra changer la chaîne "C:\sharepad.key" ci-dessous en ".\sharepad.key". Je n'ai pas mis la clé dans le même répertoire que l'exe, juste pour montrer que l'on pouvait mettre la clé n'importe où et notamment dans un répertoire système.
0000D9F0 433A 5C73 6861 7265 7061 642E 6B65 7900 C:\sharepad.key. 0000DA00 0000 0000 0000 0000 0000 0000 0000 0000 ................ .0040DA56: 6A02 push 002 <- 1er paramètre de l'API .0040DA58: 68F0D94000 push 00040D9F0 <- 2eme paramètre de l'API .0040DA5D: FF1560634000 call _lopen <- Appel de l'APIComment faire pour trouver le code hexa d'une API? Comment appeler une API? La méthode que j'utilise est de faire une recherche de l'API sous Wdasm dans les Imported Functions. Si vous double-cliquez sur le nom de l'API dont vous avez besoin, vous tomberez toujours sur le même code hexa (sauf pour la dernière occurrence, tout en bas du listing, mais c'est une autre histoire). Donc si on double-clique sur _lopen (et pas lopen qui n'y est pas), on tombera toujours sur le même code hexa (le FF1560634000). Bon en fait, il n'y a qu'une seule occurrence de _lopen, mais ça ne change rien à ce que je viens de dire. Cette valeur hexadécimale contient un paramètre dword qui est propre à l'API et qui correspond à son adresse. Ainsi, à n'importe quel endroit du programme on pourra appeler cette API en faisant "call < dword >". C'est à dire en utilisant la séquence FF1560634000 pour l'API _lopen.
DWORD GetLastError(VOID)Ensuite, on teste la valeur de eax (test eax, eax), puis on saute sur la MSGBOX1 (jne MSGBOX1) si eax n'est pas nulle, ou bien on saute sur la partie PATCH (jmp PATCH) pour repasser le sharepad en notepad si eax est nulle. On obtient au final pour la partie TESTKEY@PEP ceci:
.0040DA50: 55 push ebp |Instructions écrasées .0040DA51: 8BEC mov ebp,esp |par le jump au PEP .0040DA53: 83EC44 sub esp,044 | .0040DA56: 6A02 push 002 <- 1er paramètre de l'API .0040DA58: 68F0D94000 push 00040D9F0 <- 2eme paramètre de l'API .0040DA5D: FF1560634000 call _lopen <- Appel de l'API .0040DA63: FF15C8634000 call GetLastError <- Traitement du message renvoyé .0040DA69: 85C0 test eax,eax <- "sharepad.key" présent? .0040DA6B: 7543 jne .00040DAB0 <- non, on va à MSGBOX1@TEST .0040DA6D: E9BE000000 jmp .00040DB30 <- oui, on va à PATCH@TESTComment sélectionner une API convenable pour ce que l'on veut faire? C'est très simple, il y a deux critères à respecter. Le premier est que l'API puisse nous dire si le fichier "sharepad.key" se trouve bien en C:\ (j'ai choisi ce répertoire par défaut car tout le monde a ce répertoire sur son disque dur!). Donc on aura intérêt à choisir des APIs du style CreateFileA, _lopen, FindFirstFile, GetFileAttribute... c'est à dire en rapport avec des fichiers. Le deuxième critère est que l'API choisie se trouve bien dans la IAT du notepad, sans quoi on doit coder son appel et cela rend la tache plus complexe (Note: on fera cela dans la deuxième partie de ce tutorial, mais pas ici, car on veut du codage simple, rapide et efficace). Pour savoir cela, il suffit de regarder dans les Imported Functions sous Wdasm et de choisir les APIs qui vont bien.
0000D9F0 433A 5C73 6861 7265 7061 642E 6B65 7900 C:\sharepad.key. 0000DA00 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DA10 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DA20 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DA30 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DA40 5445 5354 4B45 5940 5045 5000 0000 0000 TESTKEY@PEP..... <-- Titre de la partie. N'intervient pas dans le code. 0000DA50 558B EC83 EC44 6A02 68F0 D940 00FF 1560 U....Dj.h..@...` 0000DA60 6340 00FF 15C8 6340 0085 C075 43E9 BE00 c@....c@...uC... 0000DA70 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DA80 0000 0000 0000 0000 0000 0000 0000 0000 ................Note : On va rentrer plusieurs chaînes dans l'éditeur hexa (pour les MSGBOXs). Il est fortement conseillé de laisser une ligne vide entre chaque chaîne de caractères pour des raisons de lisibilité et de buffer dans la gestion des APIs (bien que ce ne soit pas une obligation, seul le byte 00 en fin de chaîne est important pour la terminer).
0000D990 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D9A0 5348 4152 4557 4152 4521 2121 0000 0000 SHAREWARE!!!.... <-- Titre 0000D9B0 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D9C0 5665 7569 6C6C 657A 2076 6F75 7320 656E Veuillez vous en <-- Message 0000D9D0 7265 6769 7374 7265 722E 0000 0000 0000 registrer....... 0000D9E0 0000 0000 0000 0000 0000 0000 0000 0000 ................ [...] 0000DA90 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DAA0 4D53 4742 4F58 3140 5445 5354 0000 0000 MSGBOX1@TEST.... <-- Titre de la partie. N'intervient pas dans le code. 0000DAB0 6A00 68A0 D940 0068 C0D9 4000 6A00 FF15 j.h..@.h..@.j... 0000DAC0 A864 4000 E909 36FF FF00 0000 0000 0000 .d@...6......... 0000DAD0 0000 0000 0000 0000 0000 0000 0000 0000 ................Ce qui donne en asm:
.0040DAB0: 6A00 push 000 .0040DAB2: 68A0D94000 push 00040D9A0 <-- Titre .0040DAB7: 68C0D94000 push 00040D9C0 <-- Message .0040DABC: 6A00 push 000 .0040DABE: FF15A8644000 call MessageBoxA .0040DAC4: E90936FFFF jmp .0004010D2 <-- Retour au PEP après le(s) 90.
0000DB20 5041 5443 4840 5445 5354 0000 0000 0000 PATCH@TEST...... 0000DB30 6A00 68A0 D940 0068 A0D9 4000 6A00 FF15 j.h..@.h..@.j... 0000DB40 A864 4000 E989 35FF FF00 0000 0000 0000 .d@...5......... 0000DB50 0000 0000 0000 0000 0000 0000 0000 0000 ................Soit en asm:
.0040DB30: 6A00 push 000 .0040DB32: 68A0D94000 push 00040D9A0 <-- Titre .0040DB37: 68A0D94000 push 00040D9A0 <-- Message (=Titre) .0040DB3C: 6A00 push 000 .0040DB3E: FF15A8644000 call MessageBoxA .0040DB44: E98935FFFF jmp .0004010D2 <-- Retour au PEP après le(s) 90.Quel est l'intérêt? Et bien dès maintenant, on peut déjà tester notre système de shareware!!!
Sans le fichier "sharepad.key" dans C:\, on a: |
Avec le fichier "sharepad.key" dans C:\, on a: |
|
|
|
* Reference To : KERNEL32.ExitProcess, Ord: 007Fh | :00401143 FF1598634000 Call dword ptr [00406398] :00401149 8BC6 mov eax, esi :0040114B 5E pop esi :0040114C 8BE5 mov esp, ebp :0040114E 5D pop ebp :0040114F C3 ret...que l'on transforme en:
:00401143 E9A8C90000 jmp 0040DAF0 :00401148 90 nop :00401149 8BC6 mov eax, esi :0040114B 5E pop esi :0040114C 8BE5 mov esp, ebp :0040114E 5D pop ebp :0040114F C3 retEt en DAF0, on code la MSGBOX2:
0000D940 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D950 4E27 6F75 626C 6965 7A20 7061 7320 6465 N'oubliez pas de <-- Message 0000D960 2076 6F75 7320 656E 7265 6769 7374 7265 vous enregistre 0000D970 722E 2043 6F6E 7375 6C74 657A 206C 6520 r. Consultez le 0000D980 6669 6368 6965 7220 7265 672E 7478 742E fichier reg.txt. 0000D990 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D9A0 5348 4152 4557 4152 4521 2121 0000 0000 SHAREWARE!!!.... <-- Titre 0000D9B0 0000 0000 0000 0000 0000 0000 0000 0000 ................ [...] 0000DAD0 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DAE0 4D53 4742 4F58 3240 4558 4954 0000 0000 MSGBOX2@EXIT.... <-- Titre de la partie. N'intervient pas dans le code. 0000DAF0 6A00 68A0 D940 0068 50D9 4000 6A00 FF15 j.h..@.hP.@.j... 0000DB00 A864 4000 FF15 9863 4000 8BC6 E938 36FF .d@....c@....86. 0000DB10 FF00 0000 0000 0000 0000 0000 0000 0000 ................Soit en asm:
.0040DAF0: 6A00 push 000 |Paramètres de la messagebox .0040DAF2: 68A0D94000 push 00040D9A0 | .0040DAF7: 6850D94000 push 00040D950 | .0040DAFC: 6A00 push 000 | .0040DAFE: FF15A8644000 call MessageBoxA <-- API .0040DB04: FF1598634000 call ExitProcess |Instructions écrasées par le jump au .0040DB0A: 8BC6 mov eax,esi |ExitProcess original .0040DB0C: E93836FFFF jmp .000401149 <-- Retour au EXITPROC après le(s) 90.
000010C0 2532 2E32 6400 0000 0D0A 0000 E97F C900 %2.2d........... 000010D0 0090 56FF 15E0 6340 008B F08A 003C 2275 ..V...c@.....<"u [...]A l'EXITPROCESS:
00001140 508B F0E9 A8C9 0000 908B C65E 8BE5 5DC3 P..........^..]. [...]Après la fin de la section .reloc:
0000D940 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D950 4E27 6F75 626C 6965 7A20 7061 7320 6465 N'oubliez pas de 0000D960 2076 6F75 7320 656E 7265 6769 7374 7265 vous enregistre 0000D970 722E 2043 6F6E 7375 6C74 657A 206C 6520 r. Consultez le 0000D980 6669 6368 6965 7220 7265 672E 7478 742E fichier reg.txt. 0000D990 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D9A0 5348 4152 4557 4152 4521 2121 0000 0000 SHAREWARE!!!.... 0000D9B0 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D9C0 5665 7569 6C6C 657A 2076 6F75 7320 656E Veuillez vous en 0000D9D0 7265 6769 7374 7265 722E 0000 0000 0000 registrer....... 0000D9E0 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D9F0 433A 5C73 6861 7265 7061 642E 6B65 7900 C:\sharepad.key. 0000DA00 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DA10 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DA20 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DA30 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DA40 5445 5354 4B45 5940 5045 5000 0000 0000 TESTKEY@PEP..... 0000DA50 558B EC83 EC44 6A02 9090 9068 F0D9 4000 U....Dj....h..@. 0000DA60 FF15 6063 4000 FF15 C863 4000 85C0 0F85 ..`c@....c@..... 0000DA70 3C00 0000 E9B7 0000 0000 0000 0000 0000 <............... 0000DA80 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DA90 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DAA0 4D53 4742 4F58 3140 5445 5354 0000 0000 MSGBOX1@TEST.... 0000DAB0 6A00 68A0 D940 0068 C0D9 4000 6A00 FF15 j.h..@.h..@.j... 0000DAC0 A864 4000 E909 36FF FF00 0000 0000 0000 .d@...6......... 0000DAD0 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DAE0 4D53 4742 4F58 3240 4558 4954 0000 0000 MSGBOX2@EXIT.... 0000DAF0 6A00 68A0 D940 0068 50D9 4000 6A00 FF15 j.h..@.hP.@.j... 0000DB00 A864 4000 FF15 9863 4000 8BC6 E938 36FF .d@....c@....86. 0000DB10 FF00 0000 0000 0000 0000 0000 0000 0000 ................ 0000DB20 5041 5443 4840 5445 5354 0000 0000 0000 PATCH@TEST...... 0000DB30 6A00 68A0 D940 0068 A0D9 4000 6A00 FF15 j.h..@.h..@.j... 0000DB40 A864 4000 E989 35FF FF00 0000 0000 0000 .d@...5......... 0000DB50 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DB60 0000 0000 0000 0000 0000 0000 0000 0000 ................Maintenant, on va mettre au point la neutralisation des éléments shareware lorsque le fichier "sharepad.key" est dans C:\.
FF15A8644000 call MessageBoxA...devient...:
9015A8644000 call MessageBoxA...et plus de msgbox! En asm, cela s'écrit:
.0040DB30: B890000000 mov eax,000000090 <-- met 00000090 dans eax .0040DB35: A2FEDA4000 mov [00040DAFE],al <-- change le byte à l'adresse DAFE en 90* Activation des 2 menus:
Comparaison des fichiers 1.exe et 2.exe 0000A000: 00 03 0000A01E: 00 03... mais en faisant nous l'inverse, on met 00 à la place de 03 (et on efface ici le code de la msgbox qui affichait le même titre et message):
.0040DB3A: B800000000 mov eax,000000000 <-- met 00000000 dans eax .0040DB3F: A200A04000 mov [00040A000],al <-- change le byte à l'adresse A000 en 00 .0040DB44: A21EA04000 mov [00040A01E],al <-- change le byte à l'adresse A01E en 00* Remplacement du mot "SHAREWARE":
.0040DB49: B842006C00 mov eax,0006C0042 ;" l B" .0040DB4E: A35CAB4000 mov [00040AB5C],eax .0040DB53: B86F006300 mov eax,00063006F ;" c o" .0040DB58: A360AB4000 mov [00040AB60],eax .0040DB5D: B82D006E00 mov eax,0006E002D ;" n -" .0040DB62: A364AB4000 mov [00040AB64],eax .0040DB67: B86F007400 mov eax,00074006F ;" t o" .0040DB6C: A368AB4000 mov [00040AB68],eax .0040DB71: B865007300 mov eax,000730065 ;" s e" .0040DB76: A36CAB4000 mov [00040AB6C],eax .0040DB7B: E95235FFFF jmp .0004010D2 -------- (1)...suivi du dernier jump qui se rebranche sur le PEP après le(s) 90. On obtient au final pour PATCH@TEST:
0000DB20 5041 5443 4840 5445 5354 0000 0000 0000 PATCH@TEST...... 0000DB30 B890 0000 00A2 FEDA 4000 B800 0000 00A2 ........@....... 0000DB40 00A0 4000 A21E A040 00B8 4200 6C00 A35C ..@....@..B.l..\ 0000DB50 AB40 00B8 6F00 6300 A360 AB40 00B8 2D00 .@..o.c..`.@..-. 0000DB60 6E00 A364 AB40 00B8 6F00 7400 A368 AB40 n..d.@..o.t..h.@ 0000DB70 00B8 6500 7300 A36C AB40 00E9 5235 FFFF ..e.s..l.@..R5.. 0000DB80 0000 0000 0000 0000 0000 0000 0000 0000 ................Mais ce n'est pas tout!!!
Name Virtual Size Virtual Offset Raw Size Raw Offset Characteristics .text 00003E9C 00001000 00004000 00001000 60000020 .data 0000084C 00005000 00001000 00005000 C0000040 .idata 00000DE8 00006000 00001000 00006000 40000040 .rsrc 00006000 00007000 00006000 00007000 40000040 .reloc 00000A9C 0000D000 00001000 0000D000 42000040On voit que les sections .rsrc et .reloc sont en lecture seulement (0x40000000). On va les mettre en lecture + écriture :
.rsrc 00006000 00007000 00006000 00007000 C0000040 .reloc 00000A9C 0000D000 00001000 0000D000 C2000040Voilà!!! Le notepad est maintenant un shareware et s'appelle un sharepad! La clé d'activation est le fichier "sharepad.key" qu'il faut mettre dans le répertoire C:\. On aura bien sûr reçu cette clé en consultant le fichier "reg.txt" fourni avec le sharepad et donnant toutes les modalités pour recevoir la clé d'activation (à savoir, envoyer des $$$$$$$ et des ££££££££ mais aussi des €€€€€€€€€€€).
.0040DA5B: 68F0D94000 push 00040D9F0 .0040DA60: FF1560634000 call _lopen .0040DA66: FF15C8634000 call GetLastError .0040DA6C: 85C0 test eax,eax .0040DA6E: 0F853C000000 jne .00040DAB0 <- inversion ici en 0F843C000000 .0040DA74: E9B7000000 jmp .00040DB30Un petit conseil, ne laissez pas la clé dans C:\, sinon vous vous retrouvez avec une version crackée qui est ... du shareware :o) ou alors, noppez carrément tout le saut avec 909090909090.
* Possible Ref to Menu: MenuID_0001, Item : "Couper Ctrl+X" | :00401288 3D00030000 cmp eax, 00000300 :0040128D 7C21 jl 004012B0 ; on saute ici * Possible Ref to Menu: MenuID_0001, Item : "Copier Ctrl+C" | :0040128F 3D01030000 cmp eax, 00000301 :00401294 0F8E3E040000 jle 004016D8 ; on saute ici * Possible Ref to Menu: MenuID_0001, Item : "Coller Ctrl+V" | :0040129A 3D02030000 cmp eax, 00000302 ; branchement pour notre menu :0040129F 0F8456040000 je 004016FBDonc on choisira une ID au dessus de 310. On prendra par exemple à partir de 350 (848 en décimal). En général, un rapide coup d'oeil sous un éditeur de ressources donne une idée d'où s'arrêtent les IDs.
1664 DIALOG 6, 15, 180, 75 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Enregistrement" FONT 8, "MS Sans Serif" { EDITTEXT, 900, 44,10,119,14,WS_BORDER EDITTEXT, 901, 44,30,119,14,WS_BORDER LTEXT "Nom:",902,18,12,16,14 LTEXT "Code:",903,18,32,18,14 DEFPUSHBUTTON "Valider", 904, 44, 56, 50, 14 PUSHBUTTON "Annuler", 905, 113, 56, 50, 14 }Et du menu:
POPUP "E&nregistrement" { MENUITEM "Enregis&trement...\tCtrl+T", 910 MENUITEM SEPARATOR MENUITEM "À &propos du Sharepad", 911 }Et du raccourci clavier (Ctrl+T):
1 ACCELERATORS { VK_INSERT, 769, VIRTKEY, CONTROL VK_F1, 5, VIRTKEY VK_F3, 8, VIRTKEY VK_F5, 12, VIRTKEY VK_BACK, 25, VIRTKEY, ALT "^Z", 25, ASCII "^T", 950, ASCII "^X", 768, ASCII "^C", 769, ASCII "^V", 770, ASCII }--------------------------------
2 ACCELERATORS { VK_INSERT, 769, VIRTKEY, CONTROL VK_F1, 5, VIRTKEY VK_F3, 8, VIRTKEY VK_F5, 12, VIRTKEY VK_BACK, 25, VIRTKEY, ALT "^Z", 25, ASCII "^T", 950, ASCII "^X", 768, ASCII "^C", 769, ASCII "^V", 770, ASCII VK_ESCAPE, 28, VIRTKEY "C", 28, VIRTKEY, CONTROL "D", 28, VIRTKEY, CONTROL "Z", 28, VIRTKEY, CONTROL }On ajoute donc un boite d'enregistrement avec deux champs EDIT ("Nom:" et "Code:", resp. IDs 900 et 901), ainsi que deux boutons ("Valider" et "Annuler", resp. IDs 904 et 905). Quant au menu, on insère entre "&Recherche" et "&?" un menu "E&nregistrement" qui contient deux sous-menus ("Enregis&trement...\tCtrl+T" et "À &propos du Sharepad", resp. IDs 910 et 911). Tout ceci se fait entièrement sous Borland Ressources Workshop. Aucun autre programme n'est utilisé pour traiter et insérer ces ressources.
Name Virtual Size Virtual Offset Raw Size Raw Offset Characteristics .text 00003E9C 00001000 00004000 00001000 60000020 .data 0000084C 00005000 00001000 00005000 C0000040 .idata 00000DE8 00006000 00001000 00006000 40000040 .rsrc 00006000 00007000 00006000 00007000 40000040 .reloc 00000A9C 0000D000 00001000 0000D000 42000040Après la compilation des ressources:
Name Virtual Size Virtual Offset Raw Size Raw Offset Characteristics .text 00003E9C 00001000 00004000 00001000 60000020 .data 0000084C 00005000 00001000 00005000 C0000040 .idata 00000DE8 00006000 00001000 00006000 40000040 .reloc 00000A9C 00007000 00001000 00007000 42000040 .rsrc 00006000 00008000 00006000 00008000 40000040La taille des sections n'a pas bougé, .rsrc et .reloc ont été inversé lors de la recompilation. C'est l'éditeur de ressources qui a fait ça... Ca ne nous pose aucun problème.
* Possible Ref to Menu: MenuID_0001, Item : "Couper Ctrl+X" | :00401288 3D00030000 cmp eax, 00000300 :0040128D 7C21 jl 004012B0 * Possible Ref to Menu: MenuID_0001, Item : "Copier Ctrl+C" | :0040128F 3D01030000 cmp eax, 00000301 :00401294 0F8E3E040000 jle 004016D8 * Possible Ref to Menu: MenuID_0001, Item : "Coller Ctrl+V" | :0040129A 3D02030000 cmp eax, 00000302 :0040129F 0F8456040000 je 004016FBOn va donc utiliser ici un saut long (0F8X...) pour se brancher sur notre code qui se trouvera après la dernière section comme pour la partie I de ce tutorial. Au passage, on va mettre avant les chaînes de caractères dont on a besoin pour cette fois:
0000D720 5348 4152 4557 4152 4521 2121 0000 0000 SHAREWARE!!!.... 0000D730 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D740 5665 7569 6C6C 657A 2076 6F75 7320 656E Veuillez vous en 0000D750 7265 6769 7374 7265 722E 0000 0000 0000 registrer....... 0000D760 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D770 4E27 6F75 626C 6965 7A20 7061 7320 6465 N'oubliez pas de 0000D780 2076 6F75 7320 656E 7265 6769 7374 7265 vous enregistre 0000D790 722E 2043 6F6E 7375 6C74 657A 206C 6520 r. Consultez le 0000D7A0 6669 6368 6965 7220 7265 672E 7478 742E fichier reg.txt. 0000D7B0 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D7C0 4272 6176 6F21 0000 0000 0000 0000 0000 Bravo!.......... 0000D7D0 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D7E0 4D65 7263 6920 6465 2076 6F74 7265 2073 Merci de votre s 0000D7F0 6F75 7469 656E 2E00 0000 0000 0000 0000 outien.......... 0000D700 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D810 4572 7265 7572 2100 0000 0000 0000 0000 Erreur!......... 0000D820 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D830 4D61 7576 6169 7320 436F 6465 0000 0000 Mauvais Code.... 0000D840 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D850 5368 6172 6570 6164 0000 0000 0000 0000 Sharepad........ 0000D860 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D870 5265 7665 7273 E920 7061 7220 416E 7562 Revers. par Anub 0000D880 6973 2028 5368 6D65 6974 636F 7270 2921 is (Shmeitcorp)! 0000D890 0000 0000 0000 0000 0000 0000 0000 0000 ................J'ai laissé une ligne d'espace par clarté et pour bien distinguer les différentes phrases.
* Possible Ref to Menu : MenuID_0001, Item: "Couper Ctrl+X" | :00401288 3D00030000 cmp eax, 00000300 :0040128D 7C21 jl 004012B0 * Possible Ref to Menu : MenuID_0001, Item: "Copier Ctrl+C" | :0040128F 3D01030000 cmp eax, 00000301 :00401294 0F8E3E040000 jle 004016D8 * Possible Ref to Menu : MenuID_0001, Item: "Coller Ctrl+V" | :0040129A 3D02030000 cmp eax, 00000302 :0040129F 0F8456040000 je 004016FB...qui devient:
* Possible Ref to Menu : MenuID_0001, Item: "Couper Ctrl+X" | :00401288 3D00030000 cmp eax, 00000300 :0040128D 7C21 jl 004012B0 :0040128F E92CC60000 jmp 0040D8C0 <<== on se branche ici, saut en D8C0 :00401294 0F8E3E040000 jle 004016D8 * Possible Ref to Menu : MenuID_0001, Item: "Coller Ctrl+V" | :0040129A 3D02030000 cmp eax, 00000302 :0040129F 0F8456040000 je 004016FBLa chaîne " * Possible Ref to Menu : MenuID_0001, Item: "Copier Ctrl+C" " disparaît, car il n'y a plus son ID (301) dans le code réécrit.
(ID-COMPARAISON) .0040D8C0: 60 pushad <-- sauvegarde de tous les registres .0040D8C1: 3D8E030000 cmp eax,00000038E <-- on a choisi la boite d'enregistrement ? .0040D8C6: 0F8484000000 je .00040D950 <-- oui, alors on exécute son code .0040D8CC: 3D8F030000 cmp eax,00000038F <-- on a choisi la MSGBOX5 de "À propos du Sharepad" ? .0040D8D1: 0F8439000000 je .00040D910 <-- oui, alors on exécute son code .0040D8D7: 61 popad <-- restauration de tous les registres .0040D8D8: 3D01030000 cmp eax,000000301 <-- instruction écrasée par notre jump en 40128F .0040D8DD: E9B239FFFF jmp .000401294 <-- retour au code juste après notre jump sauvage (MSGBOX5) .0040D910: 6A00 push 000 .0040D912: 6850D84000 push 00040D850 <-- Titre .0040D917: 6870D84000 push 00040D870 <-- Message .0040D91C: 6A00 push 000 .0040D91E: FF15A8644000 call MessageBoxA <-- Affichage de la MSGBOX5 .0040D924: 61 popad <-- Restauration de tous les registres .0040D925: E9833FFFFF jmp .0004018AD <-- Retour à la boucle de l'API SendMessage...et sous l'éditeur hexa:
0000D8B0 4944 2D43 4F4D 5041 5241 4953 4F4E 0000 ID-COMPARAISON.. <-- Titre de la partie. N'intervient pas dans le code. 0000D8C0 603D 8E03 0000 0F84 8400 0000 3D8F 0300 `=..........=... |Code 0000D8D0 000F 8439 0000 0061 3D01 0300 00E9 B239 ...9...a=......9 |Code 0000D8E0 FFFF 0000 0000 0000 0000 0000 0000 0000 ................ |Code 0000D8F0 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D900 4D53 4742 4F58 3500 0000 0000 0000 0000 MSGBOX5......... <-- Titre de la partie. N'intervient pas dans le code. 0000D910 6A00 6850 D840 0068 70D8 4000 6A00 FF15 j.hP.@.hp.@.j... |Code 0000D920 A864 4000 61E9 833F FFFF 0000 0000 0000 .d@.a..?........ |Code 0000D930 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D940 5245 4742 4F58 0000 0000 0000 0000 0000 REGBOX.......... <-- Titre de la partie. N'intervient pas dans le code. 0000D950 0000 0000 0000 0000 0000 0000 0000 0000 ................Les titres des parties n'interviennent pas car les différentes parties de code sont connectées entre elles par des sauts ou des calls qui passent au dessus des titres. De même, aucune autre instruction en assembleur ne va appeler ces chaînes par leur adresse (offset).
The code for "Start Notepad": :00000204 3D9C020000 cmp eax, 0000029C ;; is "Start Notepad" chosen? :00000209 7525 jne 00000230 ;; if not, then jump :0000020B 68ACE64000 push 0040E6AC ;; push "KERNEL32.DLL" :00000210 FF1590E24000 call dword ptr [0040E290] ;; "GetModuleHandle" :00000216 68071B4100 push 00411B07 ;; "WinExec" :0000021B 50 push eax ;; handle of Kernel32.dll :0000021C FF15DCE24000 call dword ptr [0040E2DC] ;; GetProcAddress :00000222 6A01 push 00000001 ;; SW_SHOW :00000224 68EA174100 push 004117EA ;; "Notepad.exe" :00000229 FFD0 call eax ;; call WinExec :0000022B E9B616FFFF jmp FFFF18E6 ;; back to MessageLoopSi vous ne comprenez pas le code, je vous renvoie à son tutorial. Je ne lui ferai pas l'affront de l'expliquer. Et si vous voulez plus de détails sur la méthode, allez à la source voir le tutorial de NeuRaL_NoiSE (dans sa Phase 5). Il y a d'excellentes explications!
HWND CreateDialogParam( HINSTANCE hInstance, // handle to application instance LPCTSTR lpTemplateName, // identifies dialog box template HWND hWndParent, // handle to owner window DLGPROC lpDialogFunc, // pointer to dialog box procedure LPARAM dwInitParam // initialization value );Et on fermera cette API avec DestroyWindow. Sa structure ne possède qu'un seul paramètre à passer:
BOOL DestroyWindow( HWND hWnd // handle to window to destroy );Comme cela ne nous avance pas trop malgré tout, on va regarder l'API CreateDialogParam qui est présente dans le notepad sous Wdasm/SI. On ne trouve qu'une seule occurrence de cette API dans le programme (affichage de la petite DialogBox de l'imprimante "impression en cours"), qui donne les renseignements suivants pour les 5 paramètres à passer:
:00404085 56 push esi ; init. value = 0 :00404086 A100504000 mov eax, dword ptr [00405000] :0040408B 68E13B4000 push 00403BE1 ; pointer to procedure = 8B 44 24 08 :00404090 50 push eax ; handle to owner window = 30C * Possible Ref to Menu : MenuID_0001, Item: "Heure/Date F5" | | | * Possible Reference to Dialog: DialogID_000C | Wdasm s'emmêle les pinceaux ;) | | * Possible Reference to StringResource ID=00012: "- Bloc-notes" | | :00404091 6A0C push 0000000C ; dialog box template = 0x0C (soit 12 sous BRW) :00404093 FF3540554000 push dword ptr [00405540] ; handle to appli. inst. = 00 00 40 00 (400000) * Reference To : USER32.CreateDialogParamA, Ord: 0050h | :00404099 FF155C644000 Call dword ptr [0040645C] ; API CreateDialogParamAExplications avec les valeurs que j'ai choisi pour mon code :
initialization value = 0 ; on ne s'en occupe pas. On met zéro. pointer to procedure = 40D980 ; procédure du code à exécuter dans la fenêtre (REGBOX) affichée. handle to owner window = 8C ; comment trouver cette valeur?? voir plus bas... ;) dialog box template = 680 ; 0x680 = 1664d. Vu? handle to appli. inst. = 400000 ; il s'agit en général de l'ImageBase (ici = 400000).Pour le "pointer to procedure", c'est comme un jump qui va exécuter le code de la fenêtre REGBOX (gestion des messages, calcul du sérial,...). J'ai fixé cette valeur aprés avoir codé l'appel de la REGBOX. Pour le "handle to owner window", il y a un moyen très simple d'avoir cette valeur embêtante à trouver: on lance le soft dont on veut l'handle. Sous SI, on fait "task" et on voit beaucoup de données, dont les noms des applications lancées. On repère dans la liste le nom du soft dont on veut l'handle (ce nom n'est pas toujours le même que celui du programme qu'on lance, c'est pour ça que l'on fait un "task" d'abord!). Puis on fait "hwnd nom_du_soft", et on regarde la 1ère colonne qui contient les handles du soft. La 1ère valeur est celle recherchée (0x8C pour notre cas). Elle est en retrait du reste de la colonne.
(ID-COMPARAISON) .0040D8C0: 60 pushad <-- sauvegarde de tous les registres .0040D8C1: 3D8E030000 cmp eax,00000038E <-- on a choisi la boite d'enregistrement ? .0040D8C6: 0F8484000000 je .00040D950 <-- oui, alors on exécute son code .0040D8CC: 3D8F030000 cmp eax,00000038F <-- on a choisi la MSGBOX5 de "À propos du Sharepad" ? .0040D8D1: 0F8439000000 je .00040D910 <-- oui, alors on exécute son code .0040D8D7: 61 popad <-- restauration de tous les registres .0040D8D8: 3D01030000 cmp eax,000000301 <-- instruction écrasée par notre jump en 40128F .0040D8DD: E9B239FFFF jmp .000401294 <-- retour au code juste après notre jump sauvageComme on appelle maintenant la REGBOX, on va avoir l'ID 38E et sauter en D950. On place directement l'API CreateDialogParam à cette adresse, suivie d'une instruction qui sauvegarde le handle de la dialog box crée (ce handle est retourné dans eax lors de la création de la dialog box). L'offest [405390] pour sauvegarder eax a été choisi au hasard dans le padding de la section .data, c'était le 1er grand padding que j'ai rencontré en descendant, lisant le code sous un éditeur hexa. De plus cette section est C0000040 (le C signifie read et write dans la section), donc on a tout ce qu'il nous faut!
.0040D950: 6A00 push 0000 | .0040D952: 6880D94000 push 00040D980 | .0040D957: 688C000000 push 00000008C | Nos 5 paramètres de l'API CreateDialogParam .0040D95C: 6880060000 push 000000680 | .0040D961: 6800004000 push 000400000 | .0040D966: FF155C644000 call CreateDialogParamA <-- API CreateDialogParam appelant la REGBOX .0040D96C: A390534000 mov [000405390],eax <-- sauvegarde du handle de la REGBOX .0040D971: E9373FFFFF jmp .0004018AD <-- on sort/saute à notre boucle bien connue! [...] .0040D980: 33C0 xor eax,eax .0040D982: C21000 retn 00010Dans l'API CreateDialogParam, j'ai dit qu'on avait la procédure du code à exécuter dans la fenêtre (REGBOX) affichée. Elle doit se trouver en 40D980 telle définie en 40D952 par le push 40D980. Cette procédure correspond aux 2 instructions ci-dessus en 40D980 qui sont pour l'instant des instructions bidons, histoire que le programme puisse tourner. On mettra ici plus tard le code de calcul du sérial.
0000D940 5245 4742 4F58 0000 0000 0000 0000 0000 REGBOX.......... <-- Titre de la partie. N'intervient pas dans le code. 0000D950 6A00 6880 D940 0068 8C00 0000 6880 0600 j.h..@.h....h... |Code1 0000D960 0068 0000 4000 FF15 5C64 4000 A390 5340 .h..@...\d@...S@ |Code1 0000D970 00E9 373F FFFF 0000 0000 0000 0000 0000 ..7?............ |Code1 + padding 0000D980 33C0 C210 0000 0000 0000 0000 0000 0000 3............... |Code2On peut maintenant tester le soft et cliquer sur le menu pour s'enregistrer. Ô joie! Voilà la REGBOX qui s'affiche :o)
0000D980 558B EC81 7D0C 1000 0000 750E FF75 08FF U...}.....u..u.. 0000D990 15A0 6440 00E9 2F00 0000 817D 0C11 0100 ..d@../....}.... 0000D9A0 0075 268B 4510 7521 3D89 0300 0075 0EFF .u&.E.u!=....u.. 0000D9B0 7508 FF15 A064 4000 E90C 0000 003D 8803 u....d@......=.. 0000D9C0 0000 7505 E827 0000 00C9 C300 0000 0000 ..u..'.......... 0000D9D0 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000D9E0 5345 5249 414C 2D43 414C 4390 0000 0000 SERIAL-CALC..... 0000D9F0 6A00 68C0 D740 0068 C0D7 4000 6A00 FF15 j.h..@.h..@.j... 0000DA00 A864 4000 C9C3 0000 0000 0000 0000 0000 .d@............. 0000DA10 0000 0000 0000 0000 0000 0000 0000 0000 ................* Et en listing asm (suite de REGBOX)
.0040D980: 55 push ebp .0040D981: 8BEC mov ebp,esp .0040D983: 817D0C10000000 cmp [ebp+0C],000000010 .0040D98A: 750E jne .00040D99A .0040D98C: FF7508 push [ebp+08] .0040D98F: FF15A0644000 call DestroyWindow .0040D995: E92D000000 jmp .00040D9C7 .0040D99A: 817D0C11010000 cmp [ebp+0C],000000111 .0040D9A1: 7524 jne .00040D9C7 .0040D9A3: 8B4510 mov eax,[ebp+10] .0040D9A6: 3D89030000 cmp eax,000000389 .0040D9AB: 750E jne .00040D9BB .0040D9AD: FF7508 push [ebp+08] .0040D9B0: FF15A0644000 call DestroyWindow .0040D9B6: E90C000000 jmp .00040D9C7 .0040D9BB: 3D88030000 cmp eax,000000388 .0040D9C0: 7505 jne .00040D9C7 .0040D9C2: E829000000 call .00040D9F0 .0040D9C7: C9 leave .0040D9C8: C3 retn [...] .0040D9F0: 6A00 push 000 .0040D9F2: 68C0D74000 push 00040D7C0 .0040D9F7: 68C0D74000 push 00040D7C0 .0040D9FC: 6A00 push 000 .0040D9FE: FF15A8644000 call MessageBoxA .0040DA04: C9 leave .0040DA05: C3 retnAnalyse du code:
int GetWindowText( HWND hWnd, // handle of window or control with text LPTSTR lpString, // address of buffer for text int nMaxCount // maximum number of characters to copy ); UINT GetDlgItemText( HWND hDlg, // handle of dialog box int nIDDlgItem, // identifier of control LPTSTR lpString, // address of buffer for text int nMaxCount // maximum size of string );A noter que ces 2 APIs renvoient la longueur de la chaîne saisie dans eax.
(SERIAL-CALC) .0040D9F0: 6A20 push 020 <-- longueur max. du buffer (32d) .0040D9F2: 68A0534000 push 0004053A0 <-- offset en mémoire du nom entré .0040D9F7: 6884030000 push 000000384 <-- ID du champs EDIT_nom .0040D9FC: FF7508 push [ebp+08] <-- handle de la REGBOX (dans la pile) .0040D9FF: FF157C644000 call GetDlgItemTextA <-- on va chercher le nom entré... .0040DA05: A3C0534000 mov [0004053C0],eax <-- ... on sauve sa longueur ici .0040DA0A: 6A10 push 010 <-- longueur max. du buffer (16d) .0040DA0C: 68D0534000 push 0004053D0 <-- offset en mémoire du sérial entré .0040DA11: 6885030000 push 000000385 <-- ID du champs EDIT_sérial .0040DA16: FF7508 push [ebp+08] <-- handle de la REGBOX (dans la pile) .0040DA19: FF157C644000 call GetDlgItemTextA <-- on va chercher le sérial entré... .0040DA1F: C3 retn... et on obtient le nom rentré en 4053A0, et le sérial entré en 4053D0. Rien de très compliqué jusque là! Le C3 est juste là pour que le soft ne plante pas et pour pouvoir vérifier les offsets sous Softice (par "d 4053A0" et "d 4053D0" en posant un bpx en 40D9F0). Le "mov [offset],eax" en DA05 stocke en fait la longueur du nom saisi dans l'[offset].
.0040DA1F: C605E053400000 mov [0004053E0],000 <-- explication plus tard... .0040DA26: 33C0 xor eax,eax |Mise à zéro des registres .0040DA28: 33D2 xor edx,edx |que l'on va utiliser .0040DA2A: 33DB xor ebx,ebx | .0040DA2C: 8B0DC0534000 mov ecx,[0004053C0] <-- longueur du nom dans ecx .0040DA32: 8A82A0534000 mov al,[edx+0004053A0] <-- on met les lettres du nom dans eax .0040DA38: 8D1C43 lea ebx,[ebx+eax*2] <-- formule de calcul du sérial .0040DA3B: 42 inc edx <-- on passe au caractère suivant .0040DA3C: 3BCA cmp ecx,edx <-- on regarde si on a fait tous les caractères .0040DA3E: 75F2 jne .00040DA32 <-- si pas fini, on continue le calcul .0040DA40: 81C321430000 add ebx,000004321 <-- sinon on ajoute notre constante... .0040DA46: 81F334120000 xor ebx,000001234 <-- ...et on xor avec une autre constante .0040DA4C: 53 push ebx <-- on met le résultat sur la pile .0040DA4D: 689C104000 push 00040109C <-- voir explication plus bas .0040DA52: 68F0534000 push 0004053F0 <-- offset du résultat en décimal .0040DA57: FF150C644000 call wsprintfA <-- conversion hexa/décimal .0040DA5D: 68D0534000 push 0004053D0 <-- sérial entré .0040DA62: 68F0534000 push 0004053F0 <-- sérial calculé .0040DA67: FF15B8634000 call lstrcmpA <-- comparaison (on va rajouter quelque chose ici plus tard!!!) .0040DA6D: 85C0 test eax,eax <-- ce sont les même ?? .0040DA6F: 7416 je .00040DA87 <-- oui, alors on saute en good boy .0040DA71: 6A00 push 000 | .0040DA73: 6810D84000 push 00040D810 |Bad boy! .0040DA78: 6830D84000 push 00040D830 |Affichage de la msgbox .0040DA7D: 6A00 push 000 |"Mauvais Code" .0040DA7F: FF15A8644000 call MessageBoxA | .0040DA85: C9 leave .0040DA86: C3 retn .0040DA87: 6A00 push 000 | .0040DA89: 68C0D74000 push 00040D7C0 |Good boy! .0040DA8E: 68E0D74000 push 00040D7E0 |Affichage de la msgbox .0040DA93: 6A00 push 000 |"Merci de votre soutien." .0040DA95: FF15A8644000 call MessageBoxA | .0040DA9B: C9 leave .0040DA9C: C3 retnSous un éditeur hexa, ça donne:
0000DA10 0068 8503 0000 FF75 08FF 157C 6440 00C6 .h.....u...|d@.. 0000DA20 05E0 5340 0000 33C0 33D2 33DB 8B0D C053 ..S@..3.3.3....S 0000DA30 4000 8A82 A053 4000 8D1C 4342 3BCA 75F2 @....S@...CB;.u. 0000DA40 81C3 2143 0000 81F3 3412 0000 5368 9C10 ..!C....4...Sh.. 0000DA50 4000 68F0 5340 00FF 150C 6440 0068 D053 @.h.S@....d@.h.S 0000DA60 4000 68F0 5340 00FF 15B8 6340 0085 C074 @.h.S@....c@...t 0000DA70 166A 0068 10D8 4000 6830 D840 006A 00FF .j.h..@.h0.@.j.. 0000DA80 15A8 6440 00C9 C36A 0068 C0D7 4000 68E0 ..d@...j.h..@.h. 0000DA90 D740 006A 00FF 15A8 6440 00C9 C300 0000 .@.j....d@......Je vais éclaircir encore 2-3 petites choses.
wsprintf(buffer_décimal, %d, buffer_hexa);Le %d étant le paramètre qui signifie à wsprintf que l'on veut convertir en décimal. Donc il nous faut passer ce "%d" dans l'API. Et pour cela, on doit l'avoir en tant que chaîne de caractère dans la partie ascii sous un éditeur hexa. J'aurais pu le rajouter à la main, mais j'ai d'abord regardé s'il ne figurait pas déjà dans le code. Sous un éditeur hexa, j'ai lancé une recherche sur %d et j'ai trouvé une seule occurrence en 40109C. Il faut bien faire attention que le %d soit suivi de 00 dans la partie hexa de l'éditeur, sinon en mettant %d sur la pile, on risquerait de mettre d'autres choses avec. Il ne reste ensuite plus qu'à mettre l'offset 40109C sur la pile pour passer le paramètre %d, ce que j'ai fait! :) Wsprintf renvoie ensuite en 4053F0 la valeur décimale du sérial calculé.
LONG RegCloseKey( HKEY hKey // handle of key to close ); LONG RegCreateKey( HKEY hKey, // handle of an open key LPCTSTR lpSubKey, // address of name of subkey to open PHKEY phkResult // address of buffer for opened handle ); LONG RegSetValueEx( HKEY hKey, // handle of key to set value for LPCTSTR lpValueName, // address of value to set DWORD Reserved, // reserved DWORD dwType, // flag for value type CONST BYTE *lpData, // address of value data DWORD cbData // size of value data );On va commencer par mettre un jump à la place de la msgbox good boy, et faire un nouvelle partie GOODBOY dans la quelle on mettra l'inscription au registre puis la msgbox good boy (que l'on enlève de la partie SERIAL-CALC). Cette inscription se fera dans la branche HKEY\CURRENT_USER\Software\Microsoft\Notepad dans l'ordre suivant:
* Possible StringData Ref from Data Obj ->"iPointSize" | :00402601 6820524000 push 00405220 :00402606 FF75FC push [ebp-04] :00402609 E808FEFFFF call 00402416 :0040260E FF351C504000 push dword ptr [0040501C] [...] * Possible StringData Ref from Data Obj ->"fSavePageSettings" | :00402627 6838524000 push 00405238 :0040262C FF75FC push [ebp-04] :0040262F E8E2FDFFFF call 00402416 :00402634 682C584000 push 0040582C * Possible StringData Ref from Data Obj ->"lfFaceName" | :00402639 6850524000 push 00405250 :0040263E FF75FC push [ebp-04] :00402641 E8ECFDFFFF call 00402432Suivant le type d'information à entrer dans la bdr (valeur binaire ou chaîne), on appelle "call 00402416" (valeur binaire) ou "call 00402432" (chaîne). Pour mieux comparer, jetez un coup d'oeil dans la branche HKEY\CURRENT_USER\Software\Microsoft\Notepad et regardez la différence entre lfFaceName et fSavePageSettings.
(Fin de SERIAL-CALC) .0040DA6F: 743F je .00040DAB0 ;on saute à GOODBOY si sérial ok, sinon... .0040DA71: 6A00 push 000 |...msgbox badboy .0040DA73: 6810D84000 push 00040D810 | .0040DA78: 6830D84000 push 00040D830 | .0040DA7D: 6A00 push 000 | .0040DA7F: FF15A8644000 call MessageBoxA | .0040DA85: C9 leave .0040DA86: C3 retn...pour pouvoir jumper sur cette partie de code là qui s'appelle GOODBOY:
(GOODBOY) .0040DAB0: 55 push ebp ;sauve ebp .0040DAB1: 8BEC mov ebp,esp ;change de variable pour la pile .0040DAB3: 83EC04 sub esp,004 ;décalage de la pile d'un cran .0040DAB6: 8D45FC lea eax,[ebp-04] |RegCreateKeyA .0040DAB9: 50 push eax | .0040DABA: 6848514000 push 000405148 | .0040DABF: 6801000080 push 080000001 | .0040DAC4: FF15F0624000 call RegCreateKeyA | .0040DACA: 85C0 test eax,eax ;si échec pour création de la clé, on saute... .0040DACC: 7541 jne .00040DB0F ;...ici .0040DACE: 68A0534000 push 0004053A0 |RegSetValueEx (pour le nom) .0040DAD3: 6856524000 push 000405256 | .0040DAD8: FF75FC push d,[ebp-04] | .0040DADB: E85249FFFF call .000402432 | .0040DAE0: 68D0534000 push 0004053D0 ¦RegSetValueEx (pour le code) .0040DAE5: 6838D84000 push 00040D838 ¦ .0040DAEA: FF75FC push d,[ebp-04] ¦ .0040DAED: E84049FFFF call .000402432 ¦ .0040DAF2: FF75FC push d,[ebp-04] |RegCloseKey .0040DAF5: FF15E8624000 call RegCloseKey | .0040DAFB: 6A00 push 000 ¦Msgbox goodboy .0040DAFD: 68C0D74000 push 00040D7C0 ¦ .0040DB02: 68E0D74000 push 00040D7E0 ¦ .0040DB07: 6A00 push 000 ¦ .0040DB09: FF15A8644000 call MessageBoxA ¦ .0040DB0F: 8BE5 mov esp,ebp ;remet la variable d'origine .0040DB11: 5D pop ebp ;pop ebp sur la pile .0040DB12: C9 leave .0040DB13: C3 retnOn commence par un petit changement de variable très courant: on utilise ebp au lieu de esp pour les mouvements de pile. Pour cela, on doit sauver ebp au début, et le restaurer à la fin de la procédure. Pour que les données de la pile soient cohérentes avec les [ebp+XX] marqués, il faut repositionner la pile. C'est le role du "sub esp,04" en DAB3.
00005250 6C66 4661 6365 4E61 6D65 0000 0000 0000 lfFaceName......Mais en pointant sur le "N" de Name (405256), pas de problème pour récupérer la partie qui va bien! Reverse rulez ;o)
0000D830 4D61 7576 6169 7320 436F 6465 0000 0000 Mauvais Code....Ici on pointe sur le "C" de code (40D838), et c'est dans le sac!
LONG RegOpenKey( HKEY hKey, // handle of open key LPCTSTR lpSubKey, // address of name of subkey to open PHKEY phkResult // address of handle of open key ); LONG RegQueryValueEx( HKEY hKey, // handle of key to query LPTSTR lpValueName, // address of name of value to query LPDWORD lpReserved, // reserved LPDWORD lpType, // address of buffer for value type LPBYTE lpData, // address of data buffer LPDWORD lpcbData // address of data buffer size );Comme toujours, on regarde sous Wdasm comment le notepad utilise ces APIs et on s'en inspire comme des poètes :o)
:00402693 55 push ebp :00402694 8BEC mov ebp, esp :00402696 83EC40 sub esp, 00000040 [...] :004026AF 8D4DFC lea ecx, dword ptr [ebp-04] :004026B2 51 push ecx * Possible StringData Ref from Data Obj ->"Software\Microsoft\Notepad" | :004026B3 6848514000 push 00405148 :004026B8 6801000080 push 80000001 * Reference To: ADVAPI32.RegOpenKeyA, Ord:0094h | :004026BD FF15EC624000 Call dword ptr [004062EC] :004026C3 85C0 test eax, eax :004026C5 7407 je 004026CEEt voilà pour RegQueryValueEx...:
:004027C8 6A20 push 00000020 :004027CA 8D4DDC lea ecx, dword ptr [ebp-24] :004027CD 682C584000 push 0040582C :004027D2 A22B584000 mov byte ptr [0040582B], al :004027D7 51 push ecx * Possible StringData Ref from Data Obj ->"lfFaceName" | :004027D8 6850524000 push 00405250 :004027DD FF75FC push [ebp-04] :004027E0 E8C5FCFFFF call 004024AA :004027E5 6A78 push 00000078...dont le call 004024AA renvoie à la procédure.
(TEST-REG) .0040DB40: 55 push ebp ;on arrive directement du PEP et on fait... .0040DB41: 8BEC mov ebp,esp ;...le changement de variable de la pile... .0040DB43: 83EC40 sub esp,040 ;...que l'on recalibre .0040DB46: 8D4DFC lea ecx,[ebp-04] |RegOpenKeyA .0040DB49: 51 push ecx | .0040DB4A: 6848514000 push 000405148 | .0040DB4F: 6801000080 push 080000001 | .0040DB54: FF15EC624000 call RegOpenKeyA | .0040DB5A: 85C0 test eax,eax ;si l'ouverture n'est pas faite... .0040DB5C: 7539 jne .00040DB97 ;...on saute à la fin .0040DB5E: 6A20 push 020 |Lecture du nom ("Anubis") de la bdr .0040DB60: 68A0534000 push 0004053A0 | .0040DB65: 8D4DDC lea ecx,[ebp-24] | .0040DB68: 51 push ecx | .0040DB69: 6856524000 push 000405256 | .0040DB6E: FF75FC push [ebp-04] | .0040DB71: E83449FFFF call .0004024AA | .0040DB76: 6A10 push 010 ¦Lecture du sérial ("21969") de la bdr .0040DB78: 68D0534000 push 0004053D0 ¦ .0040DB7D: 8D4DDC lea ecx,[ebp-24] ¦ .0040DB80: 51 push ecx ¦ .0040DB81: 6838D84000 push 00040D838 ¦ .0040DB86: FF75FC push [ebp-04] ¦ .0040DB89: E81C49FFFF call .0004024AA ¦ .0040DB8E: FF75FC push [ebp-04] |RegCloseKey .0040DB91: FF15E8624000 call RegCloseKey | .0040DB97: 8BE5 mov esp,ebp ;on rechange les registres... .0040DB99: 5D pop ebp ;...on remet ebp .0040DB9A: 55 push ebp |Ici, on remet les instructions .0040DB9B: 8BEC mov ebp,esp |écrasées par le jump .0040DB9D: 83EC44 sub esp,044 |au PEP... .0040DBA0: E92D35FFFF jmp .0004010D2 ;...et on saute juste après notre jump du PEPAu PEP, la déviation à cette tête là:
.004010CC: E96FCA0000 jmp .00040DB40 ;notre jump .004010D1: 90 nop ;on nop les restes des instructions écrasées .004010D2: 56 push esi ;retour de la procédure ci-dessus .004010D3: FF15E0634000 call GetCommandLineAPetite analyse du code pour la lecture dans la bdr:
.0040DA2B: C605E053400000 mov byte ptr [0004053E0],00 <-- explication plus tard......qui se trouve dans la routine de calcul du sérial (bien plus haut). Notre flag est en 4053E0, à l'état 01 (Bdr) ou 00 (REGBOX).
(Fin de TEST-REG) .0040DB8E: FF75FC push [ebp-04] |RegCloseKey .0040DB91: FF15E8624000 call RegCloseKey | .0040DB97: 8BE5 mov esp,ebp ;on rechange les registres... .0040DB99: 5D pop ebp ;...on remet ebp .0040DB9A: C605E053400001 mov [0004053E0],001 ;voilà notre flag bdr! .0040DBA1: E980FEFFFF jmp .00040DA26 ;on saute au calcul du sérialIl y a ici un point important à ne pas oublier! En déviant ce code sur le calcul du sérial, on arrive avec le nom et le sérial dans 2 buffers différents. ET C'EST TOUT! Vous allez me dire "oui, eh bien alors quoi??". Et bien, si on ne spécifie pas la longueur du buffer nom, le calcul du sérial se fera avec une boucle infinie, et le programme plantera au démarrage... Donc on doit mettre une API lstrlen juste après avoir lu le nom dans la bdr. On passera ensuite la longueur dans le buffer longueur destiné qui est [4053C0].
(Fin de TEST-REG) .0040DB71: E83449FFFF call .0004024AA ;retourne le nom "Anubis" de la bdr .0040DB76: 68A0534000 push 0004053A0 |renvoie la longueur de ce nom .0040DB7B: FF15B0634000 call lstrlenA |dans eax .0040DB81: A3C0534000 mov [0004053C0],eax ;on met eax dans son buffer pour la routine du sérial .0040DB86: 6A10 push 010 |début de l'API qui renvoie le sérial de la bdr .0040DB88: 68D0534000 push 0004053D0 .0040DB8D: 8B4DDC mov ecx,[ebp-24] .0040DB90: 51 push ecx .0040DB91: 6838D84000 push 00040D838 .0040DB96: FF75FC push [ebp-04] .0040DB99: E80C49FFFF call .0004024AA .0040DB9E: FF75FC push [ebp-04] .0040DBA1: FF15E8624000 call RegCloseKey .0040DBA7: 8BE5 mov esp,ebp .0040DBA9: 5D pop ebp .0040DBAA: C605E053400001 mov [0004053E0],001 .0040DBB1: E970FEFFFF jmp .00040DA26De même, pour garder l'aspect "esthétique" des différentes parties, les 2 parties MSGBOX-PEP et -EXITPROC sont décalées d'une ligne vers le bas (dans l'éditeur hexa) et leur jump est recalibré en enlevant 0x10 au 2ème byte de l'instruction (j'èspère que tout le monde me suit :) ).
0000DB30 5445 5354 2D52 4547 0000 0000 0000 0000 TEST-REG........ 0000DB40 558B EC83 EC40 8D4D FC51 6848 5140 0068 U....@.M.QhHQ@.h 0000DB50 0100 0080 FF15 EC62 4000 85C0 7539 6A20 .......b@...u9j 0000DB60 68A0 5340 008D 4DDC 5168 5652 4000 FF75 h.S@..M.QhVR@..u 0000DB70 FCE8 3449 FFFF 68A0 5340 00FF 15B0 6340 ..4I..h.S@....c@ 0000DB80 00A3 C053 4000 6A10 68D0 5340 008B 4DDC ...S@.j.h.S@..M. 0000DB90 5168 38D8 4000 FF75 FCE8 0C49 FFFF FF75 Qh8.@..u...I...u 0000DBA0 FCFF 15E8 6240 008B E55D C605 E053 4000 ....b@...]...S@. 0000DBB0 01E9 70FE FFFF 0000 0000 0000 0000 0000 ..p............. 0000DBC0 0000 0000 0000 0000 0000 0000 0000 0000 ................Maintenant, il faut mettre les aiguillages :)
.0040DA67: FF15B8634000 call lstrcmpA .0040DA6D: 803DE053400000 cmp [0004053E0],000 ;notre flag est à 0? .0040DA74: 0F85E6010000 jne .00040DC60 ;non, donc on vient de la bdr et on va a DESACTIV .0040DA7A: 85C0 test eax,eax ;sinon on continue normalement vers... .0040DA7C: 7432 je .00040DAB0 ;...GOODBOY ou... .0040DA7E: 6A00 push 000 .0040DA80: 6810D84000 push 00040D810 .0040DA85: 6830D84000 push 00040D830 .0040DA8A: 6A00 push 000 .0040DA8C: FF15A8644000 call MessageBoxA ;...msgbox badboy .0040DA92: C9 leave .0040DA93: C3 retnPuis, toujours pour que le programme fonctionne quand on arrive dans DESACTIV où il n'y a encore rien, on met un jump en 40DC60 vers le PEP.
.0040DC60: E96D34FFFF jmp .0004010D2Voilà! Vous pouvez tester le programme, il ne marchera pas tout à fait suivant notre plan car il reste DESACTIV à faire mais ça fait toujours plaisir de voir le résultat du travail jusqu'ici.
* MSGBOX1-PEP .0040DBE0: 6A00 push 000 |Msgbox1 au PEP .0040DBE2: 6820D74000 push 00040D720 | .0040DBE7: 6840D74000 push 00040D740 | .0040DBEC: 6A00 push 000 | .0040DBEE: FF15A8644000 call MessageBoxA | .0040DBF4: 55 push ebp ;instructions écrasées .0040DBF5: 8BEC mov ebp,esp ;par le jump au PEP .0040DBF7: 83EC44 sub esp,044 ; .0040DBFA: E9D334FFFF jmp .0004010D2 ;on saute juste après notre jump du PEPMSGBOX1-PEP commence directement à afficher la msgbox, et finit par retourner au PEP après avoir rétabli les instructions écrasées. On arrivera ici depuis la partie DESACTIV (qui se trouve plus bas dans ce tut).
* MSGBOX2-EXIT .0040DC20: 6A00 push 000 |Msgbox2 au EXITPROCESS .0040DC22: 6820D74000 push 00040D720 | .0040DC27: 6870D74000 push 00040D770 | .0040DC2C: 6A00 push 000 | .0040DC2E: FF15A8644000 call MessageBoxA ; .0040DC34: FF1598634000 call ExitProcess ; .0040DC3A: E90A35FFFF jmp .000401149 ;on saute juste après notre jump de l'EXITPROCESSPour MSGBOX2-EXIT, c'est exactement la même chose que le sharepad1.
0000DBD0 4D53 4742 4F58 312D 5045 5090 0000 0000 MSGBOX1-PEP..... 0000DBE0 6A00 6820 D740 0068 40D7 4000 6A00 FF15 j.h .@.h@.@.j... 0000DBF0 A864 4000 558B EC83 EC44 E9D3 34FF FF00 .d@.U....D..4... 0000DC00 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0000DC10 4D53 4742 4F58 322D 4558 4954 0000 0000 MSGBOX2-EXIT.... 0000DC20 6A00 6820 D740 0068 70D7 4000 6A00 FF15 j.h .@.hp.@.j... 0000DC30 A864 4000 FF15 9863 4000 E90A 35FF FF00 .d@....c@...5...N'oubliez pas de mettre un saut de déviation à l'EXITPROCESS du notepad en 401143 vers MSGBOX2-EXIT (si vous ne vous rappelez plus comment on fait, jetez un oeil à la partie I de ce tut...).
Comparaison des fichiers N.exe et N2.exe 0000C980: 00 03 0000C99E: 00 03La messe est dite! On patche ces 2 offsets pour avoir la modification en hard dans l'exe.
00008740 2D00 2000 5300 4800 4100 5200 4500 5700 -. .S.H.A.R.E.W. 00008750 4100 5200 4500 2000 0000 0000 0000 0000 A.R.E. ......... 00008760 1A00 4900 6D00 7000 6F00 7300 7300 6900 ..I.m.p.o.s.s.i.Maintenant, on va désactiver les protections shareware que l'on vient de coder. Car on est des utilisateurs officiels ENREGISTRES du notepad. J'en connais qui vont être content à redmond... ;o) Toutes les modifications ci-dessous ont été déjà expliquées à la partie I de ce tutorial.
.0040DBEE: FF15A8644000 call MessageBoxA .0040DC2E: FF15A8644000 call MessageBoxA* SHAREWARE dans la barre des titres:
0000CC20 6900 7600 6100 6E00 7400 0900 4600 3300 i.v.a.n.t...F.3. 0000CC30 0000 1000 4500 2600 6E00 7200 6500 6700 ....E.&.n.r.e.g. 0000CC40 6900 7300 7400 7200 6500 6D00 6500 6E00 i.s.t.r.e.m.e.n. 0000CC50 7400 0000 0000 8E03 4500 6E00 7200 6500 t.......E.n.r.e.Au final, on obtient pour DESACTIV:
.0040DC60: 85C0 test eax,eax ;le sérial entré est correct?? .0040DC62: 0F8578FFFFFF jne .00040DBE0 ;non, alors on jump à la MSGBOX1-PEP, sinon .0040DC68: C605EEDB400090 mov [00040DBEE],090 ;on patche MSGBOX1-PEP .0040DC6F: C6052EDC400090 mov [00040DC2E],090 ;on patche MSGBOX2-EXITPROC .0040DC76: C60580C9400000 mov [00040C980],000 ;on réactive le 1er menu grisé .0040DC7D: C6059EC9400000 mov [00040C99E],000 ;on réactive le 2ème menu grisé .0040DC84: C6054687400068 mov [000408746],068 ;"h" |on patche (S)"HAREWARE" par (S)"harepad " .0040DC8B: C6054887400061 mov [000408748],061 ;"a" | .0040DC92: C6054A87400072 mov [00040874A],072 ;"r" | .0040DC99: C6054C87400065 mov [00040874C],065 ;"e" | .0040DCA0: C6054E87400070 mov [00040874E],070 ;"p" | .0040DCA7: C6055087400061 mov [000408750],061 ;"a" | .0040DCAE: C6055287400064 mov [000408752],064 ;"d" | .0040DCB5: C6055487400020 mov [000408754],020 ;" " | .0040DCBC: C60534CC400000 mov [00040CC34],000 ;on patche la lettre "E" de "E&nregistrement" .0040DCC3: 55 push ebp ¦ .0040DCC4: 8BEC mov ebp,esp ¦instructions écrasées par le jump au PEP .0040DCC6: 83EC44 sub esp,044 ¦ .0040DCC9: E90434FFFF jmp .0004010D2 ;on saute après notre jump sauvage du PEPBien évidement, comme on écrit en mémoire dans les sections (.rsrc en fait), il ne faut pas oublier de changer leurs caractéristiques en 0xC00000040 (read + write) sinon l'ordi plante! Cela revient à changer le byte 0x23F (dans le PE header) qui est à 40 en C0.
.0040DB02: 68E0D74000 push 00040D7E0 .0040DB07: 6A00 push 000 .0040DB09: FF15A8644000 call MessageBoxA .0040DB0F: FF7508 push [ebp+08] .0040DB12: FF15A0644000 call DestroyWindow .0040DB18: 8BE5 mov esp,ebp .0040DB1A: 5D pop ebp .0040DB1B: E9B0000000 jmp .00040DBD0DBD0 est l'ancienne place (prévue) du début de DESACTIV. Maintenant il y a MSGBOX1 et 2. DESACTIV commence en DC60 avec le "test eax,eax" que l'on a déjà fait juste avant. Donc on peut jumper directement après, soit en DC68.
0000D7E0 4D65 7263 6920 6465 2076 6F74 7265 2073 Merci de votre s 0000D7F0 6F75 7469 656E 2E20 5265 6C61 6E63 657A outien. Relancez 0000D800 206C 6520 7072 6F67 7261 6D6D 652E 0000 le programme... 0000D810 4572 7265 7572 2100 0000 0000 0000 0000 Erreur!......... 0000D820 0000 0000 0000 0000 0000 0000 0000 0000 ................Et là, l'utilisateur comprend ce qu'il doit faire quand il voit le programme disparaître.
.0040DB02: 68E0D74000 push 00040D7E0 .0040DB07: 6A00 push 000 .0040DB09: FF15A8644000 call MessageBoxA .0040DB0F: FF7508 push [ebp+08] ;on laisse comme ça finalement! .0040DB12: FF15A0644000 call DestroyWindow .0040DB18: 8BE5 mov esp,ebp .0040DB1A: 5D pop ebp .0040DB1B: E948010000 jmp .00040DC68 ;on ne change qu'ici.Héhé, notre sharepad a de la gueule maintenant! On va regarder encore un point, celui où on démarre le programme alors que le bdr est vide. Je n'ai pas pris en compte ce point là dans mon codage. On efface les 2 clé "Name" et "Code" de la bdr, puis un petit coup d'oeil sous SI va vite nous donner la réponse de ce qu'il faut faire.
[quelques instructions sous SI plus tard...(utilisez le loader pour tracer depuis le PEP)]Héhéhéhé!!! Ca marche nickel! On n'a besoin de rien changer!
[quelques instructions sous SI plus tard...]Bien! La longueur du "nom" (vide) saisi est de 0. Il y aura une boucle infinie lors de l'instruction qui compare ecx et edx dans SERIAL-CALC. Pour y remédier, il faut gérer ce cas en 2 endroits (lecture du nom dans la bdr et lecture du nom dans la REGBOX). Je procède comme cela...:
(Fin de TEST-REG) .0040DB71: E83449FFFF call .0004024AA ;retourne le nom "Anubis" de la bdr .0040DB76: 68A0534000 push 0004053A0 |renvoie la longueur de ce nom .0040DB7B: FF15B0634000 call lstrlenA |dans eax .0040DB81: A3C0534000 mov [0004053C0],eax ;on met eax dans son buffer pour la routine du sérial .0040DB86: 6A10 push 010 |début de l'API qui renvoie le sérial de la bdr .0040DB88: 68D0534000 push 0004053D0 [...]...que l'on transforme en (commentaire sur les lignes ajoutées uniquement):
.0040DB71: E83449FFFF call .0004024AA .0040DB76: 68A0534000 push 0004053A0 .0040DB7B: FF15B0634000 call lstrlenA .0040DB81: 85C0 test eax,eax ;eax est nul? .0040DB83: 7501 jne .00040DB86 ;non, alors on saute .0040DB85: 40 inc eax ;oui, alors on le passe à 1 .0040DB86: A3C0534000 mov [0004053C0],eax .0040DB8B: 6A10 push 010 .0040DB8D: 68D0534000 push 0004053D0 .0040DB92: 8B4DDC mov ecx,[ebp-24] .0040DB95: 51 push ecx .0040DB96: 6838D84000 push 00040D838 .0040DB9B: FF75FC push [ebp-04] .0040DB9E: E80749FFFF call .0004024AA .0040DBA3: FF75FC push [ebp-04] .0040DBA6: FF15E8624000 call RegCloseKey .0040DBAC: 8BE5 mov esp,ebp .0040DBAE: 5D pop ebp .0040DBAF: C605E053400001 mov [0004053E0],001 .0040DBB6: E96BFEFFFF jmp .00040DA26
.0040D9F7: 6884030000 push 000000384 .0040D9FC: FF7508 push [ebp+08] .0040D9FF: FF157C644000 call GetDlgItemTextA .0040DA05: A3C0534000 mov [0004053C0],eax .0040DA0A: 6A10 push 010 .0040DA0C: 68D0534000 push 0004053D0 .0040DA11: 6885030000 push 000000385 [...]...que l'on transforme en (commentaire sur les lignes ajoutées uniquement):
.0040D9FF: FF157C644000 call GetDlgItemTextA .0040DA05: 85C0 test eax,eax ;eax est nul? .0040DA07: 7501 jne .00040DA0A ;non, alors on saute .0040DA09: 40 inc eax ;oui, alors on le passe à 1 .0040DA0A: A3C0534000 mov [0004053C0],eax .0040DA0F: 6A10 push 010 .0040DA11: 68D0534000 push 0004053D0 .0040DA16: 6885030000 push 000000385 .0040DA1B: FF7508 push [ebp+08] .0040DA1E: FF157C644000 call GetDlgItemTextA .0040DA24: C605E053400000 mov [0004053E0],000 .0040DA2B: 33C0 xor eax,eax ;attention! on arrive de la bdr ici (nouvelle adresse) .0040DA2D: 33D2 xor edx,edx .0040DA2F: 33DB xor ebx,ebx .0040DA31: 8B0DC0534000 mov ecx,[0004053C0] .0040DA37: 8A82A0534000 mov al,[edx+004053A0] .0040DA3D: 8D1C43 lea ebx,[ebx+eax*2] .0040DA40: 42 inc edx .0040DA41: 3BCA cmp ecx,edx .0040DA43: 75F2 jne .00040DA37 .0040DA45: 81C321430000 add ebx,000004321 .0040DA4B: 81F334120000 xor ebx,000001234 .0040DA51: 53 push ebx .0040DA52: 689C104000 push 00040109C .0040DA57: 68F0534000 push 0004053F0 .0040DA5C: FF150C644000 call wsprintfA .0040DA62: 68D0534000 push 0004053D0 .0040DA67: 68F0534000 push 0004053F0 .0040DA6C: FF15B8634000 call lstrcmpA .0040DA72: 803DE053400000 cmp [0004053E0],000 .0040DA79: 0F85E1010000 jne .00040DC60 .0040DA7F: 85C0 test eax,eax .0040DA81: 742D je .00040DAB0 .0040DA83: 6A00 push 000 .0040DA85: 6810D84000 push 00040D810 .0040DA8A: 6830D84000 push 00040D830 .0040DA8F: 6A00 push 000 .0040DA91: FF15A8644000 call MessageBoxA .0040DA97: C9 leave .0040DA98: C3 retn...à la suite de quoi, il ne faut pas oublier de recalibrer le jump de TEST-REG qui pointe sur la nouvelle position de "xor eax,eax":
.0040DBB6: E970FEFFFF jmp .00040DA2B ;DA26 devient DA2BEt pour un champs "Nom" vide validé, le sérial sera: 20757
* Détournement au PEP .004010CC: E96FCA0000 jmp .00040DB40 .004010D1: 90 nop .004010D2: 56 push esi .004010D3: FF15E0634000 call GetCommandLineA * Détournement dans la gestion des IDs Possible Ref to Menu: MenuID_0001, Item: "Couper Ctrl+X" | :00401288 3D00030000 cmp eax, 00000300 :0040128D 7C21 jl 004012B0 :0040128F E92CC60000 jmp 0040D8C0 :00401294 0F8E3E040000 jle 004016D8 Possible Ref to Menu: MenuID_0001, Item: "Coller Ctrl+V" | :0040129A 3D02030000 cmp eax, 00000302 :0040129F 0F8456040000 je 004016FB * Détournement au EXITPROCESS .00401143: E9D8CA0000 jmp .00040DC20 .00401148: 90 nop .00401149: 8BC6 mov eax,esi .0040114B: 5E pop esi .0040114C: 8BE5 mov esp,ebp .0040114E: 5D pop ebp .0040114F: C3 retn * Mes différentes parties ID-COMPARAISON .0040D8C0: 60 pushad .0040D8C1: 3D8E030000 cmp eax,00000038E .0040D8C6: 0F8484000000 je .00040D950 .0040D8CC: 3D8F030000 cmp eax,00000038F .0040D8D1: 0F8439000000 je .00040D910 .0040D8D7: 61 popad .0040D8D8: 3D01030000 cmp eax,000000301 .0040D8DD: E9B239FFFF jmp .000401294 MSGBOX5 .0040D910: 6A00 push 000 .0040D912: 6850D84000 push 00040D850 .0040D917: 6870D84000 push 00040D870 .0040D91C: 6A00 push 000 .0040D91E: FF15A8644000 call MessageBoxA .0040D924: 61 popad .0040D925: E9833FFFFF jmp .0004018AD REGBOX .0040D950: 6A00 push 000 .0040D952: 6880D94000 push 00040D980 .0040D957: 688C000000 push 00000008C .0040D95C: 6880060000 push 000000680 .0040D961: 6800004000 push 000400000 .0040D966: FF155C644000 call CreateDialogParamA .0040D96C: A390534000 mov [000405390],eax .0040D971: E9373FFFFF jmp .0004018AD et .0040D980: 55 push ebp .0040D981: 8BEC mov ebp,esp .0040D983: 817D0C10000000 cmp [ebp+0C],0010 .0040D98A: 750E jne .00040D99A .0040D98C: FF7508 push [ebp+08] .0040D98F: FF15A0644000 call DestroyWindow .0040D995: E92D000000 jmp .00040D9C7 .0040D99A: 817D0C11010000 cmp [ebp+0C],000111 .0040D9A1: 7524 jne .00040D9C7 .0040D9A3: 8B4510 mov eax,[ebp+10] .0040D9A6: 3D89030000 cmp eax,000000389 .0040D9AB: 750E jne .00040D9BB .0040D9AD: FF7508 push [ebp+08] .0040D9B0: FF15A0644000 call DestroyWindow .0040D9B6: E90C000000 jmp .00040D9C7 .0040D9BB: 3D88030000 cmp eax,000000388 .0040D9C0: 7505 jne .00040D9C7 .0040D9C2: E829000000 call .00040D9F0 .0040D9C7: C9 leave .0040D9C8: C3 retn SERIAL-CALC .0040D9F0: 6A20 push 020 .0040D9F2: 68A0534000 push 0004053A0 .0040D9F7: 6884030000 push 000000384 .0040D9FC: FF7508 push [ebp+08] .0040D9FF: FF157C644000 call GetDlgItemTextA .0040DA05: 85C0 test eax,eax .0040DA07: 7501 jne .00040DA0A .0040DA09: 40 inc eax .0040DA0A: A3C0534000 mov [0004053C0],eax .0040DA0F: 6A10 push 010 .0040DA11: 68D0534000 push 0004053D0 .0040DA16: 6885030000 push 000000385 .0040DA1B: FF7508 push [ebp+08] .0040DA1E: FF157C644000 call GetDlgItemTextA .0040DA24: C605E053400000 mov [0004053E0],00 .0040DA2B: 33C0 xor eax,eax .0040DA2D: 33D2 xor edx,edx .0040DA2F: 33DB xor ebx,ebx .0040DA31: 8B0DC0534000 mov ecx,[0004053C0] .0040DA37: 8A82A0534000 mov al,[edx+4053A0] .0040DA3D: 8D1C43 lea ebx,[ebx+eax*2] .0040DA40: 42 inc edx .0040DA41: 3BCA cmp ecx,edx .0040DA43: 75F2 jne .00040DA37 .0040DA45: 81C321430000 add ebx,000004321 .0040DA4B: 81F334120000 xor ebx,000001234 .0040DA51: 53 push ebx .0040DA52: 689C104000 push 00040109C .0040DA57: 68F0534000 push 0004053F0 .0040DA5C: FF150C644000 call wsprintfA .0040DA62: 68D0534000 push 0004053D0 .0040DA67: 68F0534000 push 0004053F0 .0040DA6C: FF15B8634000 call lstrcmpA .0040DA72: 803DE053400000 cmp [0004053E0],00 .0040DA79: 0F85E1010000 jne .00040DC60 .0040DA7F: 85C0 test eax,eax .0040DA81: 742D je .00040DAB0 .0040DA83: 6A00 push 000 .0040DA85: 6810D84000 push 00040D810 .0040DA8A: 6830D84000 push 00040D830 .0040DA8F: 6A00 push 000 .0040DA91: FF15A8644000 call MessageBoxA .0040DA97: C9 leave .0040DA98: C3 retn GOODBOY .0040DAB0: 55 push ebp .0040DAB1: 8BEC mov ebp,esp .0040DAB3: 83EC04 sub esp,004 .0040DAB6: 8D45FC lea eax,[ebp-04] .0040DAB9: 50 push eax .0040DABA: 6848514000 push 000405148 .0040DABF: 6801000080 push 080000001 .0040DAC4: FF15F0624000 call RegCreateKeyA .0040DACA: 85C0 test eax,eax .0040DACC: 7541 jne .00040DB0F .0040DACE: 68A0534000 push 0004053A0 .0040DAD3: 6856524000 push 000405256 .0040DAD8: FF75FC push [ebp-04] .0040DADB: E85249FFFF call .000402432 .0040DAE0: 68D0534000 push 0004053D0 .0040DAE5: 6838D84000 push 00040D838 .0040DAEA: FF75FC push [ebp-04] .0040DAED: E84049FFFF call .000402432 .0040DAF2: FF75FC push [ebp-04] .0040DAF5: FF15E8624000 call RegCloseKey .0040DAFB: 6A00 push 000 .0040DAFD: 68C0D74000 push 00040D7C0 .0040DB02: 68E0D74000 push 00040D7E0 .0040DB07: 6A00 push 000 .0040DB09: FF15A8644000 call MessageBoxA .0040DB0F: FF7508 push [ebp+08] .0040DB12: FF15A0644000 call DestroyWindow .0040DB18: 8BE5 mov esp,ebp .0040DB1A: 5D pop ebp .0040DB1B: E948010000 jmp .00040DC68 TEST-REG .0040DB40: 55 push ebp .0040DB41: 8BEC mov ebp,esp .0040DB43: 83EC40 sub esp,040 .0040DB46: 8D4DFC lea ecx,[ebp-04] .0040DB49: 51 push ecx .0040DB4A: 6848514000 push 000405148 .0040DB4F: 6801000080 push 080000001 .0040DB54: FF15EC624000 call RegOpenKeyA .0040DB5A: 85C0 test eax,eax .0040DB5C: 7539 jne .00040DB97 .0040DB5E: 6A20 push 020 .0040DB60: 68A0534000 push 0004053A0 .0040DB65: 8D4DDC lea ecx,[ebp-24] .0040DB68: 51 push ecx .0040DB69: 6856524000 push 000405256 .0040DB6E: FF75FC push [ebp-04] .0040DB71: E83449FFFF call .0004024AA .0040DB76: 68A0534000 push 0004053A0 .0040DB7B: FF15B0634000 call lstrlenA .0040DB81: 85C0 test eax,eax .0040DB83: 7501 jne .00040DB86 .0040DB85: 40 inc eax .0040DB86: A3C0534000 mov [0004053C0],eax .0040DB8B: 6A10 push 010 .0040DB8D: 68D0534000 push 0004053D0 .0040DB92: 8B4DDC mov ecx,[ebp-24] .0040DB95: 51 push ecx .0040DB96: 6838D84000 push 00040D838 .0040DB9B: FF75FC push [ebp-04] .0040DB9E: E80749FFFF call .0004024AA .0040DBA3: FF75FC push [ebp-04] .0040DBA6: FF15E8624000 call RegCloseKey .0040DBAC: 8BE5 mov esp,ebp .0040DBAE: 5D pop ebp .0040DBAF: C605E053400001 mov [0004053E0],001 .0040DBB6: E970FEFFFF jmp .00040DA2B MSGBOX1-PEP .0040DBE0: 6A00 push 000 .0040DBE2: 6820D74000 push 00040D720 .0040DBE7: 6840D74000 push 00040D740 .0040DBEC: 6A00 push 000 .0040DBEE: FF15A8644000 call MessageBoxA .0040DBF4: 55 push ebp .0040DBF5: 8BEC mov ebp,esp .0040DBF7: 83EC44 sub esp,044 .0040DBFA: E9D334FFFF jmp .0004010D2 MSGBOX2-EXITPROC .0040DC20: 6A00 push 000 .0040DC22: 6820D74000 push 00040D720 .0040DC27: 6870D74000 push 00040D770 .0040DC2C: 6A00 push 000 .0040DC2E: FF15A8644000 call MessageBoxA .0040DC34: FF1598634000 call ExitProcess .0040DC3A: E90A35FFFF jmp .000401149 DESACTIV .0040DC60: 85C0 test eax,eax .0040DC62: 0F8578FFFFFF jne .00040DBE0 .0040DC68: C605EEDB400090 mov [00040DBEE],090 .0040DC6F: C6052EDC400090 mov [00040DC2E],090 .0040DC76: C60580C9400000 mov [00040C980],000 .0040DC7D: C6059EC9400000 mov [00040C99E],000 .0040DC84: C6054687400068 mov [000408746],068 ;"h" .0040DC8B: C6054887400061 mov [000408748],061 ;"a" .0040DC92: C6054A87400072 mov [00040874A],072 ;"r" .0040DC99: C6054C87400065 mov [00040874C],065 ;"e" .0040DCA0: C6054E87400070 mov [00040874E],070 ;"p" .0040DCA7: C6055087400061 mov [000408750],061 ;"a" .0040DCAE: C6055287400064 mov [000408752],064 ;"d" .0040DCB5: C6055487400020 mov [000408754],020 ;" " .0040DCBC: C60534CC400000 mov [00040CC34],000 .0040DCC3: 55 push ebp .0040DCC4: 8BEC mov ebp,esp .0040DCC6: 83EC44 sub esp,044 .0040DCC9: E90434FFFF jmp .0004010D2