Autor Beitrag
ZSKing
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

Win XP SP 2
Delphi 2005 PE, Delphi, Pascal, PHP, HTML
BeitragVerfasst: Fr 04.04.08 09:05 
Moin Moin!
Ich bin neu in Delphi, habe schon die erste kleine Lektüre hinter mir (Delphi-Anfängerkurs mit Grundlagen) und habe jetzt leider ein Verständnis-Problem. Es dreht sich um den Arbeitsspeicher des Computers. Ich habe mich hier und bei Google-Ergebnissen einmal umgeschaut und bin öfters auf das Programm HxD gestoßen. Also habe ich das installiert und ich verstehe leider nicht, in welchem Format dieser Zahlenwirrwar ausgegeben wird und wie man das versteht bzw. später verwenden kann, wenn ich einen Virtuellen Arbeitsspeicher eines Programms öffne.

Ich wollte zur Übung/zum Spaß mal etwas machen, das schon ein bisschen anspruchsvoller ist und deswegen versuche ich Daten aus einem Programm auszulesen und über mein Programm mittels Indy-Komponenten an ein PHP-Script zu senden, das die Daten verwaltet und in einer Datenbank zu Verfügung stellt.

Ich denke das eizig große Problem ist, dass ich die Arbeitsspeicher-Geschichte nicht verstehe. Ich bin natürlich bereit Sachen zu lesen, versuchen zu verstehen, nochmals zu lesen etc. aber ich finde nichts zum Thema... Vielleicht habt ihr ja einen entsprechenden Text irgendwo mal gesehen, in dem der Arbeitsspeicher grundlegend erklärt wird. - Oder könnt mir anders weiterhelfen!

Liebe Grüße
Sascha aka ZSKing


PS:
Ich weiß sicher, dass das Programm die Daten bzw. viele Daten dynamisch im Speicher abelgt. (Von einem Programmierer der entsprechendes schon gemacht hat, mir aber momentan nicht weiterhelfen kann, da er 1. in einer anderen Sprache operiert und 2. momentan nicht erreichbar ist.) :(
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 04.04.08 09:48 
Der Arbeitsspeicher eines Programmes ist ein Regal von 4GB größe, wo Du jedes in jedes Fach ein Byte ablegen kannst.

Dies Ablegbaren Werte sind immer nur Zahlen zwischen 0 bis 255 (8 Bit, wobei nicht hinter jedem Fach auch wirklich eine Information liegt (Zugriffsverletzungen ;-)).

So, worum handelt es sich bei diesem Zeichenwirrwarr?
Der Linke Teil, ist die HEX-Darstellung der abgelegten Zahl; während der rechte Teil die Darstellung ist, wie der Dateninhalt Links als Zeichenfolge aussehen würde.

Was jedes Einzelne Zeichen nun bedeutet, hängt davon ab, wofür ein Programm den Inhalt einer Speicherzelle verwendet. Sind nämlich mehr als 256 verschiedene Werte für die Darstellung einer Information nötig, so werden mehrere Zellen zu einem Wert gebündelt.

Aber grob zu deinem Vorhaben: Das ist komplizierter als Du Dir das grad vorstellst; zumal viele Programme kein statisches Layout ihres Speichers aufweisen... Auch sollte man für sowas das Speichermanagement und die WinAPI etwas besser kennen, um damit sinnvoll umgehen zu knnen.

_________________
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.
mael
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 198
Erhaltene Danke: 39


Delphi XE3 Prof.
BeitragVerfasst: Fr 04.04.08 14:39 
BenBE hat ja schon einiges erklärt. Ich will noch ein paar Sachen hinzufügen.

Falls Du HxD verwendest bitte nimm die Version von meiner Webseite mh-nexus.de/hxd/ (Beta oder Stable, egal). In der Version die ich im Forum vorgestellt habe, habe ich gerade einen Fehler gefunden.


Der Arbeitsspeicher(=RAM) enthält alle Daten die manipuliert oder analysiert werden sollen, also Daten auf die man Operationen anwendet bzw. Zustände abfragt. Eine Operation kann eine Addition wie a := a + b; sein und eine Analyse/Abfrage kann sowas sein wie: if a > 2 then ... Im Arbeitsspeicher werden also Zwischenergebnisse und die Variablen gespeichert.

Festplatten (und ähnliche Speicher) werden verwendet um die Ergebnisse solcher Operationen/Abfragen dauerhaft zu speichern und wenn nötig wieder zu laden, Arbeitsspeicher dagen um mit den Daten zu arbeiten.

Nun etwas konkreter. Unter Betriebssystemen wie Windows wird zwischen zwei Arten von Arbeitsspeichern unterschieden: Physikalischer und virtueller Arbeitsspeicher.

Der physikalische Arbeitsspeicher entspricht dem Arbeitsspeicher wie er als Hardware im Computer verbaut ist. Der virtuelle Arbeitsspeicher wird dagegen verwendet um Programmen vorzugauckeln sie hätten den gesamten Arbeitsspeicher für sich allein.

D.h. jedes Programm unter Windows hat 4GB virtuellen Arbeitspeicher von dem ein Teil vom Betriebssystem verwendet wird und der Rest dem Programm zur Verfügung steht. Wie das im Detail funktioniert führt jetzt zu weit, Stichwort: Auslagerungsdatei.

Wenn Du jetzt in HxD :-) ein Programm öffnest wird der gesamte virtuelle Arbeitsspeicher des gewählten Programms angezeigt. Die linke (blaue) Spalte gibt die Position (=Offset) im virtuellen Arbeitsspeicher des geöffneten Programms an. Die mittlere Spalte ist der Inhalt des Arbeitsspeichers als Folge von Bytes dargestellt und die rechte Spalte zeigt das gleiche an, aber anstatt als Zahlenfolge als Zeichenfolge, also als Text.

