IDA
- The Interactive Disassembler - part 4
Voici la dernière partie de ce tutorial. Pour en conclure avec les
exports nous allons voir la production des fichiers .MAP que l'on pourra
utiliser par le symbol de loader de softice pour localiser les symbol tel
que les noms de fonctions, nom de variables ou quelques labels dans le code.
Puis l'utilisation du plugin ida2sice qui réalise un peu le meme
boulot en plus complet.
Les fichiers MAP
Pour produire un fichier MAP, on va dans le menu / file / produce / File
MAP. Examinons le contenu de ce genre de fichier pour en savoir un peu plus
:
Start Length Name Class 0001:00000000 000001000H CODE CODE 0002:00000000 000001000H DATA DATA
Address Publics by Value
0001:00000000 start
0001:0000002B DialogProc
0001:000000A9 _CheckProc
0001:0000015B GetModuleHandleA
0001:00000161 ExitProcess
0001:00000167 DialogBoxParamA
0001:0000016D GetDlgItem
0001:00000173 GetDlgItemTextA
0001:00000179 MessageBoxA
0001:0000017F SetDlgItemTextA
0001:00000185 SendMessageA
0001:0000018B SetFocus
0001:00000191 EndDialog
0002:00000000 hInstance
0002:00000004 aMydialog
0002:0000000D NameBuffer
0002:0000004D SerialBuffer
0002:0000008D Mess_5char
0002:000000B5 aBravoGoodSeria
0002:000000CB aErrorBadSerial
Program entry point at 0001:00000000
En gros,
il récapitule les noms utilisés dans IDA en faisant correspondre leurs adresses
réelles une fois mappées en mémoire.
On ne peux pas directement utiliser le fichier map avec Softice, il va falloir
le convertir avec un petit utilitaire qui se nomme "Msym.exe" que
l'on trouve dans le repertoire Util16 de Softice.
Très simple à utiliser il suffit de faire glisser le fichier .MAP
sur cet exe, qui produira un fichier .SYM
On lance le symbol loader de softice et on ouvre le fichier .SYM que
nous venons de produire, on clique sur load, le fichier sera alors traduit
et chargé dans le loader tel que :
.SYM file is for 32-bit module
=========================
C:\WINDOWS\Bureau\crackme\Crackme1.sym opened successfully
Translating C:\WINDOWS\Bureau\crackme\Crackme1.sym. . .
Translation of C:\WINDOWS\Bureau\crackme\Crackme1.sym successfully completed
Loading symbols for C:\WINDOWS\Bureau\crackme\Crackme1.sym. . .
Symbols for C:\WINDOWS\Bureau\crackme\Crackme1.sym successfully loaded
Maintenant toujours
avec le loader on ouvre le programme et on clique sur load. On va se retrouver
sous SoftIce qui a breaké à l'entry-point, (faites F10 pour sortir des
INVALID). On retrouve le code de SoftIce avec quelques symbols
decris dans le fichier .map.
Plug-in : ida2sice
Les fichiers MAP ne
prennent pas en charge tous les symbols que nous avons pu nommé sous IDA
et seuls les fonctions et noms de variables y figurent.
Nous pouvons y remédier avec ce petit plug-in (ida2sice) que vous
trouverez sur http://mostek.subcultural.com/.
Pour l'installer,
il suffit de prendre parmi le pack celui qui correspond à votre version
de IDA et de l'installer de le repertoire 'plugins'.
Il faudra ensuite modifier votre fichier Plugins.cfg toujours dans
ce meme repertoire et y ajouter les lignes suivantes :
Load_PDB_File pdb Alt-F12 0 ;This line is just for those that have pdb.plw in IDA\PlugIns dir. ;By default it uses Ctrl-F12 and that one we want to have for us. I2S_Setup i2s Ctrl-F12 2 I2S_Save_NMS i2s Shift-F12 1 I2S_Conversion i2s F12 0
Pour
accéder au plug-in sous IDA on passe par le menu / edit
/ plugins ou par ses raccourcis et on exporte le listing en fichier
.NMS à l'aide du plug-in.
On
retourne sous le loader de SoftIce et on ouvre ce fichier .NMS.
On le charge et on ouvre l'exe du programme, on charge ce dernier pour
breaker à son entry point avec cette fois ci les symbols manquant.
Voici quelques screens du résulat :
EAX=00401000 EBX=00000000 ECX=81972410 EDX=81972450 ESI=819723F0 EDI=00000000 EBP=0063FF78 ESP=0063FE38 EIP=00401002 O d I S z a P c CS=01B7 DS=01BF SS=01BF ES=01BF FS=333F GS=0000 -------------------------------------------------------------------------------- * ES:DI void * = 0x00000000 --------------------------------------------------byte-------------------------- 0030:00000000 00 00 00 00 65 04 70 00-16 00 CD 09 65 04 70 00 ....e.p.....e.p. 0030:00000010 65 04 70 00 54 FF 00 F0-79 EA 00 F0 21 EA 00 F0 e.p.T...y...!... 0030:00000020 00 00 00 D0 D2 08 A6 0A-3A 00 CD 09 52 00 CD 09 ........:...R... 0030:00000030 6A 00 CD 09 82 00 CD 09-9A 00 CD 09 65 04 70 00 j...........e.p. 0030:00000040 07 00 70 D0 4D F8 00 F0-41 F8 00 F0 E2 24 60 FD ..p.M...A....$`. 0030:00000050 39 E7 00 F0 40 02 B6 06-2D 04 70 00 28 0A B9 07 9...@...-.p.(... 0030:00000060 00 E0 00 F0 2F 00 8F 0A-6E FE 00 F0 04 06 B9 07 ..../...n....... 0030:00000070 1D 00 00 D0 A4 F0 00 F0-22 05 00 00 12 22 53 04 ........"...."S. 0030:00000080 A8 0F CA 00 45 04 CC 0F-F2 2F AF FC B2 22 83 FD ....E..../...".. 0030:00000090 03 00 D9 10 BC 0F CA 00-82 24 66 FD D0 0F CA 00 .........$f..... -------------------------------------------------------------------------------- 01B7:00400FFE FFFF INVALID start 01B7:00401000 6A00 PUSH 00 01B7:00401002 E84A010000 CALL KERNEL32!GetModuleHandleA 01B7:00401007 A300204000 MOV [hInstance],EAX 01B7:0040100C 6A00 PUSH 00 01B7:0040100E 682B104000 PUSH DialogProc 01B7:00401013 6A00 PUSH 00 01B7:00401015 6804204000 PUSH 00402004 01B7:0040101A FF3500204000 PUSH DWORD PTR [hInstance] 01B7:00401020 E838010000 CALL USER32!DialogBoxParamA 01B7:00401025 50 PUSH EAX 01B7:00401026 E82C010000 CALL KERNEL32!ExitProcess DialogProc 01B7:0040102B C8000000 ENTER 0000,00 01B7:0040102F 837D0C10 CMP DWORD PTR [EBP+uMsg],10 01B7:00401033 7419 JZ _CloseDlg 01B7:00401035 817D0C10010000 CMP DWORD PTR [EBP+uMsg],00000110 01B7:0040103C 7421 JZ _InitDlg 01B7:0040103E 817D0C11010000 CMP DWORD PTR [EBP+uMsg],00000111 01B7:00401045 7432 JZ _Command 01B7:00401047 B800000000 MOV EAX,00000000 01B7:0040104C EB57 JMP _LeaveProc _CloseDlg 01B7:0040104E 6A00 PUSH 00 01B7:00401050 FF7508 PUSH DWORD PTR [EBP+hWnd] 01B7:00401053 E82F010000 CALL USER32!EndDialog 01B7:00401058 B801000000 MOV EAX,00000001 ------------------------------------CRACKME1+0FFE------------------------------- :!screendump 1.txt |
EAX=00000110 EBX=0063FBE2 ECX=00000000 EDX=00008C22 ESI=00008C06 EDI=0063FB98 EBP=0063FB90 ESP=0063FB90 EIP=0040107C o d I S Z A p C CS=01B7 DS=01BF SS=01BF ES=01BF FS=333F GS=418F -------------------------------------------------------------------------------- * ES:DI void * = 0x54415000 --------------------------------------------------byte-------------------------- 0030:00000000 00 00 00 00 65 04 70 00-16 00 CD 09 65 04 70 00 ....e.p.....e.p. 0030:00000010 65 04 70 00 54 FF 00 F0-79 EA 00 F0 21 EA 00 F0 e.p.T...y...!... 0030:00000020 00 00 00 D0 D2 08 A6 0A-3A 00 CD 09 52 00 CD 09 ........:...R... 0030:00000030 6A 00 CD 09 82 00 CD 09-9A 00 CD 09 65 04 70 00 j...........e.p. 0030:00000040 07 00 70 D0 4D F8 00 F0-41 F8 00 F0 E2 24 60 FD ..p.M...A....$`. 0030:00000050 39 E7 00 F0 40 02 B6 06-2D 04 70 00 28 0A B9 07 9...@...-.p.(... 0030:00000060 00 E0 00 F0 2F 00 8F 0A-6E FE 00 F0 04 06 B9 07 ..../...n....... 0030:00000070 1D 00 00 D0 A4 F0 00 F0-22 05 00 00 12 22 53 04 ........"...."S. 0030:00000080 A8 0F CA 00 45 04 CC 0F-F2 2F AF FC B2 22 83 FD ....E..../...".. 0030:00000090 03 00 D9 10 BC 0F CA 00-82 24 66 FD D0 0F CA 00 .........$f..... -----_CloseDlg+0005------------------------------------------------------------- 01B7:00401053 E82F010000 CALL USER32!EndDialog 01B7:00401058 B801000000 MOV EAX,00000001 01B7:0040105D EB46 JMP _LeaveProc _InitDlg 01B7:0040105F 68E8030000 PUSH 000003E8 01B7:00401064 FF7508 PUSH DWORD PTR [EBP+hWnd] 01B7:00401067 E8F7000000 CALL USER32!GetDlgItem 01B7:0040106C 50 PUSH EAX 01B7:0040106D E80F010000 CALL USER32!SetFocus 01B7:00401072 B800000000 MOV EAX,00000000 01B7:00401077 EB2C JMP _LeaveProc _Command 01B7:00401079 8B4510 MOV EAX,[EBP+wParam] 01B7:0040107C 663DEA03 CMP AX,03EA 01B7:00401080 750A JNZ _TestNextId 01B7:00401082 FF7508 PUSH DWORD PTR [EBP+hWnd] 01B7:00401085 E81F000000 CALL _CheckProc 01B7:0040108A EB14 JMP _LeaveProc2 _TestNextId 01B7:0040108C 663DEB03 CMP AX,03EB 01B7:00401090 750E JNZ _LeaveProc2 01B7:00401092 6A00 PUSH 00 01B7:00401094 6A00 PUSH 00 01B7:00401096 6A10 PUSH 10 01B7:00401098 FF7508 PUSH DWORD PTR [EBP+hWnd] 01B7:0040109B E8DB000000 CALL USER32!SendMessageA _LeaveProc2 01B7:004010A0 B801000000 MOV EAX,00000001 ------------------------------------CRACKME1!CODE+0053-------------------------- :!screendump 2.txt |
EAX=00000110 EBX=0063FBE2 ECX=00000000 EDX=00008C22 ESI=00008C06 EDI=0063FB98 EBP=0063FB90 ESP=0063FB90 EIP=0040107C o d I S Z A p C CS=01B7 DS=01BF SS=01BF ES=01BF FS=333F GS=418F -------------------------------------------------------------------------------- * ES:DI void * = 0x54415000 --------------------------------------------------byte-------------------------- 01BF:0063FB9C 00000030 00000110 00000000 8BE00FF7 0............... 01BF:0063FBAC 000001BF 0063FBC4 BFF94407 418F8C06 ......c..D.....A 01BF:0063FBBC 0000418F 00000000 BFF719B8 00008C00 .A.............. 01BF:0063FBCC 0063FF68 BFF7186D 8BE00FF7 00000000 h.c.m........... -----DialogProc+0004------------------------------------------------------------ 01B7:0040102F 837D0C10 CMP DWORD PTR [EBP+uMsg],10 01B7:00401033 7419 JZ _CloseDlg 01B7:00401035 817D0C10010000 CMP DWORD PTR [EBP+uMsg],00000110 01B7:0040103C 7421 JZ _InitDlg 01B7:0040103E 817D0C11010000 CMP DWORD PTR [EBP+uMsg],00000111 01B7:00401045 7432 JZ _Command 01B7:00401047 B800000000 MOV EAX,00000000 01B7:0040104C EB57 JMP _LeaveProc _CloseDlg 01B7:0040104E 6A00 PUSH 00 01B7:00401050 FF7508 PUSH DWORD PTR [EBP+hWnd] 01B7:00401053 E82F010000 CALL USER32!EndDialog 01B7:00401058 B801000000 MOV EAX,00000001 01B7:0040105D EB46 JMP _LeaveProc _InitDlg 01B7:0040105F 68E8030000 PUSH 000003E8 01B7:00401064 FF7508 PUSH DWORD PTR [EBP+hWnd] 01B7:00401067 E8F7000000 CALL USER32!GetDlgItem 01B7:0040106C 50 PUSH EAX 01B7:0040106D E80F010000 CALL USER32!SetFocus 01B7:00401072 B800000000 MOV EAX,00000000 01B7:00401077 EB2C JMP _LeaveProc _Command 01B7:00401079 8B4510 MOV EAX,[EBP+wParam] 01B7:0040107C 663DEA03 CMP AX,03EA 01B7:00401080 750A JNZ _TestNextId 01B7:00401082 FF7508 PUSH DWORD PTR [EBP+hWnd] 01B7:00401085 E81F000000 CALL _CheckProc 01B7:0040108A EB14 JMP _LeaveProc2 _TestNextId 01B7:0040108C 663DEB03 CMP AX,03EB ------------------------------------CRACKME1!CODE+002F-------------------------- :? uMsg unsigned long = 0x30, "\0\0\00" :wmsg 30 0030 WM_SETFONT :!screendump 3.txt |
Voila de quoi faciliter un peu le debuggage avec tout ces repères,
comme dans le dernier exemple ou apres avoir posé un bpx sur DialogProc,
je regarde la valeur de uMsg puis la correspondance de sa valeur
avec sa constante symbolique qui nous indique ici que le message 30 correspond
à WM_SETFONT.
Conclusion
Voila
en gros ce qu'on peux faire avec IDA, ce tutorial prend 4 parties et il
reste tant à dire... J'espère que, pour ceux qui ne connaissait
pas IDA ou qui craignait un peu ce logiciel, votre vision à changé. Ce
que l'on peut retenir pour une bonne analyse en dead listing c'est de
bien connaitre l'assembleur, ses règles fondamentales et d'être
equipé d'une bonne documentation sur les fonctions utilisées en programmation.
Je ne peux que vous conseiller d'apprendre à programmer pour pouvoir progresser
efficacement dans le cracking....
Remerciements
à :
The
Blackbird et Gij pour leurs tutos sur IDA dont je me suis inspiré pour
la 1ere partie.
Mostek pour son exellent plugins ida2sice : http://mostek.subcultural.com/
Aux
membres de la Shmeitcorp ainsi qu'à tout les crackers et coders Fr qui
s'investissent dans des tutoriaux ou à developper des techniques et des
outils.
Et à Datarescue pour le developpement de ce fabuleux soft ;)
|