Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Il quarto parametro di ReadMemory è un puntatore a intero. Durante il processo di lettura, la funzione pone nell'indirizzo puntato da quel puntatore un valore intero che rappresenta il numero di bytes letti. Leggendo il valore della cella di memoria referenziata da Read si legge quindi il numero di bytes letti.
|
|
gianluca (Normal User)
Pro
Messaggi: 103
Iscritto: 23/06/2008
|
aaaaah! ho capito! ma se io invece devo leggere dentro un address? come faccio? grazie per l'aiuto
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Per leggere la memoria devi conoscere l'indirizzo. Per leggere quello che è contenuto in quell'indirizzo, il discorso è un po' più complicato. Ci sono tre casi, fondamentalmente:
- L'indirizzo di memoria puntato contiene un tipo base: in questo caso, ti basta richiamare le funzioni Marshal.Read... per leggere un tipo numerico, oppure Marshal.PtrToString... per leggere una stringa.
- L'indirizzo di memoria punta a una struttura: nelle strutture, i campi vengono scritti sequenzialmente, quindi dovresti leggere dall'indirizzo specificato un dato numero di byte alla volta e porli in ogni campo. Oppure, più semplicemente, potresti usare Marshal.PtrToStructure
- L'indirizzo di memoria punta a una classe: nella classi i campi non vengono scritti sequenzialmente, quindi dovresti ottenere l'offset di ognuno nella memoria con la funzione Marshal.OffsetOf e leggerlo separatemente
Ogni metodo citato è documentato qui:
http://msdn.microsoft.com/en-us/library/system.runtime.int ...
|
|
gianluca (Normal User)
Pro
Messaggi: 103
Iscritto: 23/06/2008
|
ahahahah ti AMOOOOO grazie di tutto! ora non mi resta ke studiarmi tutta la classe marshall...
cmq voglio farti notare 1 cosa a me se imposto
ReadProcessMemory(Handle, BaseAddress, BufferPtr, Buffer.Length, READ)
mi da fuori 0 sempre
se invece
ReadProcessMemory(Handle, BaseAddress, BufferPtr, Buffer.Length, READBytes)
mi esce fuori qualcosa diverso dallo 0
sto "lavorando" bene o no?
secondo me no, perche ho provato a fargli leggere lo stesso address 2 vlt di fila senza kiudere il processo ke leggevo e mi sono usciti 2 valori diversi!
quindi posso kiederti di farmi un esempio per la
funzioni Marshal.Read? vorrei cercare 1 intero 4 bytes...
ps, hai un modo per farlo scansionare piu velocemente????? tytyty per tutto comunque!
Ultima modifica effettuata da gianluca il 16/10/2008 alle 20:14 |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Codice sorgente - presumibilmente VB.NET |
Dim BaseAddress As IntPtr = P(0).MainModule.BaseAddress 'INUTILE Dim BaseAddressIntPassaggio As Integer = BaseAddress 'INUTILE Dim BaseAddressInt As Integer = Hex(BaseAddressIntPassaggio) 'INUTILE Label2.Text = "&H" & Hex(BaseAddressInt) 'Bastava: Label2.Text = "&H" & Hex(BaseAddress.ToInt32) Dim Buffer(P(0).NonpagedSystemMemorySize64 - 1) As Byte Dim GH As GCHandle = GCHandle.Alloc(Buffer, GCHandleType.Pinned) Dim BufferPtr As IntPtr = GH.AddrOfPinnedObject() 'Integer ha dimensione di 4 bytes, non di 8 Dim Read As IntPtr = Marshal.AllocHGlobal(4) 'INUTILE: basta usare P(0).Handle Dim processHandle As IntPtr = OpenProcess(BaseAddressInt, 0, P(0).Id) 'NON VA MESSO QUI Dim ReadBytes As Int32 = Marshal.ReadInt32(Read) 'A cosa ti serve calcolare BaseAddress se poi qui usi comunque l'indirizzo che vuoi tu? Dim ReadProcess As String = ReadProcessMemory(processHandle, Address, BufferPtr, Buffer.Length, Read) 'Ma qui: Dim ReadBytes As Int32 = Marshal.ReadInt32(Read) RichTextBox2.Text = RichTextBox2.Text & ReadProcess & vbNewLine RichTextBox1.Text = RichTextBox1.Text & (Read).ToString & vbNewLine
|
La metà del codice che hai scritto è inutile.
A cosa ti serve il parametro Address se ti ricavi il processo con GetProcessesByName? O l'uno o l'altro.
|
|
gianluca (Normal User)
Pro
Messaggi: 103
Iscritto: 23/06/2008
|
ahahaha! hai ragionissimo, cmq un po di quelle cs inutili le ho scritte perke nn sapevo "ridurle", altre per "provare" ke succedeva, ed altre xke nn ci sto capendo nulla!
cmq ho scoperto una cosa...
Codice sorgente - presumibilmente VB.NET |
Public Function ReadLong(ByVal Address As Integer) Dim ProcessLookUp As Process() = Process.GetProcessesByName("PROCESSO") If ProcessLookUp.Length = 0 Then End End If Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, ProcessLookUp(0).Id) ReadProcessMemory(processHandle, Address, RBuff, 4, Nothing) CloseHandle(processHandle) Return RBuff End Function
|
ke era quello ke usavo per warrock in vista lo da come errato, ma per xp è OK! quindi è possibile ke l'errore ke mi da ancora in:
Codice sorgente - presumibilmente C# / VB.NET |
Dim ReadBytes As Int32 = Marshal.ReadInt32(Read)
|
Tentativo di lettura o scrittura della memoria protetta. Spesso questa condizione indica che altre parti della memoria sono danneggiate.
puo essere una cs in Vista! sai come può essere "aggirata"?
cmq ora è cs! |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
No, avevo già tentato ma senza successo.
P.S.: quella linea è sempre nel posto sbagliato.
Ultima modifica effettuata da Il Totem il 17/10/2008 alle 17:56 |
|
gianluca (Normal User)
Pro
Messaggi: 103
Iscritto: 23/06/2008
|
boh, si vede ke nn ci arrivo!
cmq ci ho rinunciato dato ke il ReadProcessMemory in vista non funziona!
e nn ne capisco il motivo!
ps, è l'unico modo questo? se ne conosci un altro mi daresti una mano, o anke solo un metodo ke poi mi cerco le soluzioni da solo...
|
|