Was verwirrend sein kann, ist daß alle Zahlen im hexadezimalen Format dargestellt werden. Im Dezimalsystem (=Zehnersystem) gibt es die Ziffern 0-9. Im Hexadezimalsystem (=Sechzehnersystem) die Ziffern 0-9 und A-F. Um zwischen den zwei Zahlensystem zu wechseln kann man z.B. den Windows-Taschenrechner verwenden. Die hexadezimale Darstellung wird aus praktischen Gründen verwendet. Siehe Wikipedia für Details.

Ein Hexeditor hat also vom Hexadezimalsystem seinen Namen: Hex(adezimal)-Editor.

Kurz gesagt: Der RAM-Editor vom HxD zeigt Dir den virtuellen Arbeitsspeicher von einem Programm als Folge von Bytes bzw. in Textdarstellung. Schreib mal ein Programm in Delphi und laß es eine Meldung ausgeben.

Z.B.: Mach ein neues Projekt in Delphi, doppelklicke auf die Form und ersetzte
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormCreate(Sender: TObject);
begin

end;

durch
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.FormCreate(Sender: TObject);
var
  s: string;
begin
  s := 'Beliebiger Testtext';
  ShowMessage(s);
  ShowMessage(Format('%p', [@s[1]])); // 2.Dialog zeigt die Adresse (hexadezimal) von dem Text-string an
end;
. Nachdem das Programm gestartet wurde (F9) kannst Du es im RAM-Editor von HxD öffnen (Suche nach sowas wie Project1.exe) und mit der Suchenfunktion (Datentyp: Text-string) nach
Zitat:
Beliebiger Testtext
suchen. D.h. irgendwo im virtuellen Arbeitsspeicher von deinem Programm steht dieser Text. Es kann sein daß er mehrfach vorkommt. Eines dieser Vorkommen wird die gleiche Adresse haben wie im zweiten Dialog angezeigt.

Falls Du weitere Fragen hast, beantworte ich die gerne.

[EDIT]Paar Schreibfehler korrigiert und Anleitung für Beispielprogramm verdeutlicht.[/EDIT]


Zuletzt bearbeitet von mael am Fr 04.04.08 19:22, insgesamt 1-mal bearbeitet
mael
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 198
Erhaltene Danke: 39


Delphi XE3 Prof.
BeitragVerfasst: Fr 04.04.08 16:19 
Habe nochmal ein paar Teile im obigen Beitrag berichtigt und verdeutlicht. Und klappt es?
ZSKing Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

Win XP SP 2
Delphi 2005 PE, Delphi, Pascal, PHP, HTML
BeitragVerfasst: Fr 04.04.08 19:12 
Moin Moin!
Erst habe ich so gedachht: Was will mir der seine Version andrehen, aber dann habe ich gesehen, dass du auch der Entwickler bist und die Seite die gleiche ist... Habe jetzt die Stable installiert und probiere ein bisschen herum / teste mein neu erworbenes Wissen! :) Vielen Dank für deine gute und ausführliche Hilfe

