Comment cracker un 'CD-CHECk'
Exemple : Myth II
Matériel nécessaire :
Wdasm32
Un éditeur héxadécimal (Hex WorkShop ou Hedit par exemple)
Mise en situation...
Quand vous lancez le jeu sans le CD, une image vous demande de l'inserer !
Il n'y a pas de MessageBox, donc il faut proceder autrement que d'habitude...
Pas de probleme, on va le cracker. Faites deux copies de MythII.exe.
Appellez la premiere 'WDASMyth2.exe' et l'autre 'BAKUP.EXE'...
Maintenant lancez W32DASM et desassemblez 'WDASMyth2.exe'.
Quand le fichier est decompilé cliquez sur le bouton 'Imports Functions'.
Pourquoi 'Imports Funtions' and pas 'String Data reference' comme d'hab ?
Parceque le message d'erreur n'est pas sous forme de MessageBox,
mais est integré dans le jeu sous forme d'image.
Dans les 'Imports functions', double-cliquez sur 'KERNEL32.GetDriveTypeA'.
Cette fonction determine si un support est un CD-Rom ou un Disque Dur,
et permet donc de realiser un 'Cd-CHECk' (en sus, ya d'aure infos du style
Nom_du_volume, taille_du_disque...) C'est donc cette fonction qui va nous interresser !
Au premier 'double-clique', vous tombez sur un petit bout de code...
Ce n'est pas l'endroit qui nous interesse.
Pourquoi ? Eh ben, sachez que la fonction GetDriveTypeA differencie le type
de support suivant un code (de 1 a 7 je crois..) et le CD-Rom a le code '5'.
Regardez donc en 4870D6...Si vous voyer une ligne comme ca a coté d'un GetDriveTypeA,
vous pouvez etre quasi sur que c'est la routine du CD-Check !
Recliquez donc sur 'KERNEL32.GetDriveTypeA' afin d'atterir sur cette partie du code :
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00487170(C) | * Possible Reference to String Resource ID=00001: "Myth II" | :004870B2 BA01000000 mov edx, 00000001 :004870B7 8ACB mov cl, bl :004870B9 D3E2 shl edx, cl :004870BB 8AC3 mov al, bl :004870BD 0441 add al, 41 :004870BF 88442410 mov byte ptr [esp+10], al :004870C3 85D5 test ebp, edx :004870C5 0F84A0000000 je 0048716B <-- jump vers le debut du CD-CHECK :004870CB 8D442410 lea eax, dword ptr [esp+10] :004870CF 50 push eax * Reference To: KERNEL32.GetDriveTypeA, Ord:00DFh | :004870D0 FF1520495B00 Call dword ptr [005B4920] :004870D6 83F805 cmp eax, 00000005 <-- Verifie qu'il y a le CD. :004870D9 0F858C000000 jne 0048716B <-- Si non, jump au debut du 'CD-Check' :004870DF 8A0D103E5500 mov cl, byte ptr [00553E10] :004870E5 33C0 xor eax, eax <-- Le test 'Cd-Check' a échoué :004870E7 884C2418 mov byte ptr [esp+18], cl :004870EB B93F000000 mov ecx, 0000003F :004870F0 8D7C2419 lea edi, dword ptr [esp+19] :004870F4 6A00 push 00000000 :004870F6 F3 repz :004870F7 AB stosd :004870F8 66AB stosw :004870FA 6A00 push 00000000 :004870FC 6A00 push 00000000 :004870FE 6A00 push 00000000 :00487100 6A00 push 00000000 :00487102 AA stosb :00487103 8D54242C lea edx, dword ptr [esp+2C] :00487107 68FF000000 push 000000FF :0048710C 8D442428 lea eax, dword ptr [esp+28] :00487110 52 push edx :00487111 50 push eax . .. ... .... Un peu plus loin dans le listing, vers la fin de la routine du 'CD-Check'... * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00487156(U) | :0048715D 85C0 test eax, eax <-- Test si eax=0 :0048715F 741B je 0048717C <-- jump si vous avez le CD (eax=0) :00487161 EB08 jmp 0048716B <-- Jump vers le 'CD-CHECk' (eax<>0) * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:004870C5(C), :004870D9(C), :00487161(U) | :0048716B 43 inc ebx <- ici, ebx est incrementé a chaque passage :0048716C 6683FB19 cmp ebx, 0019 <- au bout de 20 passage on quitte le Cd Check :00487170 0F8E3CFFFFFF jle 004870B2 <- Appelle GetDriveTypeA :00487176 8B442414 mov eax, dword ptr [esp+14] :0048717A EB05 jmp 00487181 <-- Le 'CD-check' a échoué. * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0048715F(C) | * Possible Reference to String Resource ID=00001: "Myth II" | :0048717C B801000000 mov eax, 00000001 <-- Ok, le Cd est reconnu ! * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0048717A(U) | :........ ........... ................... => vers la suite du listing...
:0048717C B801000000 mov eax, 00000001Donc, en fait, on pourrait tout simplement nopper le saut en 48717A et on irai