četvrtak, 2. veljače 2012.

Primjena naučenoga u igrama

Slijedi zabavni dio ASM-a, a to je primjena u igrama. Za primjer sam odabrao igru "Company of Heroes Tales of Valor" sa patchem 2.602

Važno je napomenuti da *traineri koji su napravljeni za ovaj patch neće raditi na drugim patchevima. Svaki patch donosi neke promjene u samom .exe ili .dll igre što onemogućava memory hakiranje jer se može dogoditi da trainer promjeni memoriju neke adrese koju nije trebao te se u najboljem slučaju ne dogodi ništa, a u ekstremnim slučajevima je moguće i zablokiranje cijelog sustava nakon kojega morate restartirati računalo. Znači koristite trainer samo za onu verziju igre za koju je namjenjen.
*trainer= program koji se direktno ubacuje u proces igre te mijenja vrijednosti na određenoj memorijskoj lokaciji

Za početak pokrenimo COH ToV i uđimo u skrimish ili kampanju, svejedno...
Namjestimo po volji uvjete igre:

Pritiskom na Alt+Tab vratimo se na desktop te otvorimo Ch
eat Engine ili slični program (ja koristim CE 6.1 verziju)
Otvorimo RelicCOH.exe proces pritiskom na open proces dugme (ispod File menu-a). Recimo da želimo imati jako puno manpowera. Trebamo tražiti broj manpowera koji trenutno imamo, pogledati 6. post ako ste zaboravili kako tražiti.
Najlogičnije bi bilo da je manpower cijeli broj pa pokušajmo potražiti. Trenutno imam 249 manpowera i tražim 249 sa 4 byta, dobio sam oko 800 adresa koji sadržavaju broj 249. Da bi smanjili broj adresa uđemo natrag u igru i igramo par sekundi dok se broj manpowera ne poveča. Kad se povečao (meni trenutno na 257) probamo ponovo potražiti, no naičići ćemo na 1 problem. Dobit ćemo 0 adresa sa našim brojem manpowera.


Riješenje je dakako traženje manpowera u float vrsti vrijednosti.
Tražimo vrijednost manpowera ispočetka:

Primjetimo kako ćemo na kraju dobiti 2 adrese koje imaju našu traženu vrijednost, simbolično sam ih nazvao real i fake premda su obje vrijednosti prave. Razlika je u tome da "real" adresa je adresa koja mijenja vrijednost u igri (omogućuje nam mijenjanje vrijednosti) dok "fake" adresa se koristi za neke druge kalkulacije i ako nju promjenimo prava vrijednost manpowera će se vratiti na staro.


Primjenimo naše znanje za ostale 2 vrijednosti Munition i Fuel.


Kada budete tražili AMMO i FUEL dobit ćete puno više od 2 adrese sa zajedničkim vrijednostima. Neka vas to ne omete, riješenje je vrlo lagano, pogledajte adresu od "real" manpower adrese i prave adrese za FUEL i AMMO će se nalaziti malo ispod prave adrese za MAN.

S ovim znanjem još uvijek ne možete napraviti trainera zbog pokazivača koji vam mijenjaju mjesto adrese za MAN, AMMO i FUEL. Čak i kad restartirate skirmish igru s istim početnim uvijetima mijesto adresa sa željenim vrijednostima će se promjeniti. U sljedećem postu (ako ga bude) ćete naučiti kako zauvijek znati na kojem su mijestu u memoriji prave adrese za ono što trebate.

ponedjeljak, 30. siječnja 2012.

Tipovi podataka i njihovo traženje

U ovom postu ću se pozabaviti tipovima podataka i traženju istih preko Cheat engina, gotovo isti postupak se može primjeniti u memory scannerima tipa TSearch i ARTMoney.
Možemo pretraživati različite vrijednosti od binarnih, 1 byta, 2 byta, 4 byta, 8 bytova, float, double, text, te niz bytova.

Integer odnosno cijeli broj ima 4 byta i njega ćemo najčešće morati tražiti opseg je od-2^31 do 2^31, dalje za decimalnu vrijednost tražit ćemo floating number, on ima opseg od -3.4*10^38 do 3.4*10^38
Text se gotovo nikad ne traži jer je u većini slučajeva kriptiran, a niz bytova se može tražiti u slučaju da znate niz bitova koji određuju neki željeni opcode koji želite naći, veoma korisno kada izađe patch za neki trainer, ali o tome kasnije.


