Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

[Guida] MHS - Autoassemble - Inject Code
(Questo messaggio è stato modificato l'ultima volta il: 25/07/2011, 23:24 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
Ciao a tutti,
con l'MHS eravamo rimasti all'autohack.

Oggi voglio farvi vedere una caratteristica molto molto carina di MHS, che non è utile solo per taroccare i giochi con MHS, è utilissima anche per "provare" in anteprima molto facilmente l'effetto di un nostro codice che andiamo a "infilare" nel processo.
Questo codice una volta provato con successo lo potremo mettere in una nostra hack, iniettarlo nel programma target etc.

La funzionalità che ci permette di fare questo sta nel disassebler, e si chiama AutoAssemble->Inject Code

In cosa consiste?
Praticamente ci posizioniamo su una linea di codice del gioco in esame e li iniettiamo il nostro codice, ovvero MHS ci metterà un JMP, un salto, ad un'area di memoria da lui allocata nel processo del gioco, e ci permetterà di editare il contenuto di questa memoria.
Praticamente, per chi le conosce, stiamo parlando di un codecave.

Le potenzialità di questa tecnica sono formidabili, in questo modo possiamo cambiare il flusso del codice del gioco in maniera molto piu elaborata rispetto ad un semplice NOP o cambio di JE in JNE o di un saldo condizionale in uno non condizionale etc

Possiamo ad esempio fare dei controlli su aree di memoria e cambiare dei registri in base all'esito o cose anche piu complesse.

Ma vediamo in pratica.

Se andate a vedere la seconda guida "MHS - Autohack uso del debugger" vedrete che avevamo trovato un indirizzo interessante:

1002FF5 INC DWORD PTR [100579C]

ovvero l'istruzione che ogni volta INCrementa di 1 il valore del tempo che si trova all'indirizzo 100579C.

L'ultima volta il taroccamento consisteva nel NOPpare quell'istruzione, ovvero non fargliela eseguire, in questo modo il timer restava fermo.

Bene, ora vediamo con questa nuova tecnica cosa potremmo fare.
Siccome già sappiamo l'indirizzo, non occorre passare di nuovo da tutto il processo per trovare l'indirizzo, quindi andiamo al succo:

1. lanciamo Winmine (campo minato, o prato fiorito) (sto parlando di windows XP)
2. lanciamo MHS
3. File - Open Process - Winmine
4. Tools - Disassembler

[Immagine: 01719-b95944c0-4fab-42b5-8cab-47b931022af1.png]

Ci si apre il disassembler che abbiamo visto l'altra volta:

[Immagine: 01719-3320887a-abdf-4b1b-a985-790048cc01f8.png]

5. andiamo all'indirizzo che ci interessa, ovvero andiamo col mouse nella finestra di destra dove sta il codice asm e premiamo il pulsante destro
6. nel menu che compare clicchiamo su "Go To..."
[Immagine: 01719-a46df104-697a-4d29-8118-1dfb779a468d.png]

7. scriviamo il nostro indirizzo e diamo OK

[Immagine: 01719-692da1d1-1d80-4746-af27-fe09d464600c.png]

Ora siamo sull'istruzione INC dell'altra volta, procediamo con la creazione del codecave

8. clicchiamo sulla linea dell'INC , tasto destro, AutoAssemble->InjectCode

[Immagine: 01719-d6ea58d5-c564-479d-821e-56e4c9d48f68.png]

La finestra che esce può fare un po' impressione, ma non spaventatevi,
il concetto è molto semplice, sta allocando della memoria e ci fa vedere che sovrascriverà la linea INC DWORD PTR con un JMP MyCode dove MyCode è una label che indica l'inizio della memoria allocata dove metteremo il nostro codice.

[Immagine: 01719-f16c1448-0bf8-4282-a0fc-9cf63d7600da.png]

Scendiamo nella finestra e vediamo questa memoria allocata cosa conterrà:

[Immagine: 01719-e3909c32-6bca-4097-a055-8461cbf9f944.png]

Vedete che c'è la label "MyCode", alla fine di tutta sta operazione il gioco dall'indirizzo 1002FF5 salterà (JMP) qui a MyCode,
qui ci metteremo il nostro codice, dopo di che l'esecuzione proseguirà raggiungendo Overwritten Code dove eseguirà il codice originale che già eseguiva prima, e che ora si trova qui perchè per sovrascrivere la linea INC con il JMP questi comandi erano andati persi.

una volta finito arriverà alla label "Exit" dove un jmp Return farà proseguire l'esecuzione da DOPO il JMP che MHS ha scritto al posto della INC

[Immagine: 01719-fad84fac-452d-490c-a317-883ed2e1e5b5.png]

Ok, però non abbiamo ancora messo il nostro codice.
Facciamo qualcosa di moooolto facile, tanto ci interessa solo capire il concetto che ci sta dietro, ora non dobbiamo implementare niente di complicato.
Visto che la taroccata iniziale era noppare l'inc per tenere fermo il timer, cerchiamo di ottenere la stessa cosa ma usando il codecave.
Un modo può essere quello ad esempio di mettere a 0 quella locazione di memoria:

[Immagine: 01719-ea7a834d-7dee-4d99-a16d-b9ed41150462.png]

Quindi cosa succederà ?
la locazione verrà messa a 0, dopo di che l'INC la incrementerà quindi il risulatato sarà che rimarrà ferma a 1.
Potremmo anche togliere l'INC ma non ci interessa, lasciamo com'è per far capire che il codice a volte può anche restare quello che è e noi ci limitiamo a CAMBIARE la situzione intorno ad esso per ottenere quello che vogliamo.

Bene andiamo avanti.
Ci esce il preview di quello che MHS farà ma al momento non ci interessa quindi premiamo "Inject" per farglielo fare.

[Immagine: 01719-b02dd61b-fa61-4bad-816a-d6ad0446d7c7.png]

Ci sparisce sta finestra e ci torna l'editor dell'injector, ma abbiamo finito, quindi premiamo "Cancel" tanto ormai l'injecting è avvenuto.

Non so se è un baco o cosa, ma non ho trovato un modo per aggiornare il disassemblato, infatti come vedete nella parte destra c'è ancora la vecchia INC DWORD PTR e non si vede l'injecting.
Allora clicchiamo sulla X della tab attuale :

[Immagine: 01719-9ecce208-d358-4a7f-802b-6d20e7b3f1cf.png]

E quindi la riapriamo con CTRL-P o dal menu:

[Immagine: 01719-be863b02-11c3-4732-a4f6-4dce9cfe4925.png]

Di nuovo tasto destro, Go To... e mettiamo 1002FF5

[Immagine: 01719-c9eca1cf-42b5-4d23-ae47-eff9cddbacc6.png]

Guarda guarda, ora si vede benissimo che al posto dell'INC ci sta un JMP ad un indirizzo (che punta alla memoria allocata da MHS) che altro non è che il MyCode di prima.

Per curiosità andiamo a sbirciare all'indirizzo a cui salta, quindi in questo caso a A60000

Quindi, tasto destro, GoTo..., e mettiamo A60000

[Immagine: 01719-4a39c4be-c349-4399-a67a-59467ee25862.png]

Ma riguarda riguarda!

Toh, un MOV DWORD PTR [100579C],0

che nemmeno a farlo apposta è quello che abbiamo scritto noi nel nostor codecave, poi si vede che esegue l'INC originale e quindi le altre istruzioni e poi sotto un bel JMP 1003008 che riporta l'esecuzione da dove siamo arrivati.

Purtroppo con questo esempio non sono stato molto fortunato nel senso che mi sono accorto solo dopo che c'è un RETN prima del JMP che vuol dire che al JMP non ci arriverà mai, fa niente l'importante è che si capisca la logica che sta dietro a tutto questo, poi si deve vedere da caso a caso.

A sto punto lascio un esercizio per i piu volenterosi.
Se eseguiremo cosi com'è il campo minato, sicuramente crasharà... cercate di capire perchè, la soluzione c'è ma non la scrivo qui perchè se no complico troppo la guida ai neofiti, comunque una volta implementata, il risultato finale è questo:

[Immagine: 01719-9b058102-66f9-4d92-bfc1-be806141121c.png]


ciao
Digger



digger
25/07/2011, 23:21
#1
Cerca

Iscritto
Messaggi: 891
Discussioni: 58
Registrato: 03-2011
Mix: 0
Io dicevo questa parte qui:

Le potenzialità di questa tecnica sono formidabili, in questo modo possiamo cambiare il flusso del codice del gioco in maniera molto piu elaborata rispetto ad un semplice NOP o cambio di JE in JNE o di un saldo condizionale in uno non condizionale etc

Il resto è ottimo, forse devo mettere anche io gli screen.. aiutano tanto a capire

26/07/2011, 0:01
#2
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
(26/07/2011, 0:01)Luxor Ha scritto:

[Per vedere i link devi REGISTRARTI.]

Io dicevo questa parte qui:

Le potenzialità di questa tecnica sono formidabili, in questo modo possiamo cambiare il flusso del codice del gioco in maniera molto piu elaborata rispetto ad un semplice NOP o cambio di JE in JNE o di un salto condizionale in uno non condizionale etc

Il resto è ottimo, forse devo mettere anche io gli screen.. aiutano tanto a capire

Ok, niente di che sono istruzioni ASM che si trovano in tutti i programmi e quindi anche nei giochi, non ha importanza se non si capisce benissimo di cosa parlo, faccio solo riferimento a come solitamente si "patchano" i giochi per fargli fare quello che vogliamo.

NOP = No Operation, non fa niente.

Quando vogliamo "cancellare" una istruzione asm da un gioco, non possiamo farlo, dobbiamo sovrascriverla con un'altra, e cosa c'è di meglio che il NOP? sovrascrive l'istruzione senza però andare a fare niente Smile

JE e JNE sono solo 2 esempi fra tantissimi di salti.

Non sto a dilungarmi vista l'ora, per farla facile, JE salta con una condizione, JNE salta con quella esattamente opposta.

A volte per taroccare un programma ci è sufficiente mettere un JE al posto di un JNE o viceversa.

Ma per questa guida di MHS non è fondamentale capire questo punto per questo non mi dilungo, magari in un altro post Smile




digger
26/07/2011, 0:11
#3
Cerca

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
Je = Jump if Equal -> Salta se gli ultimi due operandi messi a contronto erano uguali;

Jne = Jump if Not Equal -> Salta se gli ultimi due operandi messi a contronto NON erano uguali;

Jmp -> Salta in ogni cazo

Jz = Jump if 0 -> Salta se l'ultima operazione ha restituito 0;

Jnz = Jump if NOT 0 -> Salta se l'ultima operazione NON ha restituito 0;

Queste sono le più comuni ma ce ne sono molte altre per quanto riguarda i salti..
Visto che digger aveva sonno li ho postati io ora di buon mattino Blush

P.s: fra 2 ore ho l'esame della patente :cool:

26/07/2011, 7:16
#4
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 26/07/2011, 10:29 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
ciao Sky bravo per l'aggiunta, ma in realtà non è proprio cosi,
JE=JZ e JNE=JNZ

e comunque non guardano se gli operandi erano uguali o no, guardano semplicemente se la flag ZF vale 0 o 1 e questa flag può essere modificata da tutta una serie di comandi e operazioni,tra cui appunto anche il confronto tra operandi Smile


digger
26/07/2011, 10:24
#5
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 26/07/2011, 11:01 da Skyline@69.)

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
(26/07/2011, 10:24)digger Ha scritto:

