Seite 1 von 1

Brauche Hilfe beim Übersetzen von drei Zeilen C Code

Verfasst: 18.11.2006 14:46
von Glow
Hi

Also, ich versuche gerade mal Spasseshalber ein bissel alten C Code in PB zu porten. Allerdings will das ganze nicht so wie ich :P
Die Hauptprobleme sind folgende. Das ganze zeigt jetzt einfach mal den C Code.

Code: Alles auswählen

DWORD	MyVar[8];

ReadProcessMemory (MyPID, (VOID *)0x00000000, MyVar, sizeof(MyVar), &read);
	if (read != sizeof(MyVar))
	{
		puts ("Konnte Speicherwert nicht lesen :(");
		return;
	}

printf ("Speicherwert ist: %d\n", MyVar[6]);
Ich komme echt nicht drauf, wie das ganze in PB funktionieren könnte ?
Bei mir klappt das jedenfalls kein Stück. Jemand eine Idee ? :)

Gruß
Glow

Verfasst: 18.11.2006 16:09
von edel
Was geht nicht ? Den Ausschnitt zu uebersetzen bringt eh nichts, da die haelfte fehlt.

Verfasst: 18.11.2006 16:16
von Glow
Hi

Mir geht es dabei rein um die Schreibweisse in PB.
Z.B:

Code: Alles auswählen

DWORD   MyVar[8];
wäre das gleichzusetzen mit

Code: Alles auswählen

Dim MyVar.l(8) ?
Oder wie schaffe ich es, das Array in PB so aufzubauen, daß es

a) über ReadProcessMemory_ durchgehend gefüllt wird, und
b) trotzdem in 4byte Blöcken über das Arrayitem angesprochen werden kann ? Also wenn ich z.B folgende Definition habe:

DWORD MyVar[2] // 3 Items passen ins Array von 0-2, jeweils 4 Byte
Über ReadProcessMemory wird es nun gefüllt mit z.B

0 = 0A0A0A0A
1 = 0B0B0B0B
2 = 0C0C0C0C

damit ich dann später über MyVar(1) 0B0B0B0B erhalte ? Ich bekomme das mit Dim irgendwie nicht hin :/

Verfasst: 18.11.2006 16:27
von edel
Sollte so gehen , weiss nur nicht was es an der Adresse 0 zum lesen
geben sollte. Falls es Fehler geben sollte lass dir den Wert von
GetlastError_() ausgeben

Verfasst: 18.11.2006 16:56
von Glow
Also bei mir sieht das jetzt so aus:

Code: Alles auswählen

Dim MyVar1.l(0)
Dim MyVar2.l(8)
dim MyVar3.l(14)

ReadProcessMemory_(pID, $1AB2101, @MyVar1, SizeOf(MyVar1), @TmpBuf)
ReadProcessMemory_(pID, MyVar1, @MyVar2, SizeOf(MyVar2), @TmpBuf)

ReadProcessMemory_(pID, MyVar2(4), @MyVar3, SizeOf(MyVar3), @TmpBuf)
Es erfolgt eine überprüfung of TmpBuf & Sizeof(MyVar3) gleich sind. Da schlägt es momentan fehl. Der ausgegebene Fehler lautet:
Nur ein Teil der ReadProcessMemory- oder WriteProcessMemory-Anforderung wurde abgeschlossen.

Ich kapier das nicht, der C-Code funktioniert einwandfrei :/

Verfasst: 18.11.2006 17:27
von edel
Die Adresse eines Arrays bekommst du durch MyVar1() .
pID sollte ein Handle sein , das man z.b. von OpenProcess_([...])
bekommt. Der 2. Wert muss eine Adresse auf einen Speicherbereich
sein.

Code: Alles auswählen

Dim MyVar(7)

adresse   = 0 ; hier die adresse angeben 
nread     = 0
MyPID     = GetCurrentProcessId_()
hProcess  = OpenProcess_(#PROCESS_VM_READ,0,MyPID)
If Not ReadProcessMemory_(hProcess, adresse , MyVar(), 8*4, @nread) = 0
  Debug nread
EndIf

Verfasst: 18.11.2006 20:37
von Glow
Hi

Der Aufbau von ReadProcessMemory war mir schon klar, nur nicht wie ich die Arrays innerhalb nutzen muss. Dein Code hat mir trotzdem geholfen, da er das fehlende Puzzleteil enthalten hat:

MyVar()

Ich hatte innerhalb der API @MyVar geschrieben, und deshalb hat es nicht funktioniert. Jetzt klappt alles so wie es soll :D Der Punkt war ja, dass innerhalb der vorhergehenden Arrays weitere Speicheradressen "versteckt waren" die ich nach und nach auslesen musste.
Vielen Dank nochmal für deine Mühe.

Gruß
Glow