VB.Net: Read string from memory?

09/09/2012 17:25 Whoknowsit#1
Hi,

ich möchte gerne einen String aus dem Speicher lesen. Ich habe dazu die entsprechenden Offsets und in Autoit geht das auch wunderbar. Aber das ist wenig effizient und in VB kriege ich das erst gar nicht hin...

Hat da wer zufällig eine entsprechende Funktion, die er mir zur Verfügung stellen kann?
09/09/2012 17:36 Kraizy​#2
ReadProcessMemory
09/09/2012 17:37 Whoknowsit#3
Das ist weniger das Problem :)

Code:
    Public Function MemReadString(ByVal PID As Integer, ByVal address As Integer, ByVal bytes As Integer) As String
        Dim str(bytes) As Byte
        ReadProcessMemory(PID, address, str, bytes, 0)
        Return System.Text.ASCIIEncoding.UTF8.GetString(str)
    End Function
Das funktioniert aber nicht :p Wobei ich sagen muss, dass ich nebenbei auch Integerwerte auslese und das klappt wiederum relativ problemlos.
09/09/2012 17:55 Kraizy​#4
was kommt denn als ergebnis raus
09/09/2012 18:02 Whoknowsit#5
Nichts :D

Code:
ReadStr(pid, Base + &HDC92D8)
09/09/2012 18:56 Kraizy​#6
hast du es mal zb mit system.text.encoding.unicode.getstring(str) probiert?
09/09/2012 23:38 Whoknowsit#7
Mittlerweile bin ich hier:

Code:
    Public Function ReadString(ByVal PID As Integer, ByVal Address As Long, ByVal CharCount As Int32) As String
        Dim ret As Byte() = Nothing
        Dim vBuffer As Long

        Dim processHandle As IntPtr = OpenProcess(PROCESS_VM_READ, 0, PID)
        Dim tStr(CharCount) As Char
        Dim retStr As String = ""
        For i As Int32 = 0 To CharCount Step 1
            ReadProcessMemory(processHandle, Address + i, vBuffer, 1, 0)
            ret = BitConverter.GetBytes(vBuffer)
            tStr(i) = System.Text.Encoding.Unicode.GetString(ret) : retStr += tStr(i)

        Next i
        Return retStr
        CloseHandle(processHandle)
    End Function
Ich erhalte nun das gewünschte Ergebnis, jedoch gibts noch Probleme mit Sonderzeichen. Hab schon sämtliche Kodierungen durch. Liegt wahrscheinlich daran, dass ich hier jeweils nur 1 Byte einlese. Aber egal was ich versuche, es funktioniert nicht :(
09/10/2012 00:18 urgabel#8
Sorry if I tell something stupid, I'm novice programmer.

Maybe you could use:

Code:
ReadProcessMemory(processHandle, Address, vBuffer, CharCount, 0)
then parse the whole string with
Code:
retStr = System.Text.Encoding.Unicode.GetString(vBuffer)
so the parser will handle special chars...
09/10/2012 18:33 Whoknowsit#9
That doesnt make any sense ;) But ty anyways.

Ich bin mittlerweile so weit:

Code:
    Public Function ReadString(ByVal PID As Integer, ByVal Address As Long, ByVal CharCount As Int32) As String
        Dim ret As Byte() = Nothing
        Dim vBuffer As Long

        Dim processHandle As IntPtr = OpenProcess(PROCESS_VM_READ, 0, PID)
        Dim tStr(CharCount) As Char
        Dim retStr As String = ""
        For i As Int32 = 0 To CharCount Step 1
            ReadProcessMemory(processHandle, Address + i, vBuffer, 4, 0)
            ret = BitConverter.GetBytes(vBuffer)
            tStr(i) = System.Text.Encoding.UTF8.GetString(ret) : retStr += tStr(i)

        Next i
        Return retStr
        CloseHandle(processHandle)
    End Function
jedoch nach wie vor Probleme mit dem Rückgabestring.