[Per vedere i link devi REGISTRARTI.]

ciao Sky bravo per l'aggiunta, ma in realtà non è proprio cosi,
JE=JZ e JNE=JNZ

e comunque non guardano se gli operandi erano uguali o no, guardano semplicemente se la flag ZF vale 0 o 1 e questa flag può essere modificata da tutta una serie di comandi e operazioni,tra cui appunto anche il confronto tra operandi Smile

Era sottintesto, o comunque non avevo voglia di scriverlo..
In pratica quello che intendevo dire è che se gli ultimi operandi erano uguali o meno, quindi la cpu mette su ZF 0 o 1, quindi procede in funzione di come è stato ideato il programma Smile

Per quando riguarda JE=JZ e JNE=JNZ lo sapevo, perchè se due operandi sono uguali la cpu mette su ZF 1, quindi vale si JUMP EQUAL che JUMP ZERO perchè sono uguali e su ZF c'è 1. stessa cosa per JNE e JNZ :cool:

26/07/2011, 10:57
#6
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
Asd


digger
26/07/2011, 11:10
#7
Cerca

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
(26/07/2011, 11:10)digger Ha scritto:

[Per vedere i link devi REGISTRARTI.]

Asd

Che te ridi?

26/07/2011, 11:34
#8
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
(26/07/2011, 11:34)Skyline@69 Ha scritto:

