Et maintenant, un ch'tit coup de SHA-256 sur un autre crackme de JuLio eL NeGRo écrit en ASM Le gros avantage de l'ASM, c'est que le code n'est pas "perverti" par les mois de l'année, ou Dieu sait quels autres cochoneries qui viennet se rajouter lors de la compilation de langages "évolués". Et donc, en dehors de la création de la dialog box, la totalité du reste du code est consacré à la routine de cryptage, ce qui la rendra facile à ripper pour en faire un copié/collé dans un Key Generator, mais ce ne sera pas toujours aussi simple... Comme son copain MD5, SHA est initialisé: :00401023 mov dword_0_406804, 6A09E667h :0040102D mov dword_0_406808, BB67AE85h :00401037 mov dword_0_40680C, 3C6EF372h :00401041 mov dword_0_406810, A54FF53Ah :0040104B mov dword_0_406814, 510E527Fh :00401055 mov dword_0_406818, 9B05688Ch :0040105F mov dword_0_40681C, 1F83D9ABh :00401069 mov dword_0_406820, 5BE0CD19h Moins facile à identifier, j'ai juste fait une recherche sur le net en utilisant "6A09E667" comme clé, pour trouver immediatement ce site et la réponse à ma question: Description of SHA-1 and SHA-256 http://home.ecn.ab.ca/~jsavard/crypto/mi060501.htm The SHA-256 algorithm is very similar in structure to SHA-1, but
not only does it use eight, rather than five, 32-bit subblocks, but there are other ways in which it is not analogous.
Comme j'avais eu l'occasion de le dire un peu plus tôt, le calcul d'un hash n'est pas tout, sinon il suffirait d'utiliser un tool comme celui de DAMN pour solutionner le crackme: La réponse du Hash Calculator de DAMN va donner: Calculating hash of 8 bytes string `christal`...
Le crackme, lui, va dabord saisir le Name, et l'envoyer dans la routine de hashage: :00404457 CALL USER32!GetWindowTextA ; get the name :0040445C OR EAX,EAX ; si le champ n'est pas vide :0040445E JZ 004044A8 :00404460 PUSH 0040616C ; pousse le name :00404465 PUSH EAX ; pousse sa taille :00404466 PUSH 0040656C ; pousse adresse de stockage du hash SHA-256 :0040446B CALL 00401000 ; hachage du name :00404470 MOV ESI,0040656C ; récupère le hash:0040656C 0A E4 3A 9D 51 AD D5 8D-6F 75 E7 52 9B E6 79 70 ..:.Q...ou.R..yp :0040657C AD 7D 5B C6 8F 7B 97 77-1F 4F 51 1A 80 07 88 6F .}[..{.w.OQ....o :00404475 XOR ECX,ECX ; pointeur caractère :00404477 XOR EAX,EAX ; stockage du résultat :00404479 XOR EBX,EBX :0040447B MOV BL,[ESI+ECX] ; récupère une valeur du hash :0040447E TEST BL,BL ; vérifie que ce n'est pas la dernière :00404480 JZ 00404490 ; sinon -> out vers XORage :00404482 IMUL EBX,ECX ; bidouille 1 :00404485 IMUL EBX,EBX ; bidouille 2 :00404488 ADD EBX,50 ; bidouille 3 :0040448B ADD EAX,EBX ; stock le résultat :0040448D INC ECX ; incrémente pointeur caractère :0040448E JMP 00404479 :00404490 XOR EAX,12345678 ; et à la sortie, le résultat est XORé :00404495 PUSH EAX ; avant d'être transformé en string :00404496 PUSH 00406078 ; et d'être comparé avec le serial :0040449B PUSH 0040676C :004044A0 CALL USER32!wsprintfA :004044A5 ADD ESP,0C :004044A8 RET Bref, rien de compliqué quand on a les bons outils... |