Dico Langues
On va essayer maintenant de cracker un programme en VB, et ceci en utilisant W32dasm, puis softice...
Le patch est à appliquer sur la version 8.93 de W32dasm, de plus je vous conseille d'utiliser deux
versions de W32dasm 8.93 ; l'une patchée l'autre non. Car j'ai remarqué (je ne suis pas le seul d'ailleur)
que la version patchée n'affiche pas toutes les Strings avec certains programmes.
Lets Go ...
Premiere constations concernant le programme :
- Messagebox au lancement du programme du programme
- L option "rechercher" nous est interdite
On fait une copie de sauvegarde de Dico Langues et on la desassemble avec la version de Wdasm patchée,
evidemment :)
On regarde les Strings et on trouve de nombreuses choses interessantes :
- "Version compl"
- "Version complete"
- "Version Shareware"
- "Attention Version shareware"
... + quelques trucs dans le meme genre et "\VB40bex.dat" (nous verrons cela plus tard)
1ere approche
Bon puisque l'on sait que la version complète est présente (cf DataString..), on va essayer de partir de ce que
l'on a quand on lance le programme. Si vous vous êtes debrouillez normalement quand vous lancez
le programme une boite de dialogue vous informe de notre misérable situation : "Attention Version Shareware"
On recherche donc ceci dans W32dasm et effectivement on le trouve, ce message y est d'ailleur présent une seule fois...(en 561C93)
Nous allons maintenant "remonter" dans le listing pour voir s'il existe un test ou quelque chose qui détermine si oui
ou non ce message doit s afficher. Un petit peu avant, en 516BFF on trouve " - Version Shareware", on continue a remonter puis on tombe sur "\Vb40bex.dat" bizarre, qu est ce que cela fait ici ??
Ca ressemble à une Dll pour Visual Basic, mais de toute évidence cela n'est pas le cas ... (c un ".dat")
Pour en avoir le coeur net je fais une recherche de ce fichier sur mon disque dur, et je le trouve dans .\Windows\System
Je l'éxamine il fait 3 octets => Ou la c'est léger tout ca, et ca confirme que ce fichier ne sert
certainement pas au programme de facon "directe" ... il se pourrait bien que ce soir une keyfiles
c'est a dire un fichier qui permet de determiner si oui ou non l utilisateur est enregistre.
On édite le fichier avec Notepad et je vois un seul caractère à savoir : 1
Là, je pense tout de suite à une seule chose, (et vous aussi) ; changez le 1 en 0, on le fais,
on enregistre la modification.. On relance le programme et Bingo ca marche on est enregistré...
Vraiment pas dur non ??
2eme approche
Bon on pourrait aussi patcher le programme ; attention c est vraiment beaucoups plus dur :)
Tout d abord la boite de message qui apparait au lancement :
Avant dans les Strings nous avions trouve
" - Version Shareware",
il suffit de remonter un peu pour voir s'il n'y a pas de test / saut conditionnel.
On en trouve un particulièrement intéressant ici :
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00516BBC(U)
|
:00516BC0 F7D8 neg eax
:00516BC2 8D4D98 lea ecx, dword ptr [ebp-68]
:00516BC5 66A350905100 mov word ptr [00519050], ax
* Reference To: MSVBVM50.__vbaFreeStr, Ord:0000h
|
:00516BCB FF1564035200 Call dword ptr [00520364]
:00516BD1 66391D50905100 cmp word ptr [00519050], bx
:00516BD8 0F843E010000 je 00516D1C => tiens tiens, mais ou est ce que cela nous amène
:00516BDE 8B37 mov esi, dword ptr [edi]
:00516BE0 8D4598 lea eax, dword ptr [ebp-68]
:00516BE3 50 push eax
:00516BE4 57 push edi
:00516BE5 FF5650 call [esi+50]
:00516BE8 3BC3 cmp eax, ebx
:00516BEA 7D0F jge 00516BFB
:00516BEC 6A50 push 00000050
:00516BEE 6858714C00 push 004C7158
:00516BF3 57 push edi
:00516BF4 50 push eax
* Reference To: MSVBVM50.__vbaHresultCheckObj, Ord:0000h
|
:00516BF5 FF1510025200 Call dword ptr [00520210]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00516BEA(C)
|
:00516BFB 8B4D98 mov ecx, dword ptr [ebp-68]
:00516BFE 51 push ecx
* Possible StringData Ref from Code Obj ->" - Version Shareware"
|
:00516BFF 68A87C4C00 push 004C7CA8
* Reference To: MSVBVM50.__vbaStrCat, Ord:0000h
|
:00516C04 FF1504025200 Call dword ptr [00520204]
:00516C0A 8BD0 mov edx, eax
:00516C0C 8D4D94 lea ecx, dword ptr [ebp-6C]
* Reference To: MSVBVM50.__vbaStrMove, Ord:0000h
|
:00516C0F FF1544035200 Call dword ptr [00520344]
:00516C15 50 push eax
:00516C16 57 push edi
:00516C17 FF5654 call [esi+54]
:00516C1A 3BC3 cmp eax, ebx
:00516C1C 7D0F jge 00516C2D
:00516C1E 6A54 push 00000054
:00516C20 6858714C00 push 004C7158
:00516C25 57 push edi
:00516C26 50 push eax
* Reference To: MSVBVM50.__vbaHresultCheckObj, Ord:0000h
|
:00516C27 FF1510025200 Call dword ptr [00520210]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00516C1C(C)
|
:00516C2D 8D5594 lea edx, dword ptr [ebp-6C]
:00516C30 8D4598 lea eax, dword ptr [ebp-68]
:00516C33 52 push edx
:00516C34 50 push eax
:00516C35 6A02 push 00000002
* Reference To: MSVBVM50.__vbaFreeStrList, Ord:0000h
|
:00516C37 FF1504035200 Call dword ptr [00520304]
* Reference To: MSVBVM50.__vbaVarCopy, Ord:0000h
|
:00516C3D 8B3D38035200 mov edi, dword ptr [00520338]
:00516C43 83C40C add esp, 0000000C
:00516C46 8D9560FFFFFF lea edx, dword ptr [ebp+FFFFFF60]
:00516C4C 8D4D9C lea ecx, dword ptr [ebp-64]
* Possible StringData Ref from Code Obj ->"Vous n'avez que la version shareware " => plus pour longtemps !
->"car vous ne vous "
|
:00516C4F C78568FFFFFF6C7D4C00 mov dword ptr [ebp+FFFFFF68], 004C7D6C
:00516C59 C78560FFFFFF08000000 mov dword ptr [ebp+FFFFFF60], 00000008
:00516C63 FFD7 call edi
* Reference To: MSVBVM50.__vbaVarMove, Ord:0000h
|
:00516C65 8B35DC015200 mov esi, dword ptr [005201DC]
:00516C6B 8D9560FFFFFF lea edx, dword ptr [ebp+FFFFFF60]
:00516C71 8D4DBC lea ecx, dword ptr [ebp-44]
:00516C74 C78568FFFFFF30000000 mov dword ptr [ebp+FFFFFF68], 00000030
:00516C7E C78560FFFFFF03000000 mov dword ptr [ebp+FFFFFF60], 00000003
:00516C88 FFD6 call esi
:00516C8A 8D9560FFFFFF lea edx, dword ptr [ebp+FFFFFF60]
:00516C90 8D4DDC lea ecx, dword ptr [ebp-24]
* Possible StringData Ref from Code Obj ->"Attention Version shareware" => Oh non!
|
:00516C93 C78568FFFFFF247E4C00 mov dword ptr [ebp+FFFFFF68], 004C7E24
:00516C9D C78560FFFFFF08000000 mov dword ptr [ebp+FFFFFF60], 00000008
:00516CA7 FFD7 call edi
:00516CA9 B904000280 mov ecx, 80020004
:00516CAE B80A000000 mov eax, 0000000A
:00516CB3 898D78FFFFFF mov dword ptr [ebp+FFFFFF78], ecx
:00516CB9 894D88 mov dword ptr [ebp-78], ecx
:00516CBC 8D8D70FFFFFF lea ecx, dword ptr [ebp+FFFFFF70]
:00516CC2 898570FFFFFF mov dword ptr [ebp+FFFFFF70], eax
:00516CC8 894580 mov dword ptr [ebp-80], eax
:00516CCB 8D5580 lea edx, dword ptr [ebp-80]
:00516CCE 51 push ecx
:00516CCF 8D45DC lea eax, dword ptr [ebp-24]
:00516CD2 52 push edx
:00516CD3 8D4DBC lea ecx, dword ptr [ebp-44]
:00516CD6 50 push eax
:00516CD7 51 push ecx
* Reference To: MSVBVM50.__vbaI4Var, Ord:0000h
|
:00516CD8 FF151C035200 Call dword ptr [0052031C]
:00516CDE 8D559C lea edx, dword ptr [ebp-64]
:00516CE1 50 push eax
:00516CE2 52 push edx
* Reference To: MSVBVM50.rtcMsgBox, Ord:0253h
|
:00516CE3 FF1534025200 Call dword ptr [00520234]
:00516CE9 8D9540FFFFFF lea edx, dword ptr [ebp+FFFFFF40]
:00516CEF 8D4DCC lea ecx, dword ptr [ebp-34]
:00516CF2 898548FFFFFF mov dword ptr [ebp+FFFFFF48], eax
:00516CF8 C78540FFFFFF03000000 mov dword ptr [ebp+FFFFFF40], 00000003
:00516D02 FFD6 call esi
:00516D04 8D8570FFFFFF lea eax, dword ptr [ebp+FFFFFF70]
:00516D0A 8D4D80 lea ecx, dword ptr [ebp-80]
:00516D0D 50 push eax
:00516D0E 51 push ecx
:00516D0F 6A02 push 00000002
* Reference To: MSVBVM50.__vbaFreeVarList, Ord:0000h
|
:00516D11 FF15F0015200 Call dword ptr [005201F0]
:00516D17 E998000000 jmp 00516DB4
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00516BD8(C)
|
:00516D1C 8B07 mov eax, dword ptr [edi]
:00516D1E 57 push edi
:00516D1F FF9028030000 call dword ptr [eax+00000328]
:00516D25 8D5590 lea edx, dword ptr [ebp-70]
:00516D28 50 push eax
:00516D29 52 push edx
* Reference To: MSVBVM50.__vbaObjSet, Ord:0000h
|
:00516D2A FF1530025200 Call dword ptr [00520230] => ben ca nous amène ici
:00516D30 8BF0 mov esi, eax
:00516D32 53 push ebx
:00516D33 56 push esi
:00516D34 8B06 mov eax, dword ptr [esi]
:00516D36 FF505C call [eax+5C]
:00516D39 3BC3 cmp eax, ebx
:00516D3B 7D0F jge 00516D4C
:00516D3D 6A5C push 0000005C
:00516D3F 685C7E4C00 push 004C7E5C
:00516D44 56 push esi
:00516D45 50 push eax
* Reference To: MSVBVM50.__vbaHresultCheckObj, Ord:0000h
|
:00516D46 FF1510025200 Call dword ptr [00520210]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00516D3B(C)
|
:00516D4C 8D4D90 lea ecx, dword ptr [ebp-70]
* Reference To: MSVBVM50.__vbaFreeObj, Ord:0000h
|
:00516D4F FF1560035200 Call dword ptr [00520360]
:00516D55 8B37 mov esi, dword ptr [edi]
:00516D57 8D4D98 lea ecx, dword ptr [ebp-68]
:00516D5A 51 push ecx
:00516D5B 57 push edi
:00516D5C FF5650 call [esi+50]
:00516D5F 3BC3 cmp eax, ebx
:00516D61 7D0F jge 00516D72
:00516D63 6A50 push 00000050
:00516D65 6858714C00 push 004C7158
:00516D6A 57 push edi
:00516D6B 50 push eax
* Reference To: MSVBVM50.__vbaHresultCheckObj, Ord:0000h
|
:00516D6C FF1510025200 Call dword ptr [00520210]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00516D61(C)
|
:00516D72 8B5598 mov edx, dword ptr [ebp-68]
:00516D75 52 push edx
* Possible StringData Ref from Code Obj ->" - Version complete" => Oh oh!
|
:00516D76 68707E4C00 push 004C7E70
* Reference To: MSVBVM50.__vbaStrCat, Ord:0000h
|
:00516D7B FF1504025200 Call dword ptr [00520204]
:00516D81 8BD0 mov edx, eax
:00516D83 8D4D94 lea ecx, dword ptr [ebp-6C]
* Reference To: MSVBVM50.__vbaStrMove, Ord:0000h
|
:00516D86 FF1544035200 Call dword ptr [00520344]
:00516D8C 50 push eax
:00516D8D 57 push edi
:00516D8E FF5654 call [esi+54]
:00516D91 3BC3 cmp eax, ebx
:00516D93 7D0F jge 00516DA4
:00516D95 6A54 push 00000054
:00516D97 6858714C00 push 004C7158
:00516D9C 57 push edi
:00516D9D 50 push eax
Donc, maintenant il suffit de remplacer le je 00516D1C que l'on trouve en 00516BD8 par un jne 00516D1C
En héxa la modification est la suivante : 0F843E010000 devient 0F853E010000
Puis, pour le message qui nous interdit l'utilisation de la fonction recherche nous allons procéder différement,
on va un peu se servir de Softice (faut poa l oublier celui là :).
En temps normal le BPX à poser serait messageboxa ou messageboxexa mais avec le VB
rien ne fonctionne de la même facon. Ici le message est appellé à l'aide de MSVBVM50.dll
Donc dans le répertoire ou vous avez installez SoftIce, éditez le fichier winace.dat et rajoutez cette ligne :
EXP=c:\windows\system\msvbvm50.dll
En Visual Basic, l'Api appellée pour crrer une boite de dialogue (msgbox en VB) est rtcmsgbox
Maintenant dans SoftIce tapez BPX msvbvm50!rtcmsgbox (s'il s'agissait d'un programme programmé en VB6
il faudrait poser le BPX suivant : BPX msvbvm60!rtcmsgbox)
donc on pose ce BPX puis on inscrit n'importe quelle lettre dans la fonction recherche, est Softice break,
on fait une fois F12 est on arrive ici :
015F:0050FEEC FF1534025200 CALL [MSVBVM50!rtcMsgBox] => le message annoncant que cette option nous est interdite
015F:0050FEF2 8D9540FFFFFF LEA EDX,[EBP-00C0]
015F:0050FEF8 8D4DCC LEA ECX,[EBP-34]
015F:0050FEFB 898548FFFFFF MOV [EBP-00B8],EAX
015F:0050FF01 C78540FFFFFF03000000 MOV DWORD PTR [EBP-00C0],00000003
015F:0050FF0B FFD7 CALL EDI
Cherchons maintenant ou le test déterminant si on a accès à cette fontion est situé
015F:0050FDF6 899D40FFFFFF MOV [EBP-00C0],EBX
015F:0050FDFC 899D3CFFFFFF MOV [EBP-00C4],EBX
015F:0050FE02 0F8420010000 JZ 0050FF28 => avec ce saut on évite le message
015F:0050FE08 57 PUSH EDI
015F:0050FE09 FF9604030000 CALL [ESI+00000304]
015F:0050FE0F 8D4D94 LEA ECX,[EBP-6C]
015F:0050FE12 50 PUSH EAX
015F:0050FE13 51 PUSH ECX
015F:0050FE14 FF1530025200 CALL [MSVBVM50!__vbaObjSet]
015F:0050FE1A 8BF0 MOV ESI,EAX
015F:0050FE1C 6844704C00 PUSH 004C7044
015F:0050FE21 56 PUSH ESI
015F:0050FE22 8B16 MOV EDX,[ESI]
015F:0050FE24 FF92A4000000 CALL [EDX+000000A4]
015F:0050FE2A 3BC3 CMP EAX,EBX
015F:0050FE2C 7D12 JGE 0050FE40
015F:0050FE2E 68A4000000 PUSH 000000A4
015F:0050FE33 6848704C00 PUSH 004C7048
015F:0050FE38 56 PUSH ESI
015F:0050FE39 50 PUSH EAX
015F:0050FE3A FF1510025200 CALL [MSVBVM50!__vbaHresultCheckObj]
015F:0050FE40 8D4D94 LEA ECX,[EBP-6C]
015F:0050FE43 FF1560035200 CALL [MSVBVM50!__vbaFreeObj]
015F:0050FE49 8B3538035200 MOV ESI,[MSVBVM50!__vbaVarCopy]
015F:0050FE4F 8D9560FFFFFF LEA EDX,[EBP-00A0]
015F:0050FE55 8D4DA4 LEA ECX,[EBP-5C]
015F:0050FE58 C78568FFFFFF04734C00 MOV DWORD PTR [EBP-0098],004C7304
015F:0050FE62 C78560FFFFFF08000000 MOV DWORD PTR [EBP-00A0],00000008
015F:0050FE6C FFD6 CALL ESI
015F:0050FE6E 8B3DDC015200 MOV EDI,[MSVBVM50!__vbaVarMove]
015F:0050FE74 8D9560FFFFFF LEA EDX,[EBP-00A0]
015F:0050FE7A 8D4DBC LEA ECX,[EBP-44]
015F:0050FE7D C78568FFFFFF30000000 MOV DWORD PTR [EBP-0098],00000030
015F:0050FE87 C78560FFFFFF03000000 MOV DWORD PTR [EBP-00A0],00000003
015F:0050FE91 FFD7 CALL EDI
015F:0050FE93 8D9560FFFFFF LEA EDX,[EBP-00A0]
015F:0050FE99 8D4DDC LEA ECX,[EBP-24]
015F:0050FE9C C78568FFFFFFA0734C00 MOV DWORD PTR [EBP-0098],004C73A0
015F:0050FEA6 C78560FFFFFF08000000 MOV DWORD PTR [EBP-00A0],00000008
015F:0050FEB0 FFD6 CALL ESI
015F:0050FEB2 B80A000000 MOV EAX,0000000A
015F:0050FEB7 B904000280 MOV ECX,80020004
015F:0050FEBC 898570FFFFFF MOV [EBP-0090],EAX
015F:0050FEC2 894580 MOV [EBP-80],EAX
015F:0050FEC5 898D78FFFFFF MOV [EBP-0088],ECX
015F:0050FECB 894D88 MOV [EBP-78],ECX
015F:0050FECE 8D8570FFFFFF LEA EAX,[EBP-0090]
015F:0050FED4 8D4D80 LEA ECX,[EBP-80]
015F:0050FED7 50 PUSH EAX
015F:0050FED8 8D55DC LEA EDX,[EBP-24]
015F:0050FEDB 51 PUSH ECX
015F:0050FEDC 8D45BC LEA EAX,[EBP-44]
015F:0050FEDF 52 PUSH EDX
015F:0050FEE0 50 PUSH EAX
015F:0050FEE1 FF151C035200 CALL [MSVBVM50!__vbaI4Var]
015F:0050FEE7 8D4DA4 LEA ECX,[EBP-5C]
015F:0050FEEA 50 PUSH EAX
015F:0050FEEB 51 PUSH ECX
015F:0050FEEC FF1534025200 CALL [MSVBVM50!rtcMsgBox] => le message
015F:0050FEF2 8D9540FFFFFF LEA EDX,[EBP-00C0]
015F:0050FEF8 8D4DCC LEA ECX,[EBP-34]
015F:0050FEFB 898548FFFFFF MOV [EBP-00B8],EAX
015F:0050FF01 C78540FFFFFF03000000 MOV DWORD PTR [EBP-00C0],00000003
015F:0050FF0B FFD7 CALL EDI
Ici non plus rien de bien compliqué, le "JZ 0050FF28" devient "JNZ 0050FF28"
En héxa : 0F8420010000 devient 0F8520010000