Pretražujemo tako da prvo upišemo koju vrijednost želimo naći odnosno stavimo unknown initial value (nepoznata početna vrijednost) i kliknemo new scan, nakon toga će nam izbaciti rezltat odnosno najvjerojatnije više rezultata. Kako znati na kojoj je adresi to što želimo??
Zato postoji opcija next scan i u podizborniku scan type možemo birati šta želimo, recimo da u nekoj igrici imamo 3 života, skeniramo broj 3 u 4byte modu, izbacit će nam hrpu rezultata, ubijemo se (zvuči malo gadno, ali u biti ćete se puno puta morati žrtvovati kako biste dobili neograničen život) te skeniramo sa Decreased value odnosno skeniramo broj 2 ako znamo za koliko točno nam se smanji broj života itd. dok ne dođemo do prave adrese, velika je mogućnost da je ustvari pokazivač pokazuje na adresu na kojoj nam je vrijednost života, ali otom potom, to je za naprednije.


Također postoji opcija zaokruživanja brojeva na nekoliko decimala, rounding
Te vrlo korisna opcija ako znamo gdje treba gledati možemo računalu odrediti da pretražuje samo neki skup adresa, recimo znamo da se u određenoj igri adresa municije uvijek nalazi na adresi 17000000-18000000.

Traženje adresa (za traženje pokazivača) zahtjeva 4 byte traženje s uključenom Hex oznakom. Najčešće je naš pokazivač prvi na listi rezultata.

Vrlo korisno može biti i da tijekom skeniranja pauziramo ili ubrzamo igru što nam omogućuje opcija speed hack. Opcija može biti i vrlo zabavna u nekim igrama.


nedjelja, 29. siječnja 2012.

Najvažnije komande

Za razliku od strojnog jezika gdje je sve u binarnome obliku, u asemblerskome jeziku binarni kod zamjenjen je naredbom u obliku od 2 do 5 slova. Naredba u asemblerskome jeziku još se naziva opcode (skraćeno od operation code). Uz opcode postoji i adresa na kojoj se taj opcode izvršava te asemblerske direktive - varijable i komentari

evo i primjera:
adresa opcode naredba,varijable direktiva
000045a8 mov eax,[ecx] [232]

Sada ću objašnjavati najvažnije naredbe.
Započet ćemo od MOV koja se najčešće koristi. MOV a,b bi značilo kopiraj odnosno copy b u a

Primjena: MOV eax,[ebx] -->bi značilo kopiraj vrijednost od ebx u eax
MOV eax,A -->bi značilo kopiraj 10 u eax, primjetimo kako su valute u hex. obliku
MOV eax,ebx -->bi značilo kopiraj adresu od ebx u eax
MOV [eax],[ebx] -->se ne može napraviti jer računalo nezna u koju bi adresu stavilo vrijednost ebx, inače se 1 ili 2 primjer koristi kako bi izmjenili neku vrijednost

CMP je funkcija koja komparira 2 varijable, 2 iznosa
CMP eax,ebx

JMP je važna komanda jer ona označuje prijelaz u neki drugi dio koda, JMP komanda postoji u mnogo varijanti, najvažnije su:
JMP uvijek skače
JE skoči ako je jednako i JNE skoči ako prethodna funkcija nije jednaka
JA skoči ako je veće i JNA skoči ako nije veće
JB skoči ako je manje i JBE skoči ako nije manje

Kalkulacije:
inc eax -->dodaje vrijednost eax 1
add eax,2 -->dodaje vrijednosti sadržanoj u eax 2
dec eax -->oduzima vrijednost eax 1
sub eax,2 -->oduzima vrijednost sadržanoj u eax 2
NOP -->znači no operation odnosno kada želimo neku naredbu ukloniti ne možemo je jednostavno maknuti nego moramo na njezino mjesto upisati NOP, ako je naredba u više redova toliko redova koliko mičemo moramo napisati NOP

and eax,ecx -->eax I ecx, sjetite se logičkih operacija
or eax,ecx -->eax ILI ecx
xor eax,ecx -->negacija (eax I ecx)

