Jump to content
Rpg²S Forum

Programmazione Inversa Parte I


Recommended Posts

Prima di Iniziare:

 

Non sono responsabile dei dati, immagini o appunti prese da utenti che leggono questa discussione.

Questa discussione è a scopo didattico, ogni riferimento a screen, oggetti o programmi sono puramente

per scopo illustrativo o didattico, Non mi ritengo responsabile di eventuali danni arrecati a persone o a cose.

Questa guida insegna l'utilizzo dell'assembly ed eventuali tecniche di reverse engineering.

Qualsiasi atto improprio dovuto ad alcuni insegnamenti di questa guida vanno applicate direttamente all'utente finale

che esegue l'atto improprio.

 

Consiglio: Utilizzate questi insegnamenti per la vostra istruzione e non per arrecare danni a persone o a cose.

 

 

 

Salve a tutti.

Sono Thejuster.
Molti mi conoscono, e molti altri solo di passaggio.

Sono un programmatore avanzato nel linguaggio C#
con solide basi intermedie di C++, Assembly e molti altri linguaggi di programmazione.

Ho deciso di scrivere una serie di tutorial sulle basi alla programmazione ad ingegneria inversa.

La parola "ingegneria inversa" viene definita anche come: reversing engineering

Da Wikipedia:
consiste nell'analisi dettagliata del funzionamento, progettazione e sviluppo di un oggetto.
al fine di produrre un nuovo dispositivo o programma che abbia un funzionamento analogo, magari migliorando o aumentando l'efficienza dello stesso, senza in realtà copiare niente dall'originale; inoltre, si può tentare di realizzare un secondo oggetto in grado di interfacciarsi con il primo



La programmazione inversa, richiede anni ed anni di studio. Sopratutto per il linguaggio macchina Assembly.
Qualsiasi programma, tool o altro strumento viene compilato o interpretato in codice macchina.

il C++ compila il codice in codice macchina.
il C# viene interpretato da JIT (Just in Time ) che a sua volta compila in codice macchina.

Entrambi sono linguaggi molto potenti e non vanno sottovalutati.
ma c'è un unica differenza tra i due.

C++ può usare il blocco di codice __ams__ ( Assembly in Line )
(da C++ si può scrivere direttamente in assembly )

C# può usare il blocco di codice unsafe ( Unmanaged Unsafe Code )
(da c# si possono utilizzare frammenti di codice c++ )


In questi piccoli tutorial cercherò di mostrarvi e farvi capire come possiamo modificare un gioco per realizzare alcune modifiche.
E far funzionare quel gioco come diciamo noi e non per lo scopo al quale è stato programmato.

Purtroppo, non potrò spiegarvi precisamente e dettagliatamente ogni passo perché sarebbe un impresa.
Bisogna conoscere a fondo anche un singolo byte come funziona.

Ma cercherò nel limite massimo della semplicità di spiegarvi alcuni concetti chiari ed utili per chi voglia iniziare a fare qualcosa del genere.

Un esempio?
DynRPG di Cherry.

Quello è reverse engineering.
Per fare quello, abbiamo bisogno di capire come funziona una macchina.
come è strutturato un programma e cercare di capire come si svolge un programma.

Quindi impartirò qualche piccola lezione di Assembly.

L'Assembly come detto è il linguaggio macchina. Madre di tutti i linguaggi di programmazione esistenti.

un semplice calcolo

int totale = 2 + 2;
cout << totale;

in Assembly diventa

N1    DB   00h
N2    DB   00h

CALL PROCEDURA

PROCEDURA PROC
push	AX
push	BC
push	CX
push	DX

mov	DL, BL
mov	CL, AL
mov	AL, DL
add	AL, BL
mov	DL, AL

CALL    STAMPA
JMP     FINE_PROC


STAMPA  PROC
	PUSH    AX
	PUSH    DX
	PUSH    DX
	MOV     AH, 2
	MOV     DL, '='
	INT     21h
	POP     DX

	;------------------------------------
	ADD     dl, 30h
	INT     21h
	;------------------------------------

	pop	DX
	pop	AX
	ret
STAMPA  ENDP

FINE_PROC:
	POP     DX
	POP     CX
	POP     BX
	POP     AX
	RET


Questo è per farvi capire l'enorme difficoltà della cosa.

Ma non impossibile da capire.

Con impegno e costanza si può fare tutto.

 

Principalmente dobbiamo sapere cosa sono i Registri.

 

I Registri sono delle celle di memoria temporanee nello stack.

e vengono divisi da registri alti e registri bassi.

 

i registri alti sono ( AX,BX,CX,DX )

i registri bassi sono ( AL,BL,CL,DL )

 

un registro alto non può interagire con un'altro del suo stello livello.

ma solo con quello basso.

in ugual modo vale per i registri bassi.

 

Per poter ottenere questi risultati, è importante imparare bene i concetti basilari dell'assembly

altrimenti possiamo sognarci di poter realizzare un giorno qualcosa come questo :)

 

