Autor Beitrag
Cypher2000
Hält's aus hier
Beiträge: 15

Win XP
Delphi 7
BeitragVerfasst: Di 11.08.09 14:08 
Hallo!

Die Vorgeschichte, wie ich modBaseAddr bekomme usw, gibt es in diesem Thread: www.delphi-forum.de/viewtopic.php?t=94069

Jetzt habe ich ein Problem mit ReadProcessMemory.
Egal was ich tue, es gibt immer "FALSE" zurück.

Hier einmal die Codezeile:
ausblenden Delphi-Quelltext
1:
ReadProcessMemory(ProcessInfo.hProcess,ADRESSE,@buffer,1,readbytes);					


In dem Argument in dem nur "ADRESSE" steht habe ich schon viele verschiedene Dinge versucht einzusetzen und ich denke da sitzt auch der Fehler. Hier mal mein letzter Beispielversuch, der erfolgreich Compiled aber FALSE zurückliefert:

ausblenden Delphi-Quelltext
1:
pchar(me32.modBaseAddr)+strtoint('$CAFE')					


Ich will jetzt nicht alles aufzählen aber ich habe z.B. mit den Funktionen pchar(), Pointer() und allem möglichen viel experimentiert.

Allerdings kommt immer nur ein Compiler Fehler oder (wenn es erfolgreich compiled wurde) ein FALSE zurück.
Ich bin ziemlich neu in dem Gebiet, wäre nett wenn mir jemand helfen könnte. :)

Achso: An me32.modBaseAddr + 0xCAFE soll ein String mit einer Versionsnummer liegen, falls das noch helfen sollte.

Vielen Dank! :D

Mit freundlichen Grüßen

Cypher
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 12.08.09 18:49 
Pointer(Integer(me32.modBaseAddr)+ $CAFE)

ich wieß gerade nich was modBaseAddr ist, wenns ein integer ist (und kein pointer) kannst du dir das Integer-Casten sparen.
Allerdings ließt du damit immer nur ein Byte aus (Also ersten Buchstaben eines chars).

Entweder du ließt einen Buffer aus

ausblenden Delphi-Quelltext
1:
2:
3:
Buffer: array[0..1024of Char;
ReadProcessMemory(ProcessInfo.hProcess,Pointer(Integer(me32.modBaseAddr)+ $CAFE) ,@buffer, SizeOf(Buffer), readbytes);
Text := PChar(Buffer);


(eher unschön da nicht bekannt wie lan der String ist) oder du ließt solange aus bis du auf ein #0 triffst:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  pAddr := Pointer(Integer(me32.modBaseAddr)+ $CAFE);
  dwLength := 0;
  while ReadProcessMemory(dwProcessID,pAddrRead,@bBuf,1,dwRead) and (dwRead = 1and (bBuf <> 0do
  begin
    inc(dwLength);
    pAddrRead := Pointer(DWord(pAddrRead)+1);
  end;



etc.

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Cypher2000 Threadstarter
Hält's aus hier
Beiträge: 15

Win XP
Delphi 7
BeitragVerfasst: Di 18.08.09 19:43 
Hi!

Ich habe jetzt mal folgendes ausprobiert:
ausblenden Delphi-Quelltext
1:
2:
if ReadProcessMemory(ProcessInfo.hProcess,pointer(integer(me32.modBaseAddr)+$CAFE),@buffer,1,readbytes)=true then Memo1.Text:='TRUE' else Memo1.Text:='FALSE';
ShowMessage(inttostr(readbytes));


Doch leider wird immernoch "FALSE" geliefert und 0 bytes wurden gelesen.
("buffer" ist "Array[0..255] of Char")

An "$CAFE" sollte es nicht liegen da der Versionsstring von der Basisadresse aus immer dort liegt.

Aber: Setze ich modBaseAddr überhaupt so richtig ein? Denn das soll ja die Adresse einer DLL sein und lesen tue ich ja aus dem Speicher des Prozesses. Muss ich vielleicht zu der DLL adresse (warum auch immer) noch irgendwas dazuaddieren oder subtrahieren?
Wie gesagt: Ich habe (noch) keine rechte Ahnung wie das zwischen DLLs und Anwendungen läuft. x)

modBaseAddr ist übrigens ein "PByte".

Vielen Dank für deine Hilfe! :)
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Di 18.08.09 20:06 
Was sagt denn

IntToHex(Integer(me32.modBaseAddr),8)

Stimmt die Adresse? Eventuell mal mit dem ProcessExplorer von Sysinternals etc. überprüfen bzw. OllyDbg -> Attach -> Alt+E

Nie auf = True testen sondern nur:

If ReadProcessMemory then ...

was kommt bei ReadBytes raus?

Hast du auch Read Acces auf dem Handle (notfalls PROCESS_ALL_ACCESS)

test es einfach mal in deinem Programm (selbst die dll laden "LoadLibrary" schaun ob me32.ModBaseAddre stimmt, und auf eigenem Process ReadProcessMemory ausführen)


Vielleicht bekommst due nicht die benötigten Rechte -> DebugPrivilegue holen

64Bit Process geht nicht! -> falls die DLL in Delphi erstellt sollte es ein 32Bit Process sein

und Versuch als Buffer (array of Byte ist ok) aber in ReadProcessMemory mal @Buffer[0] bzw. @Buffer[Low(Buffer)]

das erstmal zum Testen für dich :)

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Cypher2000 Threadstarter
Hält's aus hier
Beiträge: 15

Win XP
Delphi 7
BeitragVerfasst: Di 25.08.09 00:55 
Hi uall@ogc,

Nachdem ich deine Ratschläge ausführlich auf verschiedenste Art getestet habe und ich kurz vorm verzweifeln war, ist mir ein SEHR SEHR blöder Fehler aufgefallen.

Ich habe "procedure TForm1.Button1Click(Sender: TObject)" und das selbe nochmal für Button2.
Mit Button1 starte ich CreateProcess und benutze dazu die Variablen
ausblenden Delphi-Quelltext
1:
2:
3:
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
die von der Funktion gefordert werden.
Mit Button2 führe ich ReadProcessMemory aus.
Der Fehler lag jetzt dadrin, dass ich StartupInfo&ProcessInfo "global" gemacht habe (zumindest unter PHP heißt das so), also noch vor "implementation", aber ich beide Variablen gleichzeitig NOCHMAL in Button1 definiert habe, die dann auch von CreateProcess genutzt wurde.
Und ReadProcessMemory wollte aber von der globalen "ProcessInfo.hProcess" lesen... Den Rest kannst du dir ja sicherlich denken. ;) (Für alle anderen: Die beiden globalen Variablen waren immernoch leer!)

Und ich habs nicht gemerkt, argh! xD


Naja wie dem auch sei, ReadProcessMemory gibt jetzt zumindest schonmal TRUE zurück. Obs auch wirklich klappt mit dem auslesen werde ich dann morgen oder übermorgen schreiben. x)

Danke für deine Hilfe! :)


//edit:
Ich habs jetzt doch noch schnell getestet. Es funktioniert nun wunderbar! Also wie gesagt, vielen Dank für die Hilfe uall@ogc! :D