Wenn sich Fragen ergeben frage ich!
ZSKing
ZSKing Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

Win XP SP 2
Delphi 2005 PE, Delphi, Pascal, PHP, HTML
BeitragVerfasst: Fr 04.04.08 21:02 
Es gibt doch noch 2 Fragen:

Wenn ich jetzt etwas besonderes im Speicher suche und es auch gefunden habe (oder glaube es gefunden zu haben), wie kann ich das in ein Delphi-Programm implementieren und die Daten auslesen, wenn das Programm aus dem die Daten ausgelesen werden sollen ebenfalls geöffnet ist (anders geht es ja nicht)? Ein klitze kleines Beispiel wäre nett.

Gibt es noch eine andere Möglichkeit, dass ein Programm (ein realativ aufwendige Online-Spiel) anders als im RAM Daten speichert? Also ich habe folgende Hinweise: Einiges wird im Speicher abgelegt, jedoch nur 1-2 Daten, der Rest muss irgendwo anders sein. Warum ich so ein Rate-Spiel daraus mache? Es handelt sich bei dem Auslese-Prinzip außerhalb des Arbeits-Speichers um eine wahrscheinlich sehr wertvolle Community-Technologie, aber das ist hier etwas schwierig zu erklären. - Ich habe einen Entwickler, der das Prinzip kennt, aber verständlicherweise nach 4 Monaten Arbeit nichts sagt. Das Einzige sind die oben genannten Hinweise. Sollte jemand einen Tipp haben, wie man die Daten anders ausliest, solle sich bitte melden.

[Das Programm besteht nur aus 2 Dateien, nämlich aus der Anwendung und einer Daten-Datei, die beide zu 100% nicht verwendet sind!]


Ich hoffe ihr könnt mir helfen!
Sascha aka ZSKing
mael
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 198
Erhaltene Danke: 39


Delphi XE3 Prof.
BeitragVerfasst: Fr 04.04.08 23:24 
Es gibt dazu WinAPI-Funktionen ReadProcessMemory/WriteProcessMemory. Um eine Liste der gerade ausgeführten Prozesse zu finden kannst du die Funktion RunningProcessesList verwenden (Ist Teil der JCL, einen OpenSource-Bibliothek für Delphi). Die Suche nach den oben genannten Funktionen hier im Forum sollte einige Ergebnisse liefern.

Besonders könnte Dich Folgendes interessieren: Spiele Trainer erstellen

Es kann sein, daß das Spiel Daten irgendwo auf der Festplatte speichert, z.B. in der Auslagerungsdatei (indirekt über Memory Mapped Files). Es ist aber bei einen relativ aktuellen Spiel sehr wahrscheinlich, daß die fraglichen Daten im Speicher verschlüsselt sind. Auch werden häufig RAM-Ausleseprogramme daran gehindert die Daten zu lesen, per Treiber oder irgendeiner Art Überwachungswerkzeug. Falls das Spiel im Browser läuft kann es z.B. auch in Cookies Daten abspeichern.

Treiber und komplizierte Versteckspiele sind aber bei Nichtprofis (sprich keine Spielehersteller) unwahrscheinlich da recht aufwändig.

Es kann auch sein, daß sich die Daten ganz einfach zu schnell ändern und daher nicht gefunden werden.

Aber im Prinzip gibt es nur die Orte Arbeitsspeicher und Laufwerke wo die Daten sein könnten. Falls die Daten nicht verschlüsselt sind und du weißt wonach du suchst, und es unwahrscheinlich ist, daß das gesuchte häufig vorkommt kannst Du mal die gesamte Festplatte im Disk-Editor durchsuchen.

Ach ja, falls es Text ist, versuche auch mal die Unicode-Textsuche.

Für mehr Tipps braucht man mehr Informationen, ganz allgemein ist es schwer dazu was zu sagen.
ZSKing Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

Win XP SP 2
Delphi 2005 PE, Delphi, Pascal, PHP, HTML
BeitragVerfasst: Sa 05.04.08 11:57 
Okay ich weiß sicher, dass es möglich ist, die ganzen Daten auszulesen und ich weiß auch sicher, dass man nach 1-2 Daten mit einem Hex-Editor nicht weiterkommt. Teilweise werden auch Adresse genutzt (mit TSearch habe ich schon vorher gearbeitet).

Näheres wenn ich Näheres habe! :)
ZSKing