Dans le KeygenMe #2 de TMG codé par tHE EGOiSTE, les String Data d'IDA ne donnent rien, et pour cause,
la seule série des Data ressemblant à une valeur RSA est codée ainsi:
DATA:00402000 unk_0_402000 db 0Ah
DATA:00402001 db 0
DATA:00402002 db 0D2h ; Ê
DATA:00402003 db 0E9h ; Ú
DATA:00402004 db 0BFh ; +
DATA:00402005 db 9Bh ; ø
DATA:00402006 db 3Dh ; =
DATA:00402007 db 25h ; %
DATA:00402008 db 8Eh ; Ä
DATA:00402009 db 47h ; G
DATA:0040200A db 9Dh ; Ø
DATA:0040200B db 8Ch ; î
DATA:0040200C db 0C2h ; -
DATA:0040200D db 3Ch ; <
DATA:0040200E db 7Ah ; z
DATA:0040200F db 33h ; 3
DATA:00402010 db 0E1h ; ß
DATA:00402011 db 0F8h ; °
DATA:00402012 db 0EBh ; Ù
DATA:00402013 db 0B3h ; ¦
DATA:00402014 db 0ADh ; ¡
DATA:00402015 db 0B1h ; ¦
Soit D2E9BF9B3D258E479D8CC23C7A33E1F8EBB3ADB1, ce qui pourrait bien être un
Modulus...
Par contre, pas de trace d'une clé publique (10001, 65557... à ce sujet 10001h = 65557d !)
Comme la chaîne est déjà au format hexa, il y a fort à parier qu'il ne faudra pas s'attendre
à trouver une chaîne alphanumérique contenant le bon serial, et qu'il faudra guetter les big
numbers dans la fenêtre des Datas...
tHe EGOiSTE ayant écrit son crackme en assembleur, il est très facile de tracer le programme, et
par la suite de ripper les fonctions qui seront intéressantes:
0040128E MOV EDI,00402230 ; load Magic adresse
00401293 XOR EAX,EAX ; EAX = 0
00401295 PUSH 05
00401297 POP ECX
00401298 REPZ STOSD ; efface son contenu
0040129A DEC EAX ; EAX = -1
0040129B MOV ESI,004020F0 ; esi = Name
004012A0 MOV EDI,00402230 ; Magic adresse
004012A5 MOV ECX,[EBP-04] ; ECX = taille du name
004012A8 XOR EDX,EDX ; edx est un pointeur
004012AA LODSB ; charge une lettre du name
004012AB XOR AH,AL ; Xor -> c'est la base du "cryptage" du name
004012AD IMUL EAX,EAX,89177313 ; bidouilles pour modifier la valeur de la lettre chargée
004012B3 AND EAX,55AA55AA |
004012B8 IMUL EAX,EAX,12299381 |
004012BE XOR EAX,AA55AA11 |
004012C3 IMUL EAX,EAX,61 |
004012C6 XOR AH,AL |
004012C8 OR EAX,10030118 |
004012CD IMUL EAX,EAX,00988279 |
004012D3 RCL EAX,CL V
004012D5 XOR [EDX+EDI],EAX ; xor le résultat avec le contenu de Magic Adresse (initialisé à 0)
:00402230 E0 31 EE EF 7A AD CE 46-F2 80 BF E1 16 84 CC 23
:00402240 1A AB C3 04 00 00 00 00-00 00 00 00 00 00 00 00
004012D8 ADD EDX,03
004012DB AND EDX,0F
004012DE INC EDX ; pointera sur le caractère suivant
004012DF DEC ECX ; ecx = taille de la string Name à traiter
004012E0 JG 004012AA ; loop jusqu'à concurrence de 40 caractères traités
004012E2 MOV ESI,00402170 ; charge le serial entré
004012E7 MOV EDI,00402230 ; load la magic Adresse
004012EC MOV ECX,[EBP-08] ; ECX = taille de la Compagny
004012EF XOR EDX,EDX ; et on recommence la même chose
004012F1 LODSB ; avec le serial entré
004012F2 SUB AH,AL ; en continuant à modifier la
004012F4 IMUL EAX,EAX,89157313 ; Magic Adresse
etc...
00401327 JG 004012F1
etc...
pour arriver ici:
00401329 SUB EAX,[EDI+08]
0040132C IMUL EAX,EAX,34814815
00401332 ADD [EDI+10],EAX
00401335 SHR EAX,0B
00401338 AND EAX,03
0040133B MOV [EDI],AL
0040133D PUSH 00402270 ; adresse de destination du calcul RSA
00401342 PUSH 00402370 ; 0A00E031EE... contenu de la Magic Adresse
00401347 PUSH 00402000 ; 0A00D2E9BF9... chaîne trouvée dans les Data
0040134C CALL 004013CD ; RSA decrypt
Vous n'aurez pas été sans remarquer qu'il n'y a pas de Public Exponent
de poussé en paramètre, le conclusion logique étant que nous sommes sur une phase de décryptage
du Cipher Text (stocké dans la Magic Adresse), soit: M
= C ^ D MOD N
Petite particularité du cryptage à la tHE EGOiSTE, le premier WORD contient le nombre de bits RSA
dans laquelle la chaîne est décryptée. Ici nous sommes sur un cryptage 160 bits (160/16=0Ah)
00401351 PUSH 05
00401353 POP ECX ; nombre de DWORDs de la chaîne à contrôler.
00401354 MOV ESI,00402272 ; load le résultat du calcul RSA (sans le 0A00)
00401359 MOV EDI,00402230 ; load l'adresse où est stocké le serial entré
0040135E LODSD
0040135F XOR [EDI],EAX ; xor les 2 chaînes entre elles, DWORD par DWORD.
00401361 JNZ 00401382 ; Si elles sont identiques, le résultat sera 0 -> sinon Go Out
00401363 ADD EDI,04 ; passe au DWORD suivant
00401366 DEC ECX ; decremente le nb de dword (8x5=40)
00401367 JG 0040135E ; loop. Si ECX = 0 -> GoTo Good Boy
Une chose assez surprenante, avec beaucoup de programme utilisant des algorithmes
de cryptage, c'est que le bon serial apparaît souvent en clair, comme ici, dans la fenêtre des Data,
"neutralisant" les effets de l'utilisation de RSA...
Il ne reste plus qu'à ripper tout ca, et faire un Key Generator RSA 160 bits.
|