http://www.rpg2s.net/forum/index.php/topic/20236-makerando-tool/

 

Questo mio tool, esegue codice Assembly InLine.

modificando un indirizzo esempio: 0x001D5E ( EAX = 000000 ) in 0x001D5E ( EAX = 000001 )

 

più avanti spiegerò come funziona.

 

Ora notate bene il codice che ho postato sopra di un banalissimo calcolo.

 

Abbiamo delle funzioni e dichiarazioni.

 

In Assembly, si legge da destra verso sinistra.

 

[ VALORE ] . [ VARIABILE ]

| <----------------|

 

normalmente noi siamo abituati prima a scrivere la variabile e poi ad assegnargli un valore.

in assembly è il contrario.

si assegna prima un valore e poi una variabile di riferimento.

 

ora che avete capito i registri quali sono, e come si scrive una variabile,

Vi siete chiesti cosa sono quei:

N1    DB  00h

Come in C prima del main vanno dichiarate le variabili.

Quella N1 è una variabile di tipo word occupa in memoria 16 bit.

( in c++ sarebbe byte )

 

Ora vi illustro le altre.

 

VARIABILE DW ( DWORD in c++ )

Costanti binarie, rappresentate da stringhe di cifre binarie chiuse dal carattere b

11011010b                   valore binario a 8 bit  
1010001101010100b                   valore binario a 16 bit 
12o                        valore decimale
12d                        costante decimale
'Ciao'                     valore ASCII

Ora vi potete chiedere, Ma con tutte ste cose io che ci devo fare?

ve lo dico subito.

 

Prendiamo esempio una screen qualsiasi da internet di Ollydbg

e proviamo ad analizzarla ora che conosciamo i concetti basi.

 

ora iniziamo a capirci qualcosa in più.

 

 

 

[ 1 ] [ 2 ] [ 3 ] [ 4 ]

 

http://www.joestewart.org/morphine-dll/ollydbg3.png

 

1 = Indirizzi

2 = Offset

3 = Istruzioni

4 = Registri

 

 

Registri:

Li notate a destra in alto?

 

EAX

ECX

EDX

EBX

 

Togliamo la E iniziale diventano

 

AX

CX

DX

BX

 

Eh si, proprio quelli di cui vi parlavo prima :)

 

I registri contengono valori che prima di essere passati all'istruzione vengono tenuti in memoria.

è come inviare un parametro ad una funzione.

In parole semplici sarebbe come fare

MOV AX,AL
MOV BX,BL

CALL calcola

;-- Tradotto diventa

void calcola (int ax,bx)
{

 return ax + bx;

}

Chiaro no?

 

E notiamo anche nella screen i vari passaggi come MOV, PUSH, CALL ecc. ecc.

 

Non è tanto difficile capire i termini.

MOV ( Sposta )

PUSH ( Setta )

CALL ( Chiama )

ADD ( Addiziona )

SUB ( Sottraziona )
JMP ( Jump - Salta )

JNZ ( Condizione Frok )

JMP ( Salto incondizionale )

ecc. ecc.

 

basta tenerli a mente ed impararli per avere più praticità nel linguaggio.

 

Direi che per questa piccola sessione possiamo fermarci qui :)

spero che queste piccole perle vi abbiano aiutato a capirci qualcosina in più.

Lo sò, e molto difficile. Ma pian piano ci si arriva.

 

Vi ho spiegato molto dettagliatamente la base,

ora vi lascio leggere questo piccolo PDF

ed ora inizierete a capirci qualcosa in più.

 

http://zeus.ing.unibs.it/calcb/Lucidi/Lucidi0405/Intel80x86-IstruzParteB0405.pdf

Edited by Thejuster

