Rpg²S Forum uses cookies. Read the Privacy Policy for more info. To remove this message, please click the button to the right:    I accept the use of cookies

Vai al contenuto

Rpg²S Forum uses cookies. Read the Privacy Policy for more info. To remove this message, please click the button to the right:    I accept the use of cookies

Screen Contest #90

Kamikun






  • Si prega di effettuare il log in prima di rispondere
Programmazione inversa Parte III

    Thejuster
  • Animatore

  • Utenti
  • Rens: 5
  • 0
  • StellettaStellettaStellettaStelletta
  • 591 messaggi
  • Sesso:Maschio
  • Abilità:Novizio

#1 Inviato 31 May 2016 - 09:23 AM

Nelle precedenti lezioni abbiamo appreso delle cose fondamentali.

 

1) Capire il programma come si svolge

2) Cercare un indirizzo

3) Moddare il dump della memoria

4) Applicare una patch

 

Non ho scritto queste guide per farvi diventare aspiranti Hacker o cracker.

Anche perché nemmeno io sono così bravo da reputarmi tale.

 

fare un crack o un hack e molto complicato.

Non ci basta questo piccolo trucchetto per definirci tale.

 

Molti programmi sono protetti da Anti-Debug, Altri vengono manomessi per non essere letti del debugger.

Altri ancora sfruttano dll per proteggere il programma.

 

Quindi potete farvi un idea di quanto possa essere complicata la cosa.

Vi ho illustrato queste piccole operazioni per un semplice motivo.

 

Lo scopo principale dei tutorial e quello di poter creare delle MOD per Rpgmaker.

 

Ora possiamo avanzare alla fase successiva.

 

Se vi illustro questo frammento di codice, recupero da DynRPG.

ora siete in grado di capire in parte cosa fà.

 

 

Recuperato dal sorgente di DynRPG

static RPG::NamedCatalogPtr<RPG::Item *> &items = (**reinterpret_cast<RPG::NamedCatalogPtr<RPG::Item *> **>(0x4CDB14));

Come potete notare alla fine di questa chiamata abbiamo un indirizzo.

Ciò significa che Cherry, ha reinterpretato quell'indirizzo di memoria in quella determinata variabile (Chiamiamola così)

 

quindi possiamo presumere che all'indirizzo

0x4CDB14 sia situato il puntatore che ci permette di avere accesso agli oggetti nel database.

 

 

Altro esempio

 void openMenu(RPG::MenuSubScreen screen, int heroId = 1, int skillOrItemId = 1) {
  117         //RPG::menu->repaint = false;
  118         
  119         if(RPG::system->scene == RPG::SCENE_MENU && RPG::menu->screen == RPG::MENU_MAIN) {
  120             *reinterpret_cast<char *>(0x4A3368) = 0xA9; // Default = 0x91
  121             switch (screen) {
  122             case MENU_ITEM:
  123                 {   //open MENU_ITEM
  124                     *reinterpret_cast<char *>(0x4A109A) = 0x34;             // Default: 0x10    //speed up transition
  125                     *reinterpret_cast<unsigned short *>(0x4A10D4) = 0xBEEB; // Default: 0x8B53  //re-route closeSubMenu() to closeMenu()
  126                     asm volatile("call *%%esi"
  127                                 :
  128                                 : "S" (0x4A110C), "a" (RPG::menu)
  129                                 : "edx", "ecx", "cc", "memory");

Proviamo ( Anche se non ci riusciamo) a leggere il codice ed interpretarlo a modo nostro.

 

Void OpenMenu.

 

Questo metodo ci apre il menu.

ora cosa succede?

 *reinterpret_cast<char *>(0x4A3368) = 0xA9; // Default = 0x91

Qui il vecchio cherry ha creato una lista di tipo Char

che punta all'indirizzo di memoria 0x4A3368 all'offset 0xA9

 

Ma dice che di default è 0x91

 

Ora andiamo un pò sul complicato.

 

Come spiegato a Guardian, in C++ si possono usare frammenti di codice Assembly.

 

Siccome DynRPG si collega al processo di Rpgmaker, esso ora esegue una modifica al livello codice Macchina.

 asm volatile("call *%%esi"
  127                                 :
  128                                 : "S" (0x4A110C), "a" (RPG::menu)
  129                                 : "edx", "ecx", "cc", "memory");
  130                     break;

Chiama l'indirizzo contenuto in ESI  che viene posto nel parametro S, equivalente a (0x4A110C)

ed come valore, nello Shift inserisci quello attuale dello stato del menu.

che potrebbe essere 

 

True (Aperto)  | Livello Binario ( 1 )

False (Chiuso) | Livello Binario ( 0 )

 

Ovviamente, la domanda è:

 

Come ha fatto Cherry a trovare tutti questi indirizzi?

 

La risposta è un lavoro molto duro.

Qui trovate qualche informazione  

 

https://en.wikipedia...al_method_table

 

Qui viene spiegato l'uso di interpret_cast

 

https://en.wikibooks...einterpret_cast

 

 

Da ora in poi, c'è bisogno di una buona conoscenza del C++.

Altrimenti non andiamo da nessuna parte :)

 

Come detto dall'inizio, questi tutorial non sono per tutti.

Ma per un livello medio / Alto di programmatori.

 

Successivamente spiegherò qualche piccolo trucco per trovare indirizzi più facilmente.


.eJwFwd12QzAAAOB3cY-tzrrqXdSqUjFsjrgMSTQ


Da Sinistra verso Destra :P
Daemond, Thejuster, OldPat

Artwork by Hrot
Manca ancora lui XD

 

pre_1478077904__new-3.png

______________________________________________________
Produzione Software, Componenti e Controlli

 

logo.png

_______________________________________________________

 

 

2hnwdtw.png

 

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

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

 


Tool per la creazione di MMO Rpg. Open Source,
Vuoi far parte del team di sviluppo?


www.makingitalia.net

 

 

 


    Guardian of Irael
  • Coniglietto Rosso

  • Rpg²S Admin
  • Rens: 195
  • 19
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 58413 messaggi
  • Sesso:Maschio
  • Provenienza:Bagnaia (Viterbo)
  • Abilità:Apprendista


#2 Inviato 31 May 2016 - 10:03 AM

La terza lezione ed a me manca ancora la seconda! D:

 

Comunque mi pare più cortina e facilmente seguibile questa terza e così mi pare di capire senza aver approfondito la seconda, bene, preferisco! ^ ^

 

 

Successivamente spiegherò qualche piccolo trucco per trovare indirizzi più facilmente.

Ah meno male! XD


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

 
Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^
 
KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^
 
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) ^ ^

Spoiler





  • Feed RSS