Oppure

Loading
13/10/08 22:29
gianluca
ce la sto facendo! forse...

cmq ti volevo kiedere cosa fa questa riga?

Dim ReadBytes As Int32 = Marshal.ReadInt32(Read)

Ultima modifica effettuata da gianluca 15/10/08 21:43
aaa
14/10/08 14:57
Il Totem
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.
aaa
14/10/08 15:01
gianluca
aaaaah! ho capito! ma se io invece devo leggere dentro un address? come faccio? grazie per l'aiuto
aaa
15/10/08 16:07
Il Totem
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:
msdn.microsoft.com/en-us/library/…
aaa
15/10/08 18:48
gianluca
ahahahah ti AMOOOOO grazie di tutto!:rotfl::rotfl::rotfl: 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!:D
Ultima modifica effettuata da gianluca 16/10/08 18:14
aaa
16/10/08 14:40
Il Totem
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.
aaa
16/10/08 18:29
gianluca
:k: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...

    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:
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!
aaa
17/10/08 15:55
Il Totem
No, avevo già tentato ma senza successo.

P.S.: quella linea è sempre nel posto sbagliato.
Ultima modifica effettuata da Il Totem 17/10/08 15:56
aaa