AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Reverse Engineering: Typisierte Dateien
Thema durchsuchen
Ansicht
Themen-Optionen

Reverse Engineering: Typisierte Dateien

Ein Thema von Zerolith · begonnen am 19. Jan 2005 · letzter Beitrag vom 19. Jan 2005
Antwort Antwort
Seite 1 von 2  1 2      
Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#1

Reverse Engineering: Typisierte Dateien

  Alt 19. Jan 2005, 10:26
Hallo,

Also, angenommen ich habe eine Typisierte Datei vor mir liegen. Mit einer Struktur die ich nicht kenne. Wie würde man vorgehen um ein Programm zu schreiben dass die Datei einlesen kann.

Irgendwie muss das doch möglich sein? Sieht man z.B. bei Savegame Editoren für Spiele.

Vorallem frage ich mich wie man das bei Strings macht die LÄNGER als 255 Zeichen sind. Kann man davon ausgehen dass einer der vorherigen Wert die Länge angibt?

Ich weiß ja nicht, in einem Hexeditor sieht man das m.e. nicht soooo toll.

Wie würdet ihr das machen?

gruß,
Daniel
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Reverse Engineering: Typisierte Dateien

  Alt 19. Jan 2005, 10:36
Zitat von Zerolith:
Hallo,

Also, angenommen ich habe eine Typisierte Datei vor mir liegen. Mit einer Struktur die ich nicht kenne. Wie würde man vorgehen um ein Programm zu schreiben dass die Datei einlesen kann.

Irgendwie muss das doch möglich sein? Sieht man z.B. bei Savegame Editoren für Spiele.
Entwickler von Savegame-Editoren gehen imho so vor, dass sie unzählige Spielstände speichern, je mit nur einer kleinen protokollierten Änderung. Die Änderungen die das am Savegame nach sich zieht wird analysiert, und so kommt man nach und nach der Wahrheit näher.
Je nach Komplexität eines Spiels und nach können das Savegame möglichst geschickt aufzubauen, kann das schon erheblicher Aufwand werden!

Zitat von Zerolith:
Vorallem frage ich mich wie man das bei Strings macht die LÄNGER als 255 Zeichen sind. Kann man davon ausgehen dass einer der vorherigen Wert die Länge angibt?
Nö. Üblich ist, dass ein "binär" gespeicherte String mit chr(0) abgeschlossen wird. Wo er beginnt bestimmen allein die vorhergehenden Strukturen. Aber das muss nicht immer so sein. Es kann ja jeder seine Strings speichern wie er will.

Zitat von Zerolith:
Ich weiß ja nicht, in einem Hexeditor sieht man das m.e. nicht soooo toll.
Trotzdem ist es fast dein einziger Freund bei deinem Vorhaben

Zitat von Zerolith:
Wie würdet ihr das machen?
Erstmal 2 Monate Urlaub nehmen...


Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Reverse Engineering: Typisierte Dateien

  Alt 19. Jan 2005, 10:42
Danke für die Hinweiße, machst mir ja mut *G*
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Reverse Engineering: Typisierte Dateien

  Alt 19. Jan 2005, 11:20
Hallo Zerolith,

wenn du das Format grundsätzlich kennst, kannst du mit TFileStream oder einfach mit BlockRead die Daten lesen und dann gemäß deiner Analyse zerlegen.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Reverse Engineering: Typisierte Dateien

  Alt 19. Jan 2005, 12:34
Also ich bin es "gewohnt" eigene Dateien in einem Objekt bzw. Record zu definieren und dann via FileStream das ganze
zu Speichern (Stream.Write....).

Bei Strings mache ich das meistens so:

Delphi-Quellcode:
TMeineDatei = record
  ...
  _String : String;
  ...
end;

...

var fs : TFileStream
begin
  fs := TFileStream.Create('datei.txt');
  fs.Write(Length(Record._String), SizeOf(Integer));
  fs.Write(Pointer(Record._String)^, Length(Record._String));
  ...
end;
wegen der Zeile
  fs.Write(Pointer(Record._String)^, Length(Record._String)); wurde ich schonmal gefragt warum ich das so mache es sei doch das selbe wie

  fs.Write(Record._String), Length(Record._String)); kann ich nicht sagen... so wie ich es mache funktioniert es in 100% der fälle - anders bekomm ich gelegentlich ne zugriffsverletzung.

BTT:

Ist es mit dieser Variante immer möglich eine Typisierte Datei auszulesen (vorrausgesetzt die Struktur ist bekannt)? Oder gibt es verschiedene Varianten die Datei zu spiechern / laden?

Danke, Daniel


[Edit: mein deutsch verbesser ^^]
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Reverse Engineering: Typisierte Dateien

  Alt 19. Jan 2005, 13:09
Typisierte Dateien in dieser Form sind eigentlich nicht so sehr üblich. In der Regel unterteilt man Daten in sog. "Chunks", also großere Abschnitte die durch irgendwelche Header-Strukturen eingeleitet werden. Eine andere Variante ist es die Offsets direkt mit einer Bedeutung zu belegen, was allerdings sehr statisch und unschön ist. Eine andere Möglichkeit ist es eine Art TOC (Tabel of Contents) im Header anzulegen, wo dann verzeichnet wird an welchem Offset welche Informationen zu finden sind.

