Autor Beitrag
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 10

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Sa 02.06.07 16:53 
Screenshot von TSearch + Name vom Spiel

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Sa 02.06.07 17: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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Sa 02.06.07 23: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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 08.06.07 08: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 10

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Fr 08.06.07 17: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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 08.06.07 18:29 
user profile iconuall@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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 10

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Fr 08.06.07 18: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 275

WinXP
BDS 2006
BeitragVerfasst: Fr 08.06.07 18:44 
Nicht, wenn er die Software nicht selber hat

gruss

_________________
erare humanum est
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 10

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Sa 09.06.07 11: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)^)^+$28)
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: So 20.04.08 10: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:

ausblenden volle Höhe 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:
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);  // Adresse des Pointers

// Handle der fremden Anwendung besorgen
  hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  ProcessEntry.dwSize := Sizeof(ProcessEntry);
  Schleife := Process32First(hSnapshot, ProcessEntry);
  while Schleife do
  begin
    if (CompareText(ProcessEntry.szExeFile, ProcessName) = 0then
      pID := ProcessEntry.th32ProcessID;
    Schleife := Process32Next(hSnapshot, ProcessEntry);
  end;
  CloseHandle(hSnapshot);
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);


// Hier wird der Wert der Pointer-Adresse ausgelesen--> HANDLE, Adresse, Wert, Größe, gelesene Bytes
  ReadProcessMemory(hProcess,adresse,@wert,sizeof(wert), BytesRead );

  wert:=wert+96;
  hexwert:=IntToHex(wert,0);   // Bis hierher stimmt alles...
  adresse:=@hexwert;


// Hier wird der Wert aus der berechnetten Adresse ausgelesen--> HANDLE, Adresse, Wert, Größe, gelesene bytes
  ReadProcessMemory(hProcess,adresse,@wert,sizeof(wert), BytesRead );

  closehandle(hProcess);

// ausgabe des wertes der gelesenen Adresse
  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
ausblenden Delphi-Quelltext
1:
  adresse:=@hexwert;					

wird komischerweise nicht der berechnette wert von
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: So 20.04.08 11:03 
Probiers mal so:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Mo 21.04.08 21: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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Di 22.04.08 01: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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8720
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 22.04.08 07: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 :mrgreen: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Di 22.04.08 15: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: Mo 28.04.08 12: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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8720
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 28.04.08 12: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: Mo 28.04.08 14:13 
Besten Dank...

user profile iconBenBE 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: Mo 28.04.08 20: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...