Name/ Lucifer48 #/ 1769421244 Name/ LUCIFER48 #/ 1230418876 Programme : JPad 2.0 PlateForme : Windows 95 Date : 13 septembre 1998, 15h53 Protection : Serialzzz Fichier : jpad.exe Outils : Soft-ice v3.2 Ou ça? : http://www.modelworks.com/express PC Achat Numéro 2 - décembre 1996 Temps passé: Une heure tout au plus + la rédaction Cours : 18 Matos : Bloc-notes en 800*600 On s'attaque aujourd'hui à une protection qui utilise des informations contenues dans le fichier .ini qui se trouvent dans le répertoire de windows. Je sort mon artillerie: GetPrivateProfileSection GetPrivateProfileSectionA GetPrivateProfileSectionW GetPrivateProfileStruct GetPrivateProfileStructA GetPrivateProfileStructW GetPrivateProfileString GetPrivateProfileStringA GetPrivateProfileStringW GetPrivateProfileSectionNames GetPrivateProfileSectionNamesA GetPrivateProfileSectionNamesW GetPrivateProfileInt GetPrivateProfileIntA GetPrivateProfileIntW BPX GetPrivateProfileStringA est ce qu'il y a de plus utilisé (lorque le programme est en 32 bits évidemment). On lance le soft et on tombe sur une boîte "Welcome", "This is not free software. ..." avec deux options "OK" et "Unlock...". Je click sur "Unlock..." est je remplis les cases: Enter your ID: Lucifer48 Enter your key code: 11189196 Je pose un bpx hmemcpy et je valide, F5, F11, quelques pressions sur F12 est: XXXX:00474CB2 FF15B8DC4B00 CALL [USER32!GetWindowTextA] ;on sort d'ici (coup classique) XXXX:00474CB8 6AFF PUSH FF XXXX:00474CBA 8B4D10 MOV ECX,[EBP+10] ... Je trace les alentours, rien d'extraordinaire, je tombe en XXXX:00467C36 sur un CALL [USER32!EndDialog], on trace, on trace... et on tombe sur la seule information intéressante: Dans le CALL 00404260 (XXXX:00423198) Dans le CALL 004735B5 (XXXX:00404277) XXXX:0047364D FFB190000000 PUSH DWORD PTR [ECX+00000090] ; JPAD.INI XXXX:00473653 FF7510 PUSH DWORD PTR [EBP+10] ; Lucifer48 et plus loin, 11189196 XXXX:00473656 FF750C PUSH DWORD PTR [EBP+0C] ; 0x96022001, 0x96022002 XXXX:00473659 FF7508 PUSH DWORD PTR [EBP+08] ; Data XXXX:0047365C FF151CDB4B00 CALL [KERNEL32!WritePrivateProfileStringA] Ainsi nos informations sont simplement enregistrées dans le fichier jpad.ini, ce n'est donc pas le peine de perdre son temps à chercher une quelconque vérification de la validité de mon serial, la vérification est ailleurs... J'ouvre mon fichier .ini et je retourve mes infos: [Data] 0x96022001=Lucifer48 0x96022002=11189196 On a deux solutions: * la vérification s'opère donc lorque l'on lance le programme avant l'apparition de la boîte (nag-screen) "Welcome". Il faut néanmoins avoir entré un password en quittant le programme. * la vérification s'opère après la boîte "Welcome", lorsque l'on appuie sur "OK"; mais il faut là encore avoir préalablement entré un password via le boutton "Unlock..." (la vérification du serial n'est donc pas systématique, il faut en entrer un nouveau pour pouvoir se retrouver dans la procédure de test). Maintenant, il va faloir poser un breakpoint qui va s'arrêter au bon endroit. C'est là que BPX GetPrivateProfileStringA va m'aider. Je choisit la 2ème solution qui me paraît plus courte, j'entre de nouveau mon nom et mon serial et je click sur ok, et ça revient sous soft-ice (chic!): XXXX:00483EBB 8D8DE8EFFFFF LEA ECX,[EBP+FFFFEFE8] XXXX:00483EC1 51 PUSH ECX XXXX:00483EC2 FF7514 PUSH DWORD PTR [EBP+14] XXXX:00483EC5 FF7510 PUSH DWORD PTR [EBP+10] ;0x96022001, 0x96022002 XXXX:00483EC8 FF750C PUSH DWORD PTR [EBP+0C] ;Data XXXX:00483ECB FF1528DB4B00 CALL [KERNEL32!GetPrivateProfileStringA] XXXX:00483ED1 8D8DE8EFFFFF LEA ECX,[EBP+FFFFEFE8] Le premier arrêt du breakpoint est le bon, c'est le moment de tracer. Rien d'intéressant jusqu'au premier RET, par contre juste avant le deuxième RET... XXXX:00404227 8B45EC MOV EAX,[EBP-14] ;checksum du nom XXXX:0040422A 8B4DF4 MOV ECX,[EBP-0C] XXXX:0040422D 64890D00000000 MOV FS:[00000000],ECX XXXX:00404234 2B45E8 SUB EAX,[EBP-18] ;soustraction avec notre serial XXXX:00404237 5E POP ESI XXXX:00404238 83F801 CMP EAX,01 ;il faut que EAX=0 et pas 1 !!! XXXX:0040423B 1BC0 SBB EAX,EAX ;EAX=0 ou EAX=FFFFFFFF selon 'Carry' XXXX:0040423D 8BE5 MOV ESP,EBP XXXX:0040423F F7D8 NEG EAX ; NEG FFFFFFFF = 00000001 XXXX:00404241 5D POP EBP XXXX:00404242 C3 RET Il faut a l'issu de cette routine que EAX=1 et on est enregistré. On soutrait un checksum (calculé précédemment) avec la conversion de notre serial en héxa. Pour moi je trouve 697739BC - AABBCC = 68CC7DF0 <>0 donc ça ne va pas. 697739BC_h = 1769421244_d, j'essage et ça marche, plus de nag-sreen. C'est mon dernier tutorial du mois de septembre (et peut-être même de l'année). A+ LuCiFeR 48, 17h38