Racer (Hippo Games 2002) Crack LAME TUTORIAL -------------------------------------------- by deckard Nástroje : W32Dasm, SoftICE Racer je príma česká free gameska, ktorú si môžte stiahnuť odtiaľto : http://hippo.nipax.cz V gameske pri voľbe kariéra máte možnosť postupne budovať svoje auto, kupovať doň nové diely, závodiť, vyhrávať peniaze, kupovať ďalšie diely, po vyhraní všetkých pohárov postúpiť do vyššej triedy atď... Začneme s W32Dasm. Otvoríme si Racer.exe a pozrieme String Data References. Nájdeme si napr. hmmm , "Peníze : %d Kč". Skočíme tam. Tam uvidíme takúto rutinku : * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00410CFD(C) | :00410D4E 8B86D40B0000 mov eax, dword ptr [esi+00000BD4] :00410D54 8D4C241C lea ecx, dword ptr [esp+1C] :00410D58 50 push eax * Possible StringData Ref from Data Obj ->"Peníze : %d Kč" | :00410D59 685C4B4700 push 00474B5C :00410D5E 51 push ecx * Reference To: MSVCRT.sprintf, Ord:02B2h | :00410D5F E838B80500 Call 0046C59C Ak si pozrieme definíciu API funkcie sprintf v helpe k API funkciám (tento nájdeme napr. v MS VC, Delphi atď), tak uvidíme toto : int sprintf( char *buffer, const char *format [, argument] ... ); Táto funkcia slúži na sformátovanie textového výstupu a jeho uloženie do buffera, napr. int i = 15; sprintf( buffer, "Number: %d\n", i ); do buffera uloží reťazec "Number: 15". Ak sa ešte raz pozrieme na našu rutinku, môžme ju teda zjednodušene okomentovať takto : :00410D4E mov eax, dword ptr [esi+00000BD4] // do EAX dáme číslo z tejto // adresy :00410D54 lea ecx, dword ptr [esp+1C] // do ECX dáme efektívnu adresu // ESP + 1Ch - skutočnú adresu :00410D58 push eax // push čísla, ktoré sa dosadí namiesto %d // - teda v našom prípade množstvo peňazí :00410D59 push 00474B5C // push adresy, kde je text "Peníze : %d Kč" :00410D5E push ecx // push adresy, kam sa uloží sformátovaný // výstup :00410D5F Call MSVCRT.sprintf // zavolanie sprintf Pozor! Do zásobníka sa parametre funkcie PUSHujú presne v opačnom poradí ako sa zadávajú v C ! Teda už je nad slnko jasnejšie, že na adrese ESI+00000BD4 leží náš majetok. Zostáva zisťiť, čo obsahuje register ESI. Na to (keďže deckard je lenivý do disassemblingu :o) ) použijeme SoftICE. Zapíšeme si adresu :00410D58, kde sa nám PUSHuje ten náš majetok, aby sme si potom mohli nastaviť breakpoint. Spustíme hru. Zvolíme Kariéru a pozrieme sa do Autoservisu. Tam si zistíme, koľko máme peňazí a vrátime sa späť. Potom sa prepneme do SoftICE - CTRL+D. Nastavíme si breakpoint na vykonanie inštrukcie na adrese, ktorú sme si zapísali takto : BPM 00410D58 X , kde BPM je breakpoint na prístup do pamäte a X na konci znamená, že breakpoint je na vykonanie inštrukcie na tejto adrese. CTRL+D sa vrátime späť do hry. Zase dáme Autoservis a mal by nám vyskočiť S-ICE s našim breakpointom v našej známej rutinke. Obsah pamäte, kde je uložený počet našich bubákov si vypíšeme takto : d ESI + 00000BD4 Teraz by sme mali v dátovom okne (ak nemáme dátové okno, tak si ho zapneme WD) vidieť prvé 4 bajty, ktoré znamenajú počet našich bubákov. Suma sa vypočíta takto : 1b 2b 3b 4b - to sú bajty v poradí ako ich tam vidíme. U mňa je to momentálne takto : BE 00 02 00. A sumu v hre som mal takúto 131262. Táákže : 00 02 je horný "word" a BE 00 je spodný "word". Z horného "wordu" je 00 horný "bajt" a 02 spodný bajt. Podobne aj pre spodný "word". 02h = 2 dekadicky a BFh = 190 dekadicky. 00h je 0 dekadicky ... :o) Takže počítame : 0*256 + 2 = 2 - to je horný "word" celkove. 0*256 + 190 = 190 - to je spodný "word" celkove. 2*65536 + 190 = 131262 ! čo je môj skromný majetok. Takže hurá na zvýšenie majetku ! Prepneme sa kurzorom na dátové okno na oné spomínané bajty a hneď a zaraz ich prepíšeme na 33 33 33 33 (nedávam tam radšej väčšie, lebo ktovie ... extrémy nie sú dobré - veď si to skúste :o) ). Zrušíme breakpoint príkazom BC * a vrátime sa späť do hry. Áááách, to je pohľad. Stav nášho konta : 858 993 459. Hneď sa lepšie nakupuje. Môj Dodge Viper je raz dva o čosi lepší. Toto snáď neminiete počas celej kariéry. A ostane nám to aj po ukončení hry a opätovnom naštartovaní, pretože kariéra sa sejvuje... A ak by ste to predsa len minuli, tak čo vám bráni urobiť tento trik znovu ? :o))) Ja viem, lepšie by bolo zistiť, kde sa tie peniaze odčítajú pri nákupe a zrušiť to, ale to sa mi nechce, a okrem toho, aspoň máte nad čím dumať ... Krátky odpich : skúste si dať breakpoint nie na api funkciu ani na konkrétne miesto v pamäti, ale na oblasť pamäte, a zrovna tam, čo je tam uložené množstvo peňazí ... bye comments to deckard@atlas.cz