Autor |
Beitrag |
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Sa 02.06.07 17:53
Screenshot von TSearch + Name vom Spiel
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
Chryzler
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Sa 02.06.07 18:32
Versuchs mal so:
Such erstmal in TSearch die aktuelle Adresse von deinem gewünschten Wert, und dann suchst du nach dieser wiederum, sodass du praktisch zum Pointer kommst, der auf die Adresse zeigt. Ich hoffe mal, dass TSearch den findet.
|
|
Makenshi
Hält's aus hier
Beiträge: 12
|
Verfasst: So 03.06.07 00:17
So. Zum besseren Verständnis einmal die zwei Screenshots aus Tsearch.
Das Spiel hat wie schon erwähnt keinen Namen. Es ist ein von einem Editor erzeugtes Spiel. Es ist kein komerzielles bekanntes Spiel. Ich möchte auch keinen Spieletrainer oder ähnliches machen.
Screenshot vom "Autohack"(Debugger) von Tsearch
Screenshot von der Konsole des Spiels und von Tsearch
Zitat: |
Versuchs mal so:
Such erstmal in TSearch die aktuelle Adresse von deinem gewünschten Wert, und dann suchst du nach dieser wiederum, sodass du praktisch zum Pointer kommst, der auf die Adresse zeigt. Ich hoffe mal, dass TSearch den findet.
|
Also praktisch den Pointer vom Pointer finden?
Hm, ich weiß nicht ob das hier möglich ist. Ich schau mal ob ich da was finde. Danke für die Idee !
Edit:
Leider ist der Pointer anscheinend nirgenswo abgespeichert. Schade. :/
|
|
Makenshi
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 08.06.07 09:52
Ich hoffe das ein Push hier erlaubt ist.
An sich wäre ich über eine abschließende Antwort zu diesem Thema glücklich. Selbst wenn es etwas ist wie "tut uns leid, das ist nichts was man ohne Erweiterung deines eigenen Wissens fertigstellen kann."
Immerhin solle ich ja auch Screenshots posten. Hatte dies nun einen Sinn?
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Fr 08.06.07 18:59
Abschließend ist zu erwarten, dass neben deiner Unerfahrung mit Delphi noch die Unerfahrung mit Assembler/Debugging/Speichermanagement dazu kommt und ich einfach mal behaupte, dass DU es nicht hinbekommst. Und wenn du nach solanger Zeit immer noch nicht gesagt hast um welches Programm es geht, wird hier auch niemand zwischenzeilich mal selbst geschaut haben.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
Makenshi
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 08.06.07 19:29
uall@ogc hat folgendes geschrieben: | Und wenn du nach solanger Zeit immer noch nicht gesagt hast um welches Programm es geht, wird hier auch niemand zwischenzeilich mal selbst geschaut haben. |
Liest du meine Posts nicht?
Ich habe solangsam das Gefühl. Ich habe doch bereits mindestens 3 mal geschrieben das:
Zitat: |
Das Spiel hat wie schon erwähnt keinen Namen. Es ist ein von einem Editor erzeugtes Spiel. Es ist kein komerzielles bekanntes Spiel.
|
Der Editor selbst ist der RPG Maker 2003. Ich weiß zwar nicht inwiefern das helfen kann, aber nun gut.
Du wirst sicher deine Gründe haben.
Aber anscheinend ist es auch für jemanden mit den Kentnissen nicht möglich so ein Programm mal eben aus dem Hut zu zaubern.
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Fr 08.06.07 19:43
Korrekt, wenn man nämlich nicht den Zugriff darauf hat ist es nicht möglich. Sonst wäre das eine Sache von 5 Minuten.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
Robinator
Beiträge: 275
WinXP
BDS 2006
|
Verfasst: Fr 08.06.07 19:44
Nicht, wenn er die Software nicht selber hat
gruss
_________________ erare humanum est
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Sa 09.06.07 12:31
Also habs mir nu angeschaut:
1) vielleicht reciht schon das Spiel mit "TestPlay HideTitle Window" zu starten (was anderes macht dr RPG maker auch nicht, dann kann man die Variablen auch im SPiel ändern) WObei das TestPlay das entscheiden ist, Window macht halt keinen Fullscreen ;P
2) Ansonsten berchnet sich die Variable nach: PPointer(PInteger(PInteger($004c5a94)^)^+$2
Sie änder sich während des spiels öfter mal, also immer neu auslesen. Hab aber gerade keine Zeit ein PRogramm dafür zu schreiben, vielleicht später.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
bensch
Beiträge: 44
|
Verfasst: So 20.04.08 11:56
Titel: help
ich glaube, hier passt mein anliegen am besten rein, deswegen grabe ich nochmal den alten thread aus.
also ich würde gerne aus dem speicher den wert einer bestimmten adresse auslesen. da der wert, den ich auslesen will, von der anwendung immer unter einer anderen adresse geschrieben wird, habe ich nach dem pointer gesucht, der auf diese adresse zeigt.
der pointer befindet sich auf 9D903C. um jetzt an die richtige adresse des wertes zu kommen, müsste ich die adresse 9D903C auslesen, und den wert dieser adresse mit 60hex addieren. als ergebnis würde ich dann die speicheradresse des wertes erhalten, den ich benötige.
dabei habe ich aber bei der berechnung der richtigen speicheradresse schwierigkeiten. bisher habe ich das auslesen und addieren des ausgelesenen wertes so gemacht:
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: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| uses ... TLHelp32, ...
type PFindWindowStruct = ^TFindWindowStruct; TFindWindowStruct = record Caption: string; ClassName: String; WindowHandle: THandle; end;
var Form1: TForm1; hSnapshot: THandle; hProcess: THandle; ProcessEntry: TProcessEntry32; Schleife: BOOL; pID: Integer; wert:integer; BytesRead: DWORD; adresse:pointer; hexwert:string;
const ProcessName = 'Anwendung.exe';
...
procedure TForm1.Button1Click(Sender: TObject); begin adresse:=ptr($9D903C); hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); ProcessEntry.dwSize := Sizeof(ProcessEntry); Schleife := Process32First(hSnapshot, ProcessEntry); while Schleife do begin if (CompareText(ProcessEntry.szExeFile, ProcessName) = 0) then pID := ProcessEntry.th32ProcessID; Schleife := Process32Next(hSnapshot, ProcessEntry); end; CloseHandle(hSnapshot); hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
ReadProcessMemory(hProcess,adresse,@wert,sizeof(wert), BytesRead );
wert:=wert+96; hexwert:=IntToHex(wert,0); adresse:=@hexwert;
ReadProcessMemory(hProcess,adresse,@wert,sizeof(wert), BytesRead );
closehandle(hProcess);
Edit1.Text := inttostr(wert); end; |
aber da gibt es irgendwo ein problem im unteren teil des codes. bis zu der stelle "// Bis hierher stimmt alles..." wird alles korrekt durchgeführt. aber bei der zeile darunter, also
Delphi-Quelltext
wird komischerweise nicht der berechnette wert von
Delphi-Quelltext 1: 2:
| wert:=wert+96; hexwert:=IntToHex(wert,0); |
übergeben, sondern irgend eine andere adresse. ich habe jetzt schon versucht, mit verschiedenen datentypen diese adresse zu berechnen, aber entweder es kam ein falscher wert dabei raus, oder es kam der fehler "Operation ist auf diesen Operator nicht anwendbar"...
wie könnte ich nun diese berechnung durchführen? kann mir da irgend jemand helfen? ich habe den spiele-trainer thread schon einige male durchgelesen, aber in dem thread geht es leider nur um statische speicheradressen...
hoffe ihr könnt mir helfen.
gruß bensch
|
|
Chryzler
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: So 20.04.08 12:03
Probiers mal so:
Delphi-Quelltext 1: 2: 3: 4: 5:
| ReadProcessMemory(hProcess, adresse, @wert, SizeOf(wert), BytesRead); adresse := Ptr(wert + $60); ReadProcessMemory(hProcess, adresse, @wert, SizeOf(wert), BytesRead); CloseHandle(hProcess); Edit1.Text := IntToStr(wert); |
|
|
bensch
Beiträge: 44
|
Verfasst: Mo 21.04.08 22:29
hey klasse, das funktioniert!
sagenhaft, da saß ich jetz einige stunden drann, habe probiert und mindestens 10 seiten gelesen, an was es liegen könnte, und dann wird einem so eine simple lösung gezeigt, die wunderbar funktioniert. ich fass es nicht!
aber ich verstehe momentan etwas noch nicht ganz: wie kann aus einem integer-wert bei addidion mit $60 ein hex-wert werden? denn schließlich wird ein hex-wert ja zum auslesen "ReadProcessMemory(hProcess, adresse, @wert, SizeOf(wert), BytesRead);" benötigt, oder?
auf alle fälle: danke für die hilfe, hat wunderbar geklappt!
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 22.04.08 02:49
ich glaub int und hex verwaltet delphi. das heißt du kannst glaub ich jede zahl sowohl als hex als auch als int verwenden. bitte korrigiert mich wenn ich falsch liege aber ich hab das so irgendwie im hinterkopf gehabt und wollts mal ebenso da reinschreiben (damit ich mein englisch-spezialgebiet nicht weitermachen muss^^)
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 22.04.08 08:58
Oh Mann, ob man dem Computer ne Zahl zur BAsis 2, 10, 16 oder 64 gibt, ist dem im Endeffekt so ziemlich egal, weil der intern eh nur mit Basis 2 rechnet Und wie man dem das präsentiert, ist Ansichtssache Im Endeffekt sind alles nu Ganzzahlen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
bensch
Beiträge: 44
|
Verfasst: Di 22.04.08 16:07
ich hatte mich bloß gewundert, weil alle beispiele, die ich irgendwo im netz gefunden habe, benutzen den datentyp string für die hex-darstellung...
aber danke für die antwort
|
|
AHT
Beiträge: 207
|
Verfasst: Mo 28.04.08 13:02
Mmmh..., interessante Sache...
OK, habe hier auch noch ein paar Fragen:
1.) Wenn ich das hier richtig sehe, ist der erste (also der fixe) Pointer, der zum Auslesen der Variable ermittelt werden muss, nichts anders als ein "Listeneintrag".
Die Liste, um die es sich da handelt, dürfte eine Liste aller mit GlobalAlloc und dem Flag GMEM_MOVEABLE zugewiesenen Speicherbereiche sein. Ist dem so oder bin ich da auf dem Holzweg?
2.) Wenn dem so ist, dürfte diese fixe Adresse, deren Wert am Anfang ausgelesen werden muss, abhängig vom jeweiligen Betriebsystem sein. Stimmt ihr mir zu?
3.) Wenn ich bislang Recht hatte, dürfte sich die fixe Adresse auf andere Betriebsysteme umrechnen lassen. Ist dem so?
4.) Wenn ich bislang Recht hatte, wo ist dann der Startpunkt dieser Liste? Irgendwie muss der Prozess ja wissen, wo er diese Liste erstellen soll, der Startpunkt dürfte sich also auf irgend eine Weise zuverlässig ermitteln lassen...
5.) Wird der Speicherbereich für die "Variablen" aus irgendeinem Grund mit GMEM_FIXED bereitgestellt, dürfte sich die Adresse nicht so einfach ermitteln lassen - wüsste im Augenblick jedenfalls keinen fixen Punkt zum Auslesen des Pointers auf den Speicherbereich der Variablen, der einfach zu ermitteln wäre...
Will hoffern, es ist verständlich, worauf ich da hinaus will. Ich bin ein ziemlich ungebildeter Mensch und mir fehlen zu vielen Sachen die Fachbegriffe.
Habe mich mit dem Thema noch nicht eingehender beschäftigt. Sind erst mal nur Vermutungen, weil mir da etwas bekannt vorkommt.
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 28.04.08 13:34
1) Jein, es ist eine Liste, muss aber nicht die Liste von GlobalAlloc sein
2) Solche fixen Pointer sind eher Hinweise auf globale Variablen. während solche Variablen Adressen auf dynamisch reservierte Bereiche hindeuten
3) Umrechnen zwischen den OS brauch man nicht, da das ganze immer relativ zum Datensegment der Anwendung aus der Symbol File hervorgeht; wenn man die nicht hat, kann man das aber auch mit Adresse-StartOfDataSegment rausfinden und rechnet diese VA je nach Memory Mapping wieder um.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
AHT
Beiträge: 207
|
Verfasst: Mo 28.04.08 15:13
Besten Dank...
BenBE hat folgendes geschrieben: | 1) Jein, es ist eine Liste, muss aber nicht die Liste von GlobalAlloc sein
|
War da auf dem Holzweg - das ist definitiv eine andere Liste (die steht ganz woanders); das Verfahren zum Auslesen scheint da aber gleich zu sein, das hat mich etwas irritiert. Nette Geschichte - scheint man ja (auf den ersten Blick) recht einfach umsetzen zu können...
|
|
bensch
Beiträge: 44
|
Verfasst: Mo 28.04.08 21:04
@ AHT: Wenn sich deine Frage auf meine Posts bezog: In meinem Fall wäre das Betriebssystem Windows gewesen, da die Anwendung, deren Speicherbereich ich auslesen wollte, eh nur für Windows geproggt wurde...
|
|
|