După cum spune şi titlul topicului, în continuare învăţa cum să aplicăm un patch jocului BitSnake folosind OllyDbg.
Pentru început, vom avea nevoie de:
- OllyDbg, pe care îl putem descărca de aici;
- BitSnake, pe care îl putem descărca de aici. În exemplul de faţă, a fost folosită varianta aceasta aşa că, pentru a obţine aceleaşi rezultate, vă recomand să o descărcaţi tot pe asta;
- Cunoştinţe minime de ASM: deşi pentru patch-ul de faţă, nu sunt necesare cine ştie ce cunoştinţe de ASM, ele ajută la o mai bună înţelegere. Totuşi, în continuare, voi încerca să ma axez pe partea practică, teoria va fi lăsată la latitudinea fiecăruia dintre voi.
Acum, dacă aveţi toate recuzitele necesare, puteţi intra în BitSnake pentru a vedea despre ce este vorba. După cum probabil aţi ghicit, este un joc clasic, acela în care un şarpe trebuie să mănânce cât mai multă mâncare fără a muri. În cazul de faţă, şarpele moare atât la coliziunea cu sine cât şi cu pereţii. Atunci când şarpele moare, este afişat un mesaj ('That must've hurt*') şi jocul o ia de la început.
Ce vom încerca noi să facem este să modificăm programul astfel încât să nu putem muri niciodată! Pentru a face asta însă, trebuie să găsim locul în care scorul este resetat şi este afişat mesajul şi să ne asigurăm că nu se va executa niciodată. Sună interesant? Atunci haideţi să trecem la treabă!
Pentru început, vom deschide aplicaţia în Olly Debugger.


Acum vom căuta după textul care este afişat atunci când jocul este pierdut. Pentru a face asta, vom folosi opţiunea "Search for binary string" - Ctrl+B.

Introducem textul pe care îl căutăm în prima căsuţă şi dăm click pe "Search".

Am găsit textul şi am avut un noroc chior: chiar deasupra sa este subrutina care este executată atunci când jocul este pierdut. Haideţi să vedem când este folosită această subrutină, folosind funcţia "Find references to selected command".
Atenţie: Un alt patch posibil pentru a ne asigura că subrutina nu se va executa niciodată este să înlocuim prima instrucţiune a ei cu RETN sau să umplem tot conţinutul ei cu NOP-uri. Metoda pentru care am optat însă prezintă şi alte opţiuni ale debuggerului care se dovedesc necesare în caz că vreţi să încercaţi ceva mai complex.

Din nou avem noroc: subrutina respectivă este folosită o singură dată în tot codul. Pentru a vedea exact unde, vom folosi funcţia "Follow in disassembler".

Hmmz ... interesant. Acum că am văzut unde este folosită funcţia, trebuie să vedem şi când este folosită. Aici intervine ASM-ul cu adevărat: cu doar două linii mai sus, avem instrucţiunea "JNE 00462CC2", care îi atribuie EIP-ului valoarea 00462CC2 dacă şi numai dacă flag-ul Zero are valoarea 0. Sau, mai pe româneşte, dacă flagul Zero are valoarea 1, înseamnă că am pierdut jocul. Altfel, jocul continuă. Ceea ce vrem să facem noi este deci să ne asigurăm că programul se va comporta mereu ca şi cum flagul Zero are valoarea 0. Pentru asta, vom înlocui intrucţiunea JNE cu instrucţiunea JMP, care nu este condiţionată şi sare direct la instrucţiunea menţionată.


Dacă aţi făcut modificarea corect, linia modificată ar trebui să fie acum roşie. Pentru a salva modificările, vom folosi funcţia "Copy to executable". În fereastra care apare, se dă click dreapta şi se selectează "Save file".


După ce închidem fereastra folosită pentru salvare şi revenim la cod, putem folosi tasta F9 pentru a testa cum se comportă noul program.

Se pare că ai devenit, într-adevăr foarte bun la acest joc! E ceva normal atunci când nu ai coliziuni, spun eu :].

În concluzie, cred că tutorialul a ieşit aşa cum vroiam: foarte simplu de înţeles şi de aplicat de către oricine. E de la sine înţeles că pentru chestii mai complicate (putem face şarpele să iasă printr-o parte şi să intre prin cealaltă, sau să apară mereu mâncarea exact în faţa sa spre exemplu) aveţi nevoie şi de cunoştinţe ASM, răbdare şi vin fiert, dar asta ţine doar de voi.
Mulţumiri lui DarkByte (cel care a creat jocul), lui Ciprian (de la el am aflat de smile-ul :]) dar şi vouă, celor care l-aţi citit şi nu aţi dat direct scroll până jos (n-aţi făcut asta, nu?).
© Mihai Agape
Welcome to BitCell. Click here to register !
