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 ;)