To bi bile najvažnije naredbe, naprednije narebe možete vidjeti ovdje: (na engleskom)
http://www.laynetworks.com/assembly%20tutorials3.htm




subota, 28. siječnja 2012.

Rad s različitim brojevnim sustavima

U računalnom svijetu sve se svodi na binarni brojevni sustav, no da bi ljudi lakše mogli programirati uveden je dekadski i hexadecimalni brojevni sustav. binarni brojevni sustav se koristi samo kod logičkih operacija (i,ili,ne), hexalni se koristi za zapis adresa i njihovih produžetaka (offesetova) dok se dekadski koristi za zapis svih ostalih vrijednosti.
Za binarni brojevni sustav znamo da su znamenke 0 i 1, za decimalni 0,1,2,3,4,5,6,7,8,9, a za hexadecimalni brojevni sustav kojemu je baza (16) dodajemo još zanamenke a=10,b=11,c=12,d=13,e=14,f=15


Pretvaranje decimalnog u binarni ili hex. sustav je lagano kad imate windowsov calculator ili pored sebe neki malo bolji Casio no ako nemate pretvaranje je teško.

Pretvaranje bilo kojeg hex. broja u binarni možemo preko tablice, a pretvaranje bilo kojeg hex. broja ( i bilo kojeg broja bilo koje druge baze) u bazu s brojem 10 preko Hornerovog algoritma:

Također da bismo pretvorili broj s nekom bazom u bazu 10 možemo množiti na
klasičan način: 23A(16)-->2*16^2+3*16^1+10*16^0=570(10)
Prva znamenka * baza na redni broj te znamenke (krenuvši od 0) +
druga znamenka * baza na redni broj baze te znamenke... Da bismo pretvorili broj iz baze (10) u broj s nekom drugom bazom recimo (16) dijelimo broj koji želimo pretvoriti sa bazom u koji želimo pretvoriti i ostatak koji dobijemo je taj broj,
ali gledamo ga od gore:

570/16=35, ostatak=10(A) ^
35/16=2, ostatak=3 |
2/16=0, ostatak=2 | 23A
Napomena adrese idu od 00000000 do 7fffffff prema tome računati adrese bez kalkulatora je vrlo teško.







petak, 27. siječnja 2012.

Registri

U ovome postu ćemo nešto više reći o registrima. Šta su to uopće registri, registri su varijable koje koristi operatnivni sustav kako bi zapamtio određen podatak. Ekvivalent su im lokalne varijable u C jeziku. Ukupno postoji 8 vrsta registara i u većini slučajeva je nebitno koja je vrsta zbog toga što više manje svi registri mogu sadržavati bilo koji oblik podataka.

Pozabavit ćemo se 32 bitnim registrima jer se oni najviše spominju i koriste.

EAX najčešće registar na kojemu se izvode kalkulacije te se koristi kao i skladište određenog podatka
EBX koristi se kao skladište podataka, u 16. bitnim računalima se koristio kao glavni registar (onaj koji djeluje globalno)
ECX Registar koji se koristi za brojanje, kad imamo petlju najčešće je brojač smješten u ovoj varijabli, isto se koristi kao skladište
EDX skladište podataka
ESI varijabla koju koriste pokazivači kako bi spremili vrijednost adrese na koju pokazivač pokazuje
EDI varijabla koju koriste pokazivači kako bi spremili adresu na koju pokazivač pokazuje
EBP koristi se kao ESP skladištar
ESP varijabla koju koriste pokazivači kako bi spremili adresu na koju pokazivač pokazuje
EIP koristi se za davanje instrukcija - komandi, nikad ne mijenjati

U 16. bitnom registru je sve isto osim što se varijable ne zovu eax, ebx nego ax,bx... bez E
također nebitno je dali su registri u samom kodu sa velikim ili malim slovom. Možemo doći do zaključka da svi registri osim zadnja 2 mogu služiti kao skladište nekih podataka, a ESI i EDI najčešće skrivaju adresu pokazivača.

U Cheat Enginu računalo vas samo upozori na koji registar trebate obratiti pozornost da biste došli do pokazivača tako da se ne trebate mučiti. Evo i primjer kako izgleda skup registara za određen operation code (opcode)



četvrtak, 26. siječnja 2012.

Programi za disasemblerski rad - debuggeri