Rpgmaker Asset Converter & UI Tool by Making Italia


______________________________________________________
Produzione Software, Componenti e Controlli
_______________________________________________________

*** Linguaggi di Programmazione Conosciuti e competenze Tecniche ***

C#, Javascript, Java, PHP, SQL, Autoit , JQuery, HTML, HTML5, C++, VB.NET,
Android, DirectX, HLSL, XML, Access, LUA, Delphi, Pascal, Assembly, Fortan, Angular JS

Python, Delphi, OpenGL, Git, Bash, ASP, CMake, WinService


Making Italia

 

Link to comment
Share on other sites

Ecco la prima parte! ^ ^

C++ può usare il blocco di codice __ams__ ( Assembly in Line )
(da C++ si può scrivere direttamente in assembly )

C# può usare il blocco di codice unsafe ( Unmanaged Unsafe Code )
(da c# si possono utilizzare frammenti di codice c++ )

Immagino però che quei pezzi di codice in C++ usati su C# non posson usare il blocco ams, giusto? XD

 

Prima lezione se non approfondita comunque lunga e con tanta sostanza, più o meno già sapevo tutto, ma una rispolveratina di ASSEMBLY ora mi serve. Non sarà facile per chi non conosce la programmazione capire troppo questo tutorial mi sa! >

 

Vado a leggermi il PDF aspettando la seconda parte! :D

^ ^

(\_/)
(^ ^) <----coniglietto rosso, me!
(> <)


Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^

http://i.imgur.com/KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^

http://i.imgur.com/FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^

REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

 

SUWOnzB.jpg 🖤
http://www.rpg2s.net/dax_games/r2s_regali2s.png E:3 http://www.rpg2s.net/dax_games/xmas/gifnatale123.gif
http://i.imgur.com/FfvHCGG.png by Testament (notare dettaglio in basso a destra)! E:3
http://i.imgur.com/MpaUphY.jpg by Idriu E:3

Membro Onorario, Ambasciatore dei Coniglietti (Membro n.44)

http://i.imgur.com/PgUqHPm.png
Ufficiale
"Ad opera della sua onestà e del suo completo appoggio alla causa dei Panda, Guardian Of Irael viene ufficialmente considerato un Membro portante del Partito, e Ambasciatore del suo Popolo presso di noi"


http://i.imgur.com/TbRr4iS.png<- Grazie Testament E:3
Ricorda...se rivolgi il tuo sguardo ^ ^ a Guardian anche Guardian volge il suo sguardo ^ ^ a te ^ ^
http://i.imgur.com/u8UJ4Vm.gifby Flame ^ ^
http://i.imgur.com/VbggEKS.gifhttp://i.imgur.com/2tJmjFJ.gifhttp://projectste.altervista.org/Our_Hero_adotta/ado2.png
Grazie Testament XD Fan n°1 ufficiale di PQ! :D

Viva
il Rhaxen! <- Folletto te lo avevo detto (fa pure rima) che non
avevo programmi di grafica per fare un banner su questo pc XD (ora ho di
nuovo il mio PC veramente :D)

Rosso Guardiano della
http://i.imgur.com/Os5rvhx.png

Rpg2s RPG BY FORUM:

Nome: Darth Reveal

 

PV totali 2
PA totali 16

Descrizione: ragazzo dai lunghi capelli rossi ed occhi dello stesso colore. Indossa una elegante giacca rossa sopra ad una maglietta nera. Porta pantaloni rossi larghi, una cintura nera e degli stivali dello stesso colore. E' solito trasportare lo spadone dietro la schiena in un fodero apposito. Ha un pendente al collo e tiene ben legato un pezzo di stoffa (che gli sta particolarmente a cuore) intorno al braccio sinistro sotto la giacca, copre una cicatrice.
Bozze vesti non definitive qui.

Equipaggiamento:
Indossa:
60$ e 59$ divisi in due tasche interne
Levaitan

Spada a due mani elsa lunga

Guanti del Defender (2PA)
Anello del linguaggio animale (diventato del Richiamo)

Scrinieri da lanciere (2 PA)

Elmo del Leone (5 PA)

Corazza del Leone in Ferro Corrazzato (7 PA)

ZAINO (20) contenente:
Portamonete in pelle di cinghiale contenente: 100$
Scatola Sanitaria Sigillata (può contenere e tenere al sicuro fino a 4 oggetti curativi) (contiene Benda di pronto soccorso x3, Pozione di cura)
Corda
Bottiglia di idromele
Forma di formaggio
Torcia (serve ad illuminare, dura tre settori)

Fiasca di ceramica con Giglio Amaro (Dona +1PN e Velocità all'utilizzatore)
Ampolla Bianca

Semi di Balissa

 

CAVALLO NORMALE + SELLA (30 +2 armi) contentente:
66$
Benda di pronto soccorso x3
Spada a due mani

Fagotto per Adara (fazzoletto ricamato)


 

Link to comment
Share on other sites

In realtà l'assembly è abbastanza meccanico.. credo che avrebbe più problemi a capirlo qualcuno già "vizziato" dalle agevolazioni dei linguaggi di altro livello rispetto a chi parte da 0

Però non mi sembra impostata come una guida rivolta ai principianti, immagino che sia solo l'introduzione per passare più rapidamente alla roba seria

 

Seguo

http://i.imgur.com/JvoTKKj.png


Link to comment
Share on other sites

Ecco la prima parte! ^ ^

Immagino però che quei pezzi di codice in C++ usati su C# non posson usare il blocco ams, giusto? XD

 

Prima lezione se non approfondita comunque lunga e con tanta sostanza, più o meno già sapevo tutto, ma una rispolveratina di ASSEMBLY ora mi serve. Non sarà facile per chi non conosce la programmazione capire troppo questo tutorial mi sa! > <

 

Vado a leggermi il PDF aspettando la seconda parte! :D

^ ^

 

 

Esatto.

In C# sebbene è possibile utilizzare frammenti di codice C++ non è possibile usare inline assembly.

Ma C++ .NET lo fà :)

 

Alla fine basta creare una libreria, importala in C# e chiamado determinate funzioni, possiamo saltare anche questo ostacolo.

 

Ma per questo motivo, alcuni programmi necessitano l'uso del C++.

ad oggi il C# è il linguaggio più gettonato.

 

Come detto all'inizio, posso tentare di spiegare in modo più semplice possibile.

Ma se non si conosce la programmazione, risulta veramente impossibile capire questo tutorial.

Bisogna essere già ad un livello medio / alto di programmazione per capire almeno le basi.

 

Difatti spiegherò le basi e qualche tecnica di reversing.

Sono argomenti che vanno trattati molto delicatamente, e se usate da mano indiscrete possono arrecare danni.

Quindi per questo motivo mi sono limitato, e mi limiterò solo nel spiegare alcune cose.

Ma che daranno la spinta necessaria, e le conoscenze basi per poter effettuare altre cose.

 

 

In realtà l'assembly è abbastanza meccanico.. credo che avrebbe più problemi a capirlo qualcuno già "vizziato" dalle agevolazioni dei linguaggi di altro livello rispetto a chi parte da 0

Però non mi sembra impostata come una guida rivolta ai principianti, immagino che sia solo l'introduzione per passare più rapidamente alla roba seria

 

Seguo

 

Esattamente.

Non è una guida adatta ai principianti.

Si deve conoscere molto bene la programmazione per poter capire questo tutorial.

qui si parla di termini nativi e non più gestiti da un framework.

Parliamo di manipolazione ai puntatori, celle di memoria in ram.

Se non si conosce esempio nemmeno qual'è la differenza tra ( LPCSTR ed LPCLSTR ) credo che tutto il resto sia arcano.

 

Ho deciso di fare una serie di tutorial non sbilanciandomi su argomenti dannosi.

Ma limitando a conoscere come si può creare una mod per Rpgmaker prendendo spunto dalla libreria di Cherry.

Rpgmaker Asset Converter & UI Tool by Making Italia


______________________________________________________
Produzione Software, Componenti e Controlli
_______________________________________________________

*** Linguaggi di Programmazione Conosciuti e competenze Tecniche ***

C#, Javascript, Java, PHP, SQL, Autoit , JQuery, HTML, HTML5, C++, VB.NET,
Android, DirectX, HLSL, XML, Access, LUA, Delphi, Pascal, Assembly, Fortan, Angular JS

Python, Delphi, OpenGL, Git, Bash, ASP, CMake, WinService


Making Italia

 

Link to comment
Share on other sites

 

In C# sebbene è possibile utilizzare frammenti di codice C++ non è possibile usare inline assembly.

Ah ah ti pareva! XD

Non ricordo più nulla di C++, ma mi sarebbe piaciuto provarlo da lì, vedrò se troverò tempo di documentarmi in proposito.

^ ^

 

 

Bisogna essere già ad un livello medio / alto di programmazione per capire almeno le basi.

Qui non ci sono molti di quel livello, ma... eh capisco... già l'argomento non è facile e va discusso ampiamente, dare le giuste basi di programmazione anche solo medie sarebbe tutto un altro tutorial bello vasto >

 

 

Ho deciso di fare una serie di tutorial non sbilanciandomi su argomenti dannosi.

Ma limitando a conoscere come si può creare una mod per Rpgmaker prendendo spunto dalla libreria di Cherry.

Perfetto :sisi:

(\_/)
(^ ^) <----coniglietto rosso, me!
(> <)


Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^

http://i.imgur.com/KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^

http://i.imgur.com/FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^

REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

 

SUWOnzB.jpg 🖤
http://www.rpg2s.net/dax_games/r2s_regali2s.png E:3 http://www.rpg2s.net/dax_games/xmas/gifnatale123.gif
http://i.imgur.com/FfvHCGG.png by Testament (notare dettaglio in basso a destra)! E:3
http://i.imgur.com/MpaUphY.jpg by Idriu E:3

Membro Onorario, Ambasciatore dei Coniglietti (Membro n.44)

http://i.imgur.com/PgUqHPm.png
Ufficiale
"Ad opera della sua onestà e del suo completo appoggio alla causa dei Panda, Guardian Of Irael viene ufficialmente considerato un Membro portante del Partito, e Ambasciatore del suo Popolo presso di noi"


http://i.imgur.com/TbRr4iS.png<- Grazie Testament E:3
Ricorda...se rivolgi il tuo sguardo ^ ^ a Guardian anche Guardian volge il suo sguardo ^ ^ a te ^ ^
http://i.imgur.com/u8UJ4Vm.gifby Flame ^ ^
http://i.imgur.com/VbggEKS.gifhttp://i.imgur.com/2tJmjFJ.gifhttp://projectste.altervista.org/Our_Hero_adotta/ado2.png
Grazie Testament XD Fan n°1 ufficiale di PQ! :D

Viva
il Rhaxen! <- Folletto te lo avevo detto (fa pure rima) che non
avevo programmi di grafica per fare un banner su questo pc XD (ora ho di
nuovo il mio PC veramente :D)

Rosso Guardiano della
http://i.imgur.com/Os5rvhx.png

Rpg2s RPG BY FORUM:

Nome: Darth Reveal

 

PV totali 2
PA totali 16

Descrizione: ragazzo dai lunghi capelli rossi ed occhi dello stesso colore. Indossa una elegante giacca rossa sopra ad una maglietta nera. Porta pantaloni rossi larghi, una cintura nera e degli stivali dello stesso colore. E' solito trasportare lo spadone dietro la schiena in un fodero apposito. Ha un pendente al collo e tiene ben legato un pezzo di stoffa (che gli sta particolarmente a cuore) intorno al braccio sinistro sotto la giacca, copre una cicatrice.
Bozze vesti non definitive qui.

Equipaggiamento:
Indossa:
60$ e 59$ divisi in due tasche interne
Levaitan

Spada a due mani elsa lunga

Guanti del Defender (2PA)
Anello del linguaggio animale (diventato del Richiamo)

Scrinieri da lanciere (2 PA)

Elmo del Leone (5 PA)

Corazza del Leone in Ferro Corrazzato (7 PA)

ZAINO (20) contenente:
Portamonete in pelle di cinghiale contenente: 100$
Scatola Sanitaria Sigillata (può contenere e tenere al sicuro fino a 4 oggetti curativi) (contiene Benda di pronto soccorso x3, Pozione di cura)
Corda
Bottiglia di idromele
Forma di formaggio
Torcia (serve ad illuminare, dura tre settori)

Fiasca di ceramica con Giglio Amaro (Dona +1PN e Velocità all'utilizzatore)
Ampolla Bianca

Semi di Balissa

 

CAVALLO NORMALE + SELLA (30 +2 armi) contentente:
66$
Benda di pronto soccorso x3
Spada a due mani

Fagotto per Adara (fazzoletto ricamato)


 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...