Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Altri Linguaggi - Calcolare gli indirizzi base
Forum - Altri Linguaggi - Calcolare gli indirizzi base

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2094
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 12:09
Mercoledì, 27/05/2015
Salve gente

Qualcuno riesci ad aiutarmi in questo argomento?


Tramite un indirizzo base

Codice sorgente - presumibilmente Altri Linguaggi

  1. long addr_base = 0x0018FDDC;
  2. long offset = 0x000000B8;
  3. 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

  1. IntPtr pt = (IntPtr)0x0018FDDC;
  2. 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

  1. //Inidirizzo Puntatore
  2. 0x0018FDDC
  3.  
  4. //Valore del Puntatore
  5. 097DF928
  6.  
  7. //Offset
  8. mov [esi+000000B8]    =  (Diverrebbe b8)
  9.  
  10. //quindi dovrei fare
  11.  
  12. 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


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6176
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:34
Mercoledì, 27/05/2015
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à.
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2094
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 15:40
Mercoledì, 27/05/2015
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.  8-|

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#

  1. [DllImport("kernel32.dll", SetLastError = true)]
  2.         static extern bool ReadProcessMemory(
  3.         IntPtr hProcess,
  4.         IntPtr lpBaseAddress,
  5.         [Out] byte[] lpBuffer,
  6.         int dwSize,
  7.         out int lpNumberOfBytesRead);
  8.  
  9. public int ReadAddress(IntPtr procHandle,IntPtr baseAddress,int offset)
  10.         {
  11.             //IntPtr procHandle = Process.GetCurrentProcess().Handle;
  12.             //IntPtr baseAddress = new IntPtr(0x027EF131); //Prova
  13.             //int offset = 0x100; //Offset di prova
  14.             baseAddress += offset;
  15.             byte[] buffer = new byte[sizeof(int)];
  16.             int read = -1;
  17.             int val = 0;
  18.  
  19.             //Winapi
  20.             ReadProcessMemory(procHandle, baseAddress, buffer, buffer.Length, out read);
  21.  
  22.             if (read == buffer.Length)
  23.             {
  24.                 int value = BitConverter.ToInt32(buffer, 0);
  25.  
  26.                 val = value;
  27.             }
  28.             return val;
  29.         }




mentre per scrivere il valore uso

Codice sorgente - presumibilmente Altri Linguaggi

  1. byte[] Buffer = BitConverter.GetBytes(Value);
  2.             IntPtr Zero = IntPtr.Zero;
  3.             //Qui trasformo il valore long in IntPtr
  4.             WriteProcessMemory(pHandle, (IntPtr)Address, Buffer, (UInt32)Buffer.Length, out Zero);




Ultima modifica effettuata da Thejuster il 27/05/2015 alle 15:53


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6176
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:29
Mercoledì, 27/05/2015
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à.
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1616
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 21:40
Mercoledì, 27/05/2015
"ottengo un numero del tipo 01851561  e non di tipo 0x ecc. ecc"
Scusa ma a casa mia 01851561 (base dieci) = 0x1C40A9 (base sedici)

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2094
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 8:19
Giovedì, 28/05/2015
@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?


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6176
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 9:21
Giovedì, 28/05/2015
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à.
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2094
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:42
Giovedì, 28/05/2015
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.


PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1616
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 11:26
Giovedì, 28/05/2015
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?

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo