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.