Postoji mnogo programa za deasembliranje, debuggiranje i memory hakanje, svi su podjednako dobri samo je bitno koji vama više odgovara. Fokusirat ću se na programe za windows. naravno za prave hackere ovi programi nisu dovoljni, potrebni su još hex editori, file monitori itd. ali nećemo se zamarati s tim stvarima sada.

Za asemblerski rad se najčešće koristi MASM (Microsoft Macro Assembler) o njemu ne znam puno, ali mnogo ljudi ga koristi i podržava sve verzije Windowsa uključujući i 64. bitne verzije.


Jedan od najpoznatijih starijih programa je SOFTiCE no on ne radi na operativnim sustavima novijim od windows millenium-a, tj. ima velikih problema s kompatibilnošću. Mnogi hakeri
pogotovo DEViATED grupa su koristili ovaj Debugger zbog svojih mogućnosti koje su daleko nadmašivale potrebe jednog debuggera.










OllyDbg je također debugger koji ima mnogo
funkcija, ali podržava novije verzije windowsa, ipak ne podržava 64. bitne sustave iako je
najavljena nova verzija koja će podržavati.

Programeri ga često koriste, pomoću njega je napravljena prvotna verzija AlterIW-a.







Meni osobno najdraži program Cheat Engine. Odličan debugger i memory scanner sa mnogo izvrsnih dodataka kao što je interna mogućnost pravljenja skripti te pravljenja prozora za što je inače potreban visual studio. Podržava sve verzije Windowsa (od verzije 5 pa na dalje i 64x) Postoje 2 verzije programa koje se koriste, 5.6.1 te 6.1

Verzija 5.6.1 podržava grafiku tj. crtanje linija i slično pomoću directx Draw funkcija i OpenGL-a no ta verzija ima manje mogućnosti za pravljenje skripti. Nasuprot tome verzija 6.1 nema grafičkih opcija no ima puno veće mogućnosti pravljenja skripti te traženja određenog
memorijskog koda. Cheat Engine je popularan kod početnika i zato ćemo koristiti njega s verzijom 6.1





srijeda, 25. siječnja 2012.

Općenito o ASM-u

Pozdrav.
Ovo je ASM (Assembly language) i Auto Assembler tutorial na hrvatskome, pošto ASM tutova na hrvatskome uopće nema, odlučio sam prevesti više tutova i sa svojim dosadašnjim znanjem sve to spojiti u jedan newb (početnik) friendly tutorial na hrvatskome jeziku u kojem ću davati svoje primjere.
Ovaj tutorial je namjenjen isključivo za prave početnike i nakon završenog čitanja ovog tutoriala će te moći praviti trainere za najosnovnije stvari: health (zdravlje) i ammo (municija) za FPS-ove te najosnovnije resurse u strategijama.
Prvo malo teorije o tome šta je to uopće ASM, zašto se koristi i slična pitanja.

ASM - Assembly language odnosno Asemblerski jezik je niži simbolički jezik, napredniji od strojnog jezika, ali puno slabiji od viših programskih jezika tipa C, C++, Python
Glavna mana ASM-a je što nije prenosiv odnosno program napravljen za jednu vrstu arhitekture neće raditi na drugoj vrsti arhitekture (x86 programi neće raditi na x64 programima).

ASM se počeo koristiti još tijekom 1950. a koristio se za programiranje sve do 1980. kada su ga zamijenili viši programski jezici. Sada u 2 desetljeću 21. stoljeća njegova primjena je vrlo mala što se tiče komercijalnog korištenja, najčešće za otklanjanje grešaka u programiranju drivera te BIOSU. Njegovo korištenje je vrlo popularno u programiranju računalnih virusa, krekiranju igara, memory hackingu te općenito u obrnutom inžinjerstvu.

Preko ASM-a je napravljena vrlo popularna, besplatna i legalna modifikacija Call of Duty Modern Warfare 2 multiplayer segmenta nazvanog AlterIW koji je potpuno odvojen od originala, a uz to pruža i podporu koje na originalu nema te se pomoću reverse engineeringa (obrnutog inžinjerstva) programiraju još mnoge besplatne modifikacije popularnih multiplayer igara.

Zašto naučiti ASM???
Zabavan je, nakon što njega naučite shvatit ćete arhitekturu računala i moći ćete programirati brže i efikasnije.