Die Variante mit Chunks ist aber meiner Beobachtung nach recht beliebt, da sie sehr variabel ist, und sehr performant gestaltet werden kann. Innerhalb eines Chunks hat man es dann wiederum meist mit mehr oder minder statischen Strukturen zu tun. Oftmals ist es auch so, dass ein Datum allein auf Grund seiner Position relativ zu einem anderen Datum seine Bedeutung erst erhält. Sprich: Jemand (der Programmierer) definiert: 4 Bytes nach dem Wert für X, steht der Wert für Y. Sein Typ sei Integer.

Womit wir zum nächsten Kapitel kommen: Welcher Typ von Daten liegt überhaupt vor? In der Datei stehen einfach nur Werte. Wie sie zu interpretieren sind ist völlig unklar, solange man nicht die Spezifikationen hat. So kann ein Byte auch ein Char sein, oder nieder- oder höherwertiges Byte eines Words usw.. Apropos Byte-Wertigkeit: Little-Endian oder Big-Endian? Das ist die Frage! Da hilft dann oft nur eine Plausibilitätsprüfung - also wie interpretiert sieht der Wert wahrscheinlich richtig aus?

Ein gut dokumentiertes Format dass in Chunks organisiert ist, ist das WAVE-Format (www.wotsit.org). Daran erkennt man schnell, dass man ohne Doku nur sehr sehr schwer erkennen kann was was bedeutet.


Was du vor hast erfordert eine Menge an Erfahrung zu diversen Techniken in Sachen Datenverwaltung, eine Menge an Zeit, Frust-Resistenz und akribische Kleinarbeit. Und dass man wirklich alles raus bekommt ist eher selten der Fall.

Ich will dir ja nicht den Wind aus den Segeln nehmen, aber schon darauf hinweisen dass das u.U. nichts wird. Auch die meisten Savegame-Editoren beschräken sich auf die Abschnitte die von Bedeutung sind, bzw. ergibt sich deren Funktionalität daraus, was man geschafft hat zu identifiziren. Der Rest wird schlicht missachtet.
Und wenn du jetzt einen GANZ gemeinen Programmierer hattest, dann werden Informationen in das gesamte File verteilt . So könnte man ja einen Integer in seine 4 Bytes zerlegen, und diese irgendwo einsteuen, und vorher sogar umrechnen, so dass man den Wert als solchen garnicht mehr erkennt. In Spielen in denen Geld wichtig ist, könnte man z.B. einfach den Geldwert mit einer Formel verrechnen, so dass du, auch wenn du die richtigen Stellen im Savegame findest, den Wert darin nicht als deinen Geldbetrag wiedererkennst, da der ja eigentlich ganz anders war. Nur das originale Programm weiss was zu tun ist, um den Wert richtig zu interpretieren. Und schon hat man dich genatzt .
Zum Glück aber machen sich wohl nicht viele die Arbeit dass so zu "verschlüsseln". Bei Games kann das aber durchaus schon mal sein, um Cheatern den Garaus zu machen (richtig so!).


Letztlich musst du es einfach mal probieren um abschätzen zu können wie umfangreich und kompliziert das ganze wird. Am besten ganz klein anfangen - z.B. bei einem Spiel den Ausgangszustand speichern, und dann einen Schritt nach vorne. Wieder speichern, und die Bits um die sich die beiden Savegames unterscheiden haben schon mal sehr wahrscheinlich etwas mit der Spielerposition zu tun.


Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Reverse Engineering: Typisierte Dateien

  Alt 19. Jan 2005, 13:26
Es ist davon auszugehen, daß die Daten alle hintereinander liegen und die Datensatzlänge gleich ist. Hast du das Programm, welches die Daten verwaltet wenigstens ? Falls nicht, dann vergesse das am besten. Oder wie schon gesagt, 2 Monate Urlaub dafür verwenden.

Ist das Programm vorhanden, so versuche herauszufinden, wieviele Datensätze vorhanden sind. Also Filesize / Anzahl DS. Hierbei ist zu bedenken, daß intern eventuell zumindest ein Datensatz 0 vorhanden ist, den das Programm nicht anzeigt. Tja und dann geht das Stückwerk eben weiter.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Reverse Engineering: Typisierte Dateien

  Alt 19. Jan 2005, 13:30
Hi,

mal angenommen es wäre ein Spiel.

Könnte man die Struktur des Savegames (also der "typisierten Datei") nicht herausfinden, wenn man mit einem Disassembler die Speicher-Methoden des Spieles untersucht?

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Reverse Engineering: Typisierte Dateien

  Alt 19. Jan 2005, 13:33
Mit den Datensätzen muss man aber aufpassen. Die gibt es nämlich in dieser Form nicht immer, bzw. sogar mittlerweile eher selten. Je nach Alter des Formats hat man es häufiger mit variablen Strukturen zu tun, als mit statischen Satzlängen. Das wäre dann z.B. eine der aller ersten "Amtshandlungen": rauszufinden welche Grundstruktur denn überhaupt zu Grunde liegt.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Reverse Engineering: Typisierte Dateien

  Alt 19. Jan 2005, 13:35
Zitat von mirage228:
Hi,

mal angenommen es wäre ein Spiel.

Könnte man die Struktur des Savegames (also der "typisierten Datei") nicht herausfinden, wenn man mit einem Disassembler die Speicher-Methoden des Spieles untersucht?

mfG
mirage228
Mit viel viel Ahnung und Vollplan in ASM vielleicht. Man muss aber erst mal die Stellen identifizieren. Gerade Spielemachern liegt oft am Herzen dass man da nicht so einfach selbst dran rumfummeln kann.

\\edit: oops, Zitat, statt Edit gedrückt... Wie wäre es mit einer Zitat+Edit-Funktion?
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz