MD5

Le premier programme auquel nous allons nous intéresser est un crackme à serial unique écrit en Delphi et compressé par UPX.

Une fois décompressé (en utilisant l'option "Decompress" d'UpxGui), IDA va avoir des choses à dire (View -> Open subwiews -> Strings) :

"a5ba6896"
"MD5"
"serial valide"

Pas compliqué de deviner ici qu'il s'agit d'un hashage MD5....
Par contre, l'espèce de serial semble très prometteur :

:00441065  mov     edx, dword ptr [ebp-08]  > edx = caractères entrés
...
:00441087  mov     eax, dword ptr [ebp-04]  > eax = hash corespondant
...
:004410A1  mov     eax, dword ptr [ebp-04]  > eax = 8 derniers bytes du hash

* Possible StringData Ref from Code Obj ->"a5ba6896"
:004410A4  mov     edx, 004410FC            > edx = a5ba6896
:004410A9  call    00403C74                 > comparaison avec les 8 derniers bytes du hash_serial_entré
:004410AE  jne     004410C8                 > Pas Glop ! c'est la sortie
:004410B0  push    00000000                 > Glop Glop ! la MsgBox s'affiche.
:004410B2  mov     ecx, 00441108

* Possible StringData Ref from Code Obj ->"serial valide"
:004410B7  mov     edx, 0044110C            > serial valide

Et le tout l'un au-dessus de l'autre, il n'y a plus à hésiter !

Reste que dans ce cas précis, il sera nécessaire de bricoler un MD5 Brute Forcer testant des valeurs numériques puis alphanumériques. Heureusement, le serial sera de type décimal, composé de 4 caractères, et rapide à trouver. (mode d'emploi: vous entrez le DWORD recherché dans la quatrième case, vous indiquez que la recherche doit se faire entre 1 et 99999 par exemple dans les valeurs mini/maxi et vous cliquez sue "Search")

MD5 recoit, lors de son initialisation (c'est une de ses caractèristiques), une chaine de caractères typiques:

DATA:00442050 a0123456789abcdef_0 db '0123456789ABCDEF'

Suivant les programmeurs, elle est, ou non, en clair.
En soit même, une telle chaîne de caractères n'est pas spécifique aux fonctions de Hash MD5, mais lorqu'elle apparait codé ainsi:

30 31 32 33 34 35 36 37-38 39 61 62 63 64 65 66  0123456789abcdef
01 23 45 67 89 AB CD EF-FE DC BA 98 76 54 32 10  .#Eg........vT2. (le #Eg est significatif)

il va falloir commencer à regarder dans la fenêtre des Data si un hash n'apparait pas...

Mais cette string n'est pas toujours apparente dans les Strings Ref
Bien souvent, même, elle sera initialisée ainsi:

:00401800  mov     dword ptr [ecx],     067452301h   ; Possible Hash found can be SHA-1 or MD5a or Ripe-MD !!!
:00401806  mov     dword ptr [ecx+4],   0EFCDAB89h
:0040180D  mov     dword ptr [ecx+8],   098BADCFEh
:00401814  mov     dword ptr [ecx+0Ch], 010325476h

Vous vous doutez bien que la jolie petite phrase en bleu n'est pas apparue magiquement lors du déssasemblage.
Et bien SI!
Grace à un fichier IDC (écrit par Snacker & Defiler pour IDA), la routine d'implantation a été immédiatement repérée.
(touche F2 -> choix du fichier
hashfinder.idc que vous aurez judicieusement placé dans le répertoire ad'hoc).

MD5 est tout simple et ne pose pas de problème, par contre il est souvent utilisé combiné avec un autres algo, et bien souvent du RSA...

Les informations ci dessus ont été complétées grace au travail et aux scripts de WinTerMiNator, Roy (et sa fameuse BigLib), HCCC6, tHE EGOiSTE, cryptosec.lautre.net