Autor |
Beitrag |
FrEaKY
      
Beiträge: 235
D7
|
Verfasst: Sa 24.07.10 23:11
Wie kann ich am besten eine Datei entschlüsseln, die teilweise (oder ganz) mittels XOR verschlüsselt wurde?
Es geht um Spieldateien des Spiels "Thandor - Die Invasion".
Laut dem einzigen Programmierer, der an dem Projekt beteiligt war, handelt es sich um ZIP-Archive, die teilweise oder ganz "gexort" wurden. Er kann sich aber nicht mehr an den Schlüssel erinnern.
In unserer Fan-Community wird viel spekuliert, aber eine Lösung hat keiner so wirklich. (Wer es mitverfolgen möchte: www.elfentraeume.eu/...t&start=20#p1381)
Wenn einer eine Antwort weiß, wäre ich bzw. wir sehr dankbar.
Thx.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Sa 24.07.10 23:13
Wieder mit XOR bearbeiten wäre eine Möglichkeit. Aber dazu solltest du auch den Schlüssel wissen mit dem es XOR-ed wurde, sonst könnt etwas viel blödsinn raus. Und bitte nur die Teile die nicht verschlüsselt sind mit XOR bearbeiten, sonst verschlüsselst du die unverschlüsselten teile und stehst wieder vor dem problem.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
FrEaKY 
      
Beiträge: 235
D7
|
Verfasst: Sa 24.07.10 23:16
Genau das ist leider das Problem. Ich weiß weder den Schlüssel, noch welche Teile verschlüsselt wurden.
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Sa 24.07.10 23:21
dann kannst du es vergessen.
Zuletzt bearbeitet von FinnO am Sa 24.07.10 23:22, insgesamt 1-mal bearbeitet
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Sa 24.07.10 23:21
Dann wirst du eventuell ein Problem haben. XOR könnte man als Polyalphabetische Substitution (im schlimmsten Fall) sehen. Im Link steht auch gleich wie man das knacken könnte, also viel spass damit (im link steht auch das es durchaus sein kann das es nicht geht). wenn ihr das passwort habt, sollte der rest kein problem sein.
lg elundril
p.s.: vergesst nicht das es im PC-Alphabet 256 "buchstaben" gibt. 
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Zuletzt bearbeitet von elundril am Mo 26.07.10 01:01, insgesamt 1-mal bearbeitet
|
|
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: Sa 24.07.10 23:27
Inwiefern ist auf der thandor.exe ein Debugger-Schutz drauf?
Ansonsten sollte man recht gut hinkommen, über die Aufrufe von ReadFile in Verbindung mit der Suche nach XOR-Befehlen die Verschlüsslung zu debuggen/reverse-engineeren ... Macht aber entsprechend Arbeit und erfordert etwas Übung darin.
Dazu bräuchte man aber mindestens eine vollständige Spielversion, die ich nicht da hab ...
_________________ 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.
|
|
FrEaKY 
      
Beiträge: 235
D7
|
Verfasst: Sa 24.07.10 23:37
@BenBE: Daran hab ich noch garnicht gedacht! Ich gucke gleich mal, ob sie sich mit dem Debugger öffnen lässt.
Allerdings bin ich damit noch nicht so erfahren. Muss ich dabei wissen, wie "ReadFile" in Assembler aussieht?
|
|
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: Sa 24.07.10 23:41
FrEaKY hat folgendes geschrieben : | @BenBE: Daran hab ich noch garnicht gedacht! Ich gucke gleich mal, ob sie sich mit dem Debugger öffnen lässt.
Allerdings bin ich damit noch nicht so erfahren. Muss ich dabei wissen, wie "ReadFile" in Assembler aussieht? |
Nein, das nicht, aber du brauchst einen guten Debugger, der Dir Call-Referenzen auflöst und bei der Code-Analyse ein wenig unterstützt. Siehe z.B. OllyDbg. Anhaltspunkte über den Source können aber auch helfen (Magic Numbers, ...)
_________________ 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.
|
|
FrEaKY 
      
Beiträge: 235
D7
|
Verfasst: Sa 24.07.10 23:49
BenBE hat folgendes geschrieben : |
Nein, das nicht, aber du brauchst einen guten Debugger, der Dir Call-Referenzen auflöst und bei der Code-Analyse ein wenig unterstützt. Siehe z.B. OllyDbg. Anhaltspunkte über den Source können aber auch helfen (Magic Numbers, ...) |
Ok, OllyDbg habe ich. Habs jetzt offen. Scheint soweit alles zu gehen. Allerings weiß ich nicht was Magic Numbers sind.
Edit: Ich fürchte mir mangelt es an Erfahrung mit dem Debuggen.
Aber wenn du interesse hast, das Spiel gibts bei Ebay für 1 Euro, weit unter seinem Wert!
Ich bleib aber natürlich trotzdem dran.
|
|
der organist
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: So 25.07.10 14:31
Hei!
Darf man kurz drauf hinweisen, dass 0 XOR 0 = 0 ist? Der Post nach dem verlinktem in eurem Forum sagt was anderes. Da is wohl jemandes "Schulwissen" etwas eingefroren  , er hat NAND beschrieben
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
IsNull
      
Beiträge: 97
Erhaltene Danke: 11
VS 2010, C#, AHK
|
Verfasst: So 25.07.10 22:39
Zitat: | XOR könnte man als Polyalphabetische Substitution (im schlimmsten Fall) sehen. |
Naja, wenn der Schlüssel absolut zufällig und die gleiche Länge wie der Plain-Text aufweist, dann ist es unmöglich zu knacken.
Aber häufig ist das ja nicht der Fall und es gibt dann durchaus optimierte Verfahren, um das zu knacken. (Oft wird der Schlüssel einfach so oft aneinander gehängt, bis die Schlüssellänge dem Plain-Text entspricht)
Was das ganze schwieriger macht ist, dass ja am ende kein "lesbarer" Text dabei rauskommen soll, sondern irgendwelche (binären) Daten. Dann funktionieren alle Angriffe die auf die Häufigkeit/Verteilung einzelner Buchstaben aufbauen nicht mehr.
Btw, CrypTool ist ein ganz nettes Anaylse Tool 
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 26.07.10 01:02
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Xearox
      
Beiträge: 260
Erhaltene Danke: 3
|
Verfasst: So 08.08.10 00:43
gibt es viele Firmen, die PCK nutzen?
also ich weiß, das Egosoft (X3 - Terran Conflict) pck files nutzen, um Skripte zu verpacken.
Vllt. könnte man mit dem Tool auch die PCK dateien von dem Spiel entpacken.
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: So 08.08.10 00:45
ich glaube, das hat mehr damit zu tun, dass .pck relativ eindeutig für Package steht?!
|
|
Xearox
      
Beiträge: 260
Erhaltene Danke: 3
|
Verfasst: So 08.08.10 00:52
also pck = package ... okay
hmm, vllt. klappt es ja mit dem tool 
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: So 08.08.10 13:39
Hab gerade die Exe mal 2h debuggt und nach dem algo gesucht.
Was ich herausefunden habe:
Es gibt Header-Blöcke von 0x2000 Bytes Größe. Jede Datei hat so einen Header und jedes Archiv ebenfalls. Darin steht die Dateianzahl, komprimierte und unkomprimierte Größe.
Nachdem eine Datei aus dem Archiv gelesen wurde, wird sie durch einen von 3 Dekomprimierungsfunktionen decomprimiert. (1 davon ist nur kopieren)
Zu dem Kompressionsalgo kann ich nix sagen. Vl eine Lauflängenkodierung.
Die exe selbst wurde wahrscheinlich mit FLASM assembliert und war vermutlich in Assembler geschrieben (keine Hochsprache)
Signaturen laufen dadurch ins leere. Mit Kompressionsalgos kenne ich mich leider nicht so weit aus, dass ich sagen könnte, ob das was eigenes ist, oder nicht.
Was noch interresant ist: In den pck archiven sind weitere Archive (die einzelnen Dateien)
Die nennen sich dann sam (Sound) oder str(String/Text)
Die sind ebenfalls komprimiert.
Von verschlüsselung habe ich nix gefunden. Lediglich die Kompression, die sehr seltsam aussieht.
BTW: Das ganze Ding ist voll von Sicherheitslücken. Was dort rumkopiert und geschrieben wird ist haarsträubend. Mit einem modifizierten Archiv kann man, bei dessen Laden, an beliebige Stellen im Code springen. Und das durch min 3 Varianten an unterschiedlichen Stellen (was mit so nebenbei aufgefallen ist. wird wohl mehr geben)
Außerdem: Den WAV-Dateien, die ich testweise dekomprimiert habe, fehlt der Header. Der wird z.T. statisch hinzugefügt und dann wird der Buffer an DirectSound übergeben.
Hab mal eine im Anhang. Wenn jmd den Header wiederherstellen kann, sollte die laufen. Die ersten 16 Byte oder so sind die hinzugefügten. Scheint ne unkomprimierte PCM Datei, Stereo, 22kHz zu sein.
Sollte Interesse bestehen, kann ich das vollständig reversen und ne Delphi-Klasse machen. Gegen angemessene Bezahlung, wird sehr wahrscheinlich sehr hoher Aufwand (>20 Stunden)
Einloggen, um Attachments anzusehen!
|
|
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: So 08.08.10 15:01
Kannst mal ein Annotiertes ASM-Listing geben?
Zwecks Kompression könnt ich mir das mal angucken. Ich denk mal, das wird ein LZW werden oder ne Vare der Lempel-Ziv-Familie. Aber dazu bräuchte ich Soße ...
_________________ 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.
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: So 08.08.10 17:04
apropo: Hab das Kürzel "LZ" als ref'd String gesehen
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| 0056ADC2 |. BF 302D5600 MOV EDI,00562D30 ; ASCII "LZ" 0056ADC7 |. 90 NOP 0056ADC8 |. 90 NOP 0056ADC9 |. 90 NOP 0056ADCA |. 90 NOP 0056ADCB |. 90 NOP 0056ADCC |. 90 NOP 0056ADCD |. 90 NOP 0056ADCE |. 90 NOP 0056ADCF |. 90 NOP 0056ADD0 |> 3B1C8F /CMP EBX,[EDI+ECX*4] 0056ADD3 |. 74 1B |JE SHORT 0056ADF0 0056ADD5 |. 49 |DEC ECX 0056ADD6 |.^ 79 F8 \JNS SHORT 0056ADD0 |
Achja und:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| 0056A866 |. BE DE315600 MOV ESI,005631DE ; UNICODE "Oh grosser Thomas, erlöse mich!" 0056A86B |. B9 10000000 MOV ECX,10 0056A870 |. FC CLD 0056A871 |. F3:A7 REPE CMPS DWORD PTR ES:[EDI],DWORD PTR [ESI] 0056A873 |.^ 75 CF JNZ SHORT 0056A844 0056A875 |. 8135 60325600 00000400 XOR DWORD PTR [563260],40000 0056A87F |. 810D 60325600 00000800 OR DWORD PTR [563260],80000 0056A889 |. B8 1E325600 MOV EAX,0056321E ; UNICODE "Hmmm, na gut... ;-)" 0056A88E |. E8 ADC7FFFF CALL 00567040 |
Code mit dem lesen aus der Datei und den 3 Funktionen im Anhang.
Die seltsamen Funktionspointer in der Decomp2 führen auf ne Art Heap-Verwaltung. Da wird ne Liste o.ä. durchsucht, und bei Verwendung getaggt. Ein freier Eintrag wird zurückgegeben.
Einloggen, um Attachments anzusehen!
|
|
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: So 08.08.10 19:31
hmmm, man sind da viele NOPs drinnen...
_________________ 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.
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: So 08.08.10 19:34
jop. darum meine vermutung mit dem assembler. auch weil die signaturen meinten flasm (Flat Assembler)
Meine Vermutung zu den Decodern:
1: Ist klar: Nix. Einfach kopieren
2: Blockverschlüsselung (bzw kompression)
0: Einzelner Block
Was es ist steht im Header der Datei. Und wird nicht geprüft.
Schreib ne Zahl Größer 2 rein und sorg noch für den richtigen Dateipfad, wo das ding grade liegt und du kannst den ablauf steuern wie du willst... (Hinter der Pointer-Tabelle für die Funktionen liegt ein String mit dem Dateipfad)
|
|
|