Entwickler-Ecke
Windows API - Gedankenlesen
vralfy - Mo 26.05.03 17:35
Titel: Gedankenlesen
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
Andreas Pfau - 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 :wink:
Delete - 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 - 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 :)
Delete - 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? :roll:
vralfy - 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 :)
Delete - Mo 26.05.03 23:21
Wie wäre es mit: "Speicherbereich eines fremden Prozesses auslesen"? :wink:
vralfy - 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' ??
Delete - Di 27.05.03 00:38
Hast du die ProcessEntry32-Struktur initialisiert?
vralfy - Di 27.05.03 00:53
Delphi-Quelltext
1:
| pe.dwSize := SizeOf(ProcessEntry32); |
so?
Delete - 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 - 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 :)
Delete - 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 - 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. |
Delete - Di 27.05.03 01:14
Du mußt aufpassen: pe.szExeFile liefert dir unter 98 auch den kompletten Pfad!
vralfy - Di 27.05.03 01:16
au .. danke fuer die warnung :)
Delete - Di 27.05.03 01:18
Du solltest aber noch prüfen, ob CreateToolhelp32Snapshot auch einen Wert ungleich null liefert.
vralfy - 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 (??)
Delete - Di 27.05.03 01:24
Meins nicht. D6 Personal.
vralfy - Di 27.05.03 01:26
D6 Enterprise aber komisch isses trotzdem
FriFra - Di 27.05.03 23:48
@vralfy: Zu meiner Zeit als Zivi hätte ich keine 3000,- € für die Enterprise übrig gehabt...
vralfy - Do 29.05.03 16:54
bitte wer hat gesagt das ich das bezahlt habe und nicht wer anders?
Anonymous - Fr 30.05.03 20:44
@Luckie
Warum vergleichst du mit true und wozu die begin...end blöcke mit einem Befehl?
Delete - Fr 30.05.03 22:31
Der Vergleich mit TRUE ist etwas unglücklich, das stimmt.
Das begin und end sthet da der Übersichtlichkeithalber.
vralfy - Do 05.06.03 23:03
jo das mit begin und end jedesmal und der vergleich mit true hab ich mir damals bei meinem ersten Infolehrer angewöhnt
(bei php hab ich die macke auch drin) aber ich optimiere später immer :)
sorry hatte keine zeit zu antworten hatte arbeit :(
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!