Thejuster (Admin)
Guru^2
Messaggi: 2305
Iscritto: 04/05/2008
|
Salve gente
Qualcuno riesci ad aiutarmi in questo argomento?
Tramite un indirizzo base
Codice sorgente - presumibilmente Altri Linguaggi |
long addr_base = 0x0018FDDC;
long offset = 0x000000B8;
long nuovo_addr;
|
Come sapete nella memoria gli indirizzi cambiano ad ogni avvio di applicazione.
un indirizzo di memoria potrebbe essere A come B. non è mai uguale.
tranne però l'indirizzo dei puntatori. quelli non cambiano. come un recente posto che feci
e nessuno (utente) disse che poteva cambiare in caso di update del programma.
Ma in questo caso. l'indirizzo al puntatore è fisso quindi non cambia.
cambia solo il valore all'area di memoria a cui punta.
0x0018FDDC rimane tale ma il suo valore può essere qualsiasi
per ottenere l'indirizzo a cui punta il puntatore basta fare un calcolo.
Valore del puntatore + offset
mettiamo caso che
0x0018FDDC = (Come valore abbia) 077FDC80
1° DOMANDA
come faccio a leggere tramite C# il valore di questo indirizzo?
ho provato con
Codice sorgente - presumibilmente Plain Text |
IntPtr pt = (IntPtr)0x0018FDDC;
IntPtr ptr2 = Marshal.ReadIntPtr(pt);
|
ma ottengo un numero del tipo 01851561 e non di tipo 0x ecc. ecc.
2° DOMANDA
Riuscito a leggere l'indirizzo a cui punta il puntatore
come calcolo l'offset?
per ottenere il nuovo indirizzo a cui il puntatore punta
basterebbe fare in questo modo
(Indirizzo a cui punta il puntatore ) + offset
Esempio:
Codice sorgente - presumibilmente Altri Linguaggi |
//Inidirizzo Puntatore
0x0018FDDC
//Valore del Puntatore
097DF928
//Offset
mov [esi+000000B8] = (Diverrebbe b8)
//quindi dovrei fare
097DF928 + b8 = 078A4008 ( Che sarebbe il nuovo indirizzo a cui punta il puntatore)
|
ma in C# come posso fare questo calcolo? Ultima modifica effettuata da Thejuster il 27/05/2015 alle 12:10
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
Dovresti risolvere con la sola riga
IntPtr val = Marshal.ReadIntPtr(Marshal.ReadIntPtr((IntPtr)0x0010FDDC), 0xB8);
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Thejuster (Admin)
Guru^2
Messaggi: 2305
Iscritto: 04/05/2008
|
intanto grazie nessuno per la risposta.
Ma ho un errore:
"Tentativo di lettura o scrittura della memoria protetta. Spesso questa condizione indica che altre parti della memoria sono danneggiate."
magari forse con questa immagine riesco a spiegarmi meglio
perché mi sà proprio che ho sbagliato io completamente ad esprimermi.
chiedo scusa.
guarda nessuno
http://s27.postimg.org/x7ix49vw3/Immagine.jpg
Colore Rosso
L'indirizzo del puntatore come vedi è sempre quello non cambia. rimane invariato.
ma il puntatore punta ad un indirizzo di memoria che cambia ad ogni avvio.
che sarebbe in questo caso quello poco più a destra dopo -> 08A383B0
Colore Blu
L'offset anche questo non cambia. serve da calcolo.
In questo caso cosa succede?
Il puntatore con l'indirizzo statico ovvero 0018FDDC ha come valore l'indirizzo a cui il puntatore punta.
che in questo caso sarebbe 08A383B0 (guarda screen è proprio accanto al rettangolo rosso)
Ora abbiamo il valore che ci serve cioè: 08A383B0
a questo valore và calcolato l'offset: 08A383B0 + b8
a quel punto il risultato (secondo il programma) è: 08A38468 (guarda colore verde)
L'offset l'ho recuperato tramite il debugging
http://s1.postimg.org/nujmn7t1b/Immagine.jpg
Colore Azzurro
Avendo ottenuto l'indirizzo completo al quale il puntatore puntava
posso scrivere nella memoria il valore che mi serve in quel caso: 5000 per aprire una finestra.
Questo l'ho fatto manualmente tramite un programma che funge da debug e funziona correttamente.
anche chiudendo l'applicazione e riaprendola calcola il tutto mi permette di riscrive i valori su quella memoria.
la stessa cosa vorrei farla da codice C#.
lo sò, la vedo un pò dura come cosa.
ma buona parte è già fatta.
esempio ho provato a fare questo per la lettura del valore del puntatore ma
forse sbaglio qualcosa
Codice sorgente - presumibilmente C# |
[DllImport("kernel32.dll", SetLastError = true)] static extern bool ReadProcessMemory( IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int dwSize, out int lpNumberOfBytesRead); public int ReadAddress(IntPtr procHandle,IntPtr baseAddress,int offset) { //IntPtr procHandle = Process.GetCurrentProcess().Handle; //IntPtr baseAddress = new IntPtr(0x027EF131); //Prova //int offset = 0x100; //Offset di prova baseAddress += offset; int read = -1; int val = 0; //Winapi ReadProcessMemory(procHandle, baseAddress, buffer, buffer.Length, out read); if (read == buffer.Length) { int value = BitConverter.ToInt32(buffer, 0); val = value; } return val; }
|
mentre per scrivere il valore uso
Codice sorgente - presumibilmente Altri Linguaggi |
byte[] Buffer = BitConverter.GetBytes(Value);
IntPtr Zero = IntPtr.Zero;
//Qui trasformo il valore long in IntPtr
WriteProcessMemory(pHandle, (IntPtr)Address, Buffer, (UInt32)Buffer.Length, out Zero);
|
Ultima modifica effettuata da Thejuster il 27/05/2015 alle 15:53
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
Ti avevo scritto un valore di puntatore sbagliato, che deve iniziare con 0x0018 ... fai la prova ...
IntPtr val = Marshal.ReadIntPtr(Marshal.ReadIntPtr((IntPtr)0x0018FDDC), 0xB8);
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
"ottengo un numero del tipo 01851561 e non di tipo 0x ecc. ecc"
Scusa ma a casa mia 01851561 (base dieci) = 0x1C40A9 (base sedici)
|
|
Thejuster (Admin)
Guru^2
Messaggi: 2305
Iscritto: 04/05/2008
|
@nessuno
Si nessuno lo sò che lo avevi scritto a caso.
l'ho inserito con il mio indirizzo ma crasha ugualmente.
@DarkJuster
non ho capito bene quello che dici juster.
il valore che ritorna è sbagliato?
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
Allora questo vuol dire che il puntatore di partenza
0x0018FDDC
non è valido. Del resto è molto improbabile che tu abbia un valore di puntatore valido e conosciuto dato che, come ti ho detto, questo varia in funzione di tantissime cose.
P.S. Quello che ti vuole dire DarkJuster è che un valore viene solo visualizzato in una base piuttosto che in un'altra base (ad esempio 255 in decimale equivale a 0xFF esadecimale) ma che il numero è comunque uno solo, cambia solo il modo di visualizzarlo. Ovvero, non ti viene restituito un numero che inizia con 0x ma un numero intero che tu puoi visualizzare come vuoi.
Ultima modifica effettuata da nessuno il 28/05/2015 alle 9:23
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Thejuster (Admin)
Guru^2
Messaggi: 2305
Iscritto: 04/05/2008
|
Grazie della risposta nessuno, ora ho capito.
Provo a fare diversi controlli e debuggare meglio.
Ci sarà per forza un modo per risalire ad un puntatore che abbia un indirizzo statico.
Pensavo anche che una volta trovato l'indirizzo del puntatore base, per modificare valori anche di altre variabili
bisogna trovare l'offset di ogni movimento che esegue l'asm.
questo l'ho capito guardando un pò come si muove il debugger.
del tipo mov [esi+000000b8]
0x8b potrebbe esempio essere una variabile int64 che tiene memoria di uno stato di una finestra
mentre 0x0C potrebbe essere il valore di qualche oggetto
e gli indirizzi ovviamente cambiano calcolando l'offset valore_indirizzobase + offset = indirizzo variabile.
faccio altre prove e vi tengo informati grazie per il supporto saluti.
|
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
Io ho una domanda, ma perchè invece di diventare matto con gli indirizzi di base (che cambiano ad ogni compilazione) non fai un bel progetto C++ .NET e non metti li le tue routine che necessitano di puntatori per funzionare? Non credi sia una soluzione migliore?
|
|