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... 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 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. |