| Autor |
Beitrag |
vralfy
      
Beiträge: 16
|
Verfasst: Mo 26.05.03 17:35
Ich habe 2 Programme:
UD_client von United Devices
Samurize
ich will mit Samurize den Fortschritt von UD auf meinem Desktop zeigen lassen. Ich dachte mir ich lese den RAM aus und schreib das Ergebniss in eine txt-file die samurize dann einfach ausgibt. Problem ist.. ich lese zwar .. aber das falsche. Ich habe eine Konsoleanwendung gewählt, damit sie später als Dienst laufen kann.
So sieht es aus: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| program Project1; {$APPTYPE CONSOLE} uses SysUtils; var p:^integer; addr:integer; begin addr:=$0046AE18; integer(p):=addr; writeln('Wert ('+inttohex(addr,8)+'): '+inttohex(p^,8)+' :'+inttostr(p^)); readln(ans); end. |
die Adresse ist die richtige (hab ich mit nem Cheattool gefunden), aber das Programm gibt mir nur mist aus.
Weiß jemand wie ich dieses Problem löse, und woran das liegt?
Danke
Moderiert von tommie-lie: Delphi-Tags hinzugefügt
_________________ Wer Rechtschreibfehler findet, darf sie behalten
|
|
Andreas Pfau
      
Beiträge: 997
|
Verfasst: Mo 26.05.03 19:50
Hallo,
SO GEHT'S NICHT! Mit Windows ist das so: Wenn ein Programm, sagen wir mal dein UD_Client, RAM anfordert, schaut Windows, wo Platz im RMA ist, und weist den zu. Das kann immer an einer anderen Adresse sein. Deine HEX-Adresse war nur in dem Augebnlick gültig, als du dein Cheattol angewendet hast. Im Extremfall kann sie eine Nanosekunde später nutzlos sein, und unter Umständen sogar zu Speicherschutzverletzungen führen.
Ich würde in deinen UD_Client (ist das Prog überhaupt von dir?) entweder DDE oder MMF einbauen, und das mit Samurize auslesen. Oder der Client schickt Windows-Messages an Samurize. Schau dir hierzu in der SDK den Begriff "RegisterWindowMessage()" an, das wird sicher helfen.
Wenn das Prog nicht von dir ist, solltest du dich evtl. mit dem Hersteller in Verbindung setzen (Homepage?), villeicht hat das Prog schon eine DDE-Schnitstelle.
Aber das mit dem RAM vergiss mal wieder schnell 
_________________ Life is a bad adventure, but the graphic is really good!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 26.05.03 21:35
Desweitern kann man unter 32-Bit Windows Gott sei Dank nicht so ohne weiters in fremden Adressräumen rumfuschen.
Stichworte für dich wäre: ReadProcessMemory und WriteProzcessmemory.
|
|
vralfy 
      
Beiträge: 16
|
Verfasst: Mo 26.05.03 23:02
@Andreas Pfau
Das wusste ich schon aber ich dachte das wäre ein guter Anfang.
UD_Client ist ein Teil von mehreren Programmen die sowas wie Seti@Home oder RC5 darstellen.
@Luckie
Deine Antwort hat mir sehr geholfen und es ist folgender kurzer code herraus gekommen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| program UD_watch; {$APPTYPE CONSOLE} uses SysUtils, windows; var p:^integer; handle,value:integer; nob:Cardinal; begin handle:=OpenProcess(PROCESS_ALL_ACCESS,true,$057C); if handle=0 then begin write('Prozess nicht geoeffnet!'); exit; end; integer(p):=$0046AE18; if ReadProcessMemory(handle, p, @value, 4, nob) then begin write(inttostr(value)); end; end. |
Mein Problem ist jetzz seit 4 Stunden wie finde ich die ProcessID ($057C) raus die sich ja ständig ändert.
Wenn ihr mir da nochmal helfen koenntet wäre das sehr net.
Aber ich danke trotzdem 
_________________ Wer Rechtschreibfehler findet, darf sie behalten
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 26.05.03 23:10
CreateToolHelp32Snapshot heißt das Zauberwort.
Aber mal was anderes: Was hat deine Topicüberschrift mit deinem Problem zu tun? 
|
|
vralfy 
      