[Per vedere i link devi REGISTRARTI.]

(26/07/2011, 11:10)digger Ha scritto:

[Per vedere i link devi REGISTRARTI.]

Asd

Che te ridi?

no niente, tranquillo, ho una paresi e poi mi piace quello smile Smile


digger
26/07/2011, 12:26
#9
Cerca

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
(26/07/2011, 12:26)digger Ha scritto:

[Per vedere i link devi REGISTRARTI.]

(26/07/2011, 11:34)Skyline@69 Ha scritto:

[Per vedere i link devi REGISTRARTI.]

(26/07/2011, 11:10)digger Ha scritto:

[Per vedere i link devi REGISTRARTI.]

Asd

Che te ridi?

no niente, tranquillo, ho una paresi e poi mi piace quello smile Smile

Asd

26/07/2011, 13:56
#10
Cerca


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  [Guida] CE05 - Cheat Engine - Autoassemble in Table digger 4 2,022 15/10/2013, 22:41
Ultimo messaggio: digger
  [Guida] CE04 - Cheat Engine - Autoassemble Code Injection digger 17 5,130 22/09/2012, 0:05
Ultimo messaggio: digger
  Source code fullbright Pocciox 2 1,156 26/08/2012, 21:08
Ultimo messaggio: Pocciox



Utenti che stanno guardando questa discussione: 1 Ospite(i)