Beiträge: 16
|
Verfasst: Mo 26.05.03 23:19
Danke ich werde es gleich mal probieren.
Also wegen dem Topic: Ich wusste nicht besseres also dachte ich mir da ich ein Prog schreiben will das im RAM (Gehirn) nach Werten (Gedanken) rumfuscht, nenne ich das ganze Gedankenlesen 
_________________ Wer Rechtschreibfehler findet, darf sie behalten
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 26.05.03 23:21
Wie wäre es mit: "Speicherbereich eines fremden Prozesses auslesen"? 
|
|
vralfy 
      
Beiträge: 16
|
Verfasst: Di 27.05.03 00:28
Gute Idee
aber wo wir bei thema sind:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0); if Process32First(hSnap, pe) then begin writeln(pe.szExeFile); while Process32Next(hSnap, pe) do writeln(pe.szExeFile); end else begin writeln('NO PROCESS'); exit; end; |
wieso les ich 'NO PROCESS' ??
_________________ Wer Rechtschreibfehler findet, darf sie behalten
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 27.05.03 00:38
Hast du die ProcessEntry32-Struktur initialisiert?
|
|
vralfy 
      
Beiträge: 16
|
Verfasst: Di 27.05.03 00:53
Delphi-Quelltext 1:
| pe.dwSize := SizeOf(ProcessEntry32); |
so?
_________________ Wer Rechtschreibfehler findet, darf sie behalten
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 27.05.03 00:54
Zum Beispiel, aber da sind noch ein paare andere Dinge. uich arbeite gerade dran. 10 Minuten oder so.
|
|
vralfy 
      
Beiträge: 16
|
Verfasst: Di 27.05.03 00:55
ja ich habs .. hatte es nur an der falschen stelle ... Vielen dank nochmal ich glaub das hat jetzt alle meine Probleme gelöst 
_________________ Wer Rechtschreibfehler findet, darf sie behalten
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 27.05.03 01:03
Ich habs jetzt so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| var hSnapShot : Cardinal; pe32 : TProcessEntry32; begin hSnapShot := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); if hSnapShot <> 0 then begin ZeroMemory(@pe32, sizeof(pe32)); pe32.dwSize := sizeof(ProcessEntry32); writeln(pe32.szExeFile); if Process32First(hSnapShot, pe32) = true then begin while Process32Next(hSnapShot, pe32) = true do begin writeln(pe32.szExeFile); end; end; end; readln; end. |
|
|
vralfy 
      
Beiträge: 16
|
Verfasst: Di 27.05.03 01:11
und ich habs jetz so;
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| program UD_watch; {$APPTYPE CONSOLE} uses SysUtils, windows, TlHelp32; var p:^integer; handle,value,pid:integer; nob:Cardinal; hSnap:hwnd; pe : ProcessEntry32; begin pid:=0; hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0); pe.dwSize := SizeOf(ProcessEntry32); if Process32First(hSnap, pe) then begin if UpperCase(pe.szExeFile)=UpperCase('UD.EXE') then pid:=pe.th32ProcessID; while Process32Next(hSnap, pe) do if UpperCase(pe.szExeFile)=UpperCase('UD.EXE') then pid:=pe.th32ProcessID; end else begin writeln('NO PROCESS'); exit; end;
handle:=OpenProcess(PROCESS_ALL_ACCESS,true,pid); if (handle=0) and (pid=0) then begin write('Prozess nicht geoeffnet!'); exit; end; integer(p):=$0046AE18; if ReadProcessMemory(handle, p, @value, 4, nob) then begin write(inttostr(value)); end; end. |
_________________ Wer Rechtschreibfehler findet, darf sie behalten
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 27.05.03 01:14
Du mußt aufpassen: pe.szExeFile liefert dir unter 98 auch den kompletten Pfad!
|
|
vralfy 
      
Beiträge: 16
|
Verfasst: Di 27.05.03 01:16
au .. danke fuer die warnung 
_________________ Wer Rechtschreibfehler findet, darf sie behalten
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 27.05.03 01:18
Du solltest aber noch prüfen, ob CreateToolhelp32Snapshot auch einen Wert ungleich null liefert.
|
|
vralfy 
      
Beiträge: 16
|
Verfasst: Di 27.05.03 01:21
wenn ich sowas mache wie
if hSnap=0 then ... exit ...
sagt mir delphi das dieser Vergleich immer Falsch ergeben wird (??)
_________________ Wer Rechtschreibfehler findet, darf sie behalten
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 27.05.03 01:24
Meins nicht. D6 Personal.
|
|
vralfy 
      
Beiträge: 16
|
Verfasst: Di 27.05.03 01:26
D6 Enterprise aber komisch isses trotzdem
_________________ Wer Rechtschreibfehler findet, darf sie behalten
|
|