Decryption

Schnelle objektorientierte, kompilierende Programmiersprache.
Shortyoo
Beiträge: 17
Registriert: Di Feb 17, 2015 9:55 pm

Decryption

Beitrag von Shortyoo » Di Feb 17, 2015 10:06 pm

Guten Abend an alle! :D

Habe mich mal mit einem Hack für ein Spiel (Final Fantasy VII, falls das jemandem was sagt) beschäftigt, so weit hat es geklappt.
Jetzt bin ich vorhin auf ein "Savegame Editor" (Spielstand Bearbeiter) gestoßen, es kommt schon einige davon zum Download, die auch funktionieren, jedoch wollte ich mich selbst daran versuchen (habe noch nicht soo viel Ahnung, programmiere inaktiv seit 2013).
Hab also erst mal ein Savegame über einen Hex-Editor geöffnet, jetzt will ich versuchen einige Werte zu decrypten (derzeit an der Spielzeit, für mich am einfachsten), mein Problem ist jetzt:
Der Hex-Editor zeigt mir an dass Position 2E den Hex-Wert 81 hat, unten rechts in einem kleinen Hilfe Fenster steht die Zahl "116865" (Spielzeit in s), Hex Wert 80 hat somit 116864, Hex-Wert 7F also 116863.

Jetzt zu meiner eigentlichen Frage:
Wie komme ich von dem Hex-Wert 81 auf 116865? Dass ich sowas wie ein Decryption-Key brauche denke ich mir schon, aber wie kann ich ihn (ohne auf einen schon fertigen Source-Code gucken zu wollen) rausbekommen?
Ich dachte an etwas wie FE55 (Begründung: Oben Links steht Position 2E / FE55 , sprich Hex 81), aber ich habe keine Ahnung ob er das ist, oder wie ich ihn einbringen soll? :D

Derzeitiger Code:

Code: Alles auswählen

void DecryptSavegame(){
	cout << "Dateiname: ";
	cin >> ersteS;
	ifstream ifE(ersteS.c_str(), ios::binary|ios::in);
	if(!ifE){cout << "ifE konnte nicht geoffnet werden. Schliesse nach Tastendruck"; getch();}
	else{
		ofstream ofZ(Ziel.c_str(), ios::binary|ios::out);
		if(ifE.get(cE)){
			dwordHexString = cE;
			cout << cE << " " << dwordHexString << endl;
			stringstream ss(dwordHexString);
			ss>>hex>>dword;
			cout << dword;			
			ofZ.put(dword);
		}
	}
}
Egal ob ich nun:

Code: Alles auswählen

dwordHexString = "0xFE55"+cE;
oder

Code: Alles auswählen

dwordHexString = cE+"0xFE55
noch wenn ich

Code: Alles auswählen

dwordHexString = "0x2E"+cE
dwordHexString = dwordHexString + "FE55"
bringen mich dem Wert irgendwie näher :/
(0x2E nehme ich aus der Position des HexWertes 81)

Ích hoffe ihr könnt mir helfen! :D

Grüße,
Shortyoo

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Decryption

Beitrag von cloidnerux » Di Feb 17, 2015 10:42 pm

Guten Abend an alle! :D
Hi und Willkommen im Forum :D
Hab also erst mal ein Savegame über einen Hex-Editor geöffnet, jetzt will ich versuchen einige Werte zu decrypten (derzeit an der Spielzeit, für mich am einfachsten), mein Problem ist jetzt:
Der Hex-Editor zeigt mir an dass Position 2E den Hex-Wert 81 hat, unten rechts in einem kleinen Hilfe Fenster steht die Zahl "116865" (Spielzeit in s), Hex Wert 80 hat somit 116864, Hex-Wert 7F also 116863.
Ich glaube, du hast dich von deinem Hexeditor in die Irre führen lassen.
0x2E und 0x7F sind jeweils 1 Byte groß, können daher nur dezimale Werte zwischen 0 und 255 annehmen.
Der Wert den dein Hex-Editor dir ausgibt, ist wrsl der 4-Byte Block beginnend oder endend an dem selektierten Wert.

Hexadezimal ist nur ein anderes Zahlensystem, keine Verschlüsselung.

Wenn du "Savegames" bearbeiten willst, musst du verstehen, was das Programm/Spiel überhaupt Speichert.
Viele Moderene Programme speichern alles als XML(Text) und packen die Dateien in ein zip mit anderer Endung(ODF, docx).
Andere serialisieren einfach ihre Datenstrukturen in eine Binärdatei.

In den seltensten fällen ist etwas wie ein savegame verschlüsselt, denn warum sollte man den Nutzer vor sich selber schützen?

Gruß cloidnerux
Redundanz macht wiederholen unnötig.
quod erat expectandum

Shortyoo
Beiträge: 17
Registriert: Di Feb 17, 2015 9:55 pm

Re: Decryption

Beitrag von Shortyoo » Mi Feb 18, 2015 7:02 am

Danke erstmal für die Antwort! :)

Naja in dem Savegame steht so ziemlich alles:
Von Spielzeit über das Level der Charaktere etc ^^

Also wenn ich richtig verstehe suche ich einen "wrsl" Wert?
Aber der Hex-Editor zeigt mir ja die richtige Spielzeit, nur davor steht eben der Datentyp DWord. :s
Also muss ich den Hex Editor auf 6 Byte stellen? Hab ja die Chance das vor 7F noch 80 steht, oder eben dahinter.

Zu dem verschlüsseln:
Ich dachte es ist verschlüsselt, da (wenn ich die Datei mit npp öffne) sowas wie: qs'NULSOH oder sowas steht ^^

Edit: Das Spiel ist schon ein wenig älter, die Dateiendung entspricht daher "ff7".


Grüße,
Shortyoo

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Decryption

Beitrag von Xin » Mi Feb 18, 2015 9:37 am

Shortyoo hat geschrieben:Aber der Hex-Editor zeigt mir ja die richtige Spielzeit, nur davor steht eben der Datentyp DWord. :s
Also muss ich den Hex Editor auf 6 Byte stellen? Hab ja die Chance das vor 7F noch 80 steht, oder eben dahinter.
Hexadezimalzahlen sind normale Zahlen, deren Ziffen aber von 0 bis 15 gehen, während im dezimalen Zahlensystem die Ziffern von 0 bis 9 gehen. Das ist keine Verschlüsslung, sondern einfach eine andere Darstellung von Werten.

Hexadezimal ist dabei ein Kompromiss zwischen dem binären Verständnis, dass ein Computer hat (2 Ziffern) und der Lesbarkeit - der Mensch bevorzugt Zahlensysteme mit mehr Ziffern, weil binäre Zahlen halt schnell sehr breit werden.
Shortyoo hat geschrieben:Zu dem verschlüsseln:
Ich dachte es ist verschlüsselt, da (wenn ich die Datei mit npp öffne) sowas wie: qs'NULSOH oder sowas steht ^^
Das ist die binäre Darstellung mit 256 Ziffern, auch ASCII-Codes genannt. :-)

Hier geht es nicht um Verschlüsslung, Du musst herausfinden, wie diese Dateien aufgebaut sind und was welche Zahl an welcher Position überhaupt bedeutet. Weiterhin musst Du verstehen, mit welchen Zahlenbreiten Computer üblicherweise arbeiten: 8 Bit (Byte/Char), 16 Bit (Word/Short) oder 32 Bit (Longword/Long).
6 Byte, also 48 Bit sind absolut unüblich und 64 Bit sind bei älteren Spielen kaum zu erwarten.

Entweder hast du eine Dokumentation, was die einzelnen Zahlen in der Datei bedeuten oder Du musst die Datei "reengineeren". Das ist selbst für Profis eine sehr anstrengende Arbeit, zumal man tausende Tests fahren muss, um die Zahlen in der Datei im Programm wieder zu finden. Einzelne Zahlen wirst Du vermutlich finden: Du speicherst Dein Spiel mit 4000 Gold, dann mit 5000 Gold und dann mit 6000 Gold.
Mit etwas Glück findest Du so eine feste Position, wo die Menge an Gold gespeichert wird. Wenn Du Pech hast gibt es keine feste Position.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Shortyoo
Beiträge: 17
Registriert: Di Feb 17, 2015 9:55 pm

Re: Decryption

Beitrag von Shortyoo » Mi Feb 18, 2015 3:28 pm

Auch ein danke an dich, Xin! :)

Also eine Dokumentation habe ich nicht, ich glaube was ich dann machen will ist das reengineeren.
Ich habe mich jetzt halt (wie oben steht) erstmal auf die Spielzeit versteift.
Jetzt habe ich statt der Byte-Darstellung (7F) die 8-Bytes-Darstellung ausgewählt, nun ist der Hex-Wert nicht mehr 7F, sondern "02690319007FC801" (Wie du schon geschrieben hast, Xin, 64 Bit ist nicht zu erwarten) damit ändert sich der DWord-Wert auf "2130712835".
Ich habe mich noch nicht genau mit dem (Ich weiß nicht wie ich es nennen soll?) "Decrypten" beschäftigt.

Ich habe das Problem dass ich nicht weiß wie ich den Wert (7F, bin mir ziemlich sicher dass es der ist, er hatte sich als einzige geändert als ich die Spielzeit änderte) Dezimal bzw. als DWord (wie oben steht, 7F hat wohl den Dword Wert meiner Spielzeit) wiedergeben soll (so wie ich es oben im Code einfügte scheint es ja nicht richtig zu sein, sonst würde da meine Spielzeit, anstelle einer 127 raus kommen). ^^

Ich hoffe ihr versteht mein Problem! :P

Gruß,
Shortyoo

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Decryption

Beitrag von cloidnerux » Mi Feb 18, 2015 4:50 pm

Ich habe das Problem dass ich nicht weiß wie ich den Wert (7F, bin mir ziemlich sicher dass es der ist, er hatte sich als einzige geändert als ich die Spielzeit änderte) Dezimal bzw. als DWord (wie oben steht, 7F hat wohl den Dword Wert meiner Spielzeit) wiedergeben soll (so wie ich es oben im Code einfügte scheint es ja nicht richtig zu sein, sonst würde da meine Spielzeit, anstelle einer 127 raus kommen). ^^
Eine Datei ist eine reihe Bytes, die ohne Kontext nichts bedeuten.
Was du jetzt versuchst, ist die Position in der Datei die Anzahl der Bytes zu finden, die einen bestimmten Wert(Spielzeit) darstellen.
Wenn du die Position gefunden hast, an der Sich ein Wert geändert hat, dann bist du nun einigermaßen dicht am Ziel.

Was du jetzt noch herausfinden musst, ist welche Bytes der Spielzeit in welcher Art und weise zugeordnet werden müssen.
Dazu musst du dir überlegen, wie viele Bytes sinn machen(wrsl 4) und in welche Reinfolge.
Daher musst du nach z.B 0en suchen, die davor oder danach stehen.
Wenn du an den Wert der Spielzeit heran kommst, dann kannst du diesen auch schonmal in Hex umrechnen und direkt nach dem Wert suchen.

Das Ziel ist es also, die Byte Position in der Datei und die Byte länge zu finden.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Shortyoo
Beiträge: 17
Registriert: Di Feb 17, 2015 9:55 pm

Re: Decryption

Beitrag von Shortyoo » Mi Feb 18, 2015 5:30 pm

Du bist der beste, cloid! :D

Konnte jetzt mit dem Code:

Code: Alles auswählen

cout << "Wert: ";
	cin >> Letter;
	cout << "0x" << hex << Letter << '\n';
}
aus meiner 116863 ein 0x1c87f machen.
Jetzt kommt die schlechte Nachricht! :c

In dem Savegame habe ich (bei einer 4 Byte Darstellung): 007FC801
Also spricht den Wert: 0x07FC801 ( denke ich)
Vergleiche ich die jetzt aber:
7FC801
1C87F
So müssten einige Stellen des Hex-Wertes (1C87F)(wenn ich mich nach dem Savegame richte) woanders stehen, 7F(OK) also am Anfang, gefolgt von C8(ok) 01 (nicht ok), da fehlt mir irgendwie eine 0, laut Rechner(PC, Programmierer) haben die beiden einen komplett anderen Wert :/

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Decryption

Beitrag von mfro » Mi Feb 18, 2015 5:56 pm

Shortyoo hat geschrieben:"02690319007FC801"
Ich habe nicht unbedingt den Eindruck, daß Du wirklich weißt, was Du da machst, oder? ;)

116863 (Dezimal) = 1c87f (hex)

Jetzt guckst Du mal die letzten 8 Stellen (=4 Byte) deines Hex-Strings an. Fällt dir was auf?

Genau - alles da.

Bloß ein wenig "verwurschtelt". Das liegt an der Byte-Order - Intel Prozessoren legen 32-Bit Zahlen "rückwärts" im Speicher ab, damit landen die Bytes dann auch so auf der Platte, wenn abgespeichert wird.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Shortyoo
Beiträge: 17
Registriert: Di Feb 17, 2015 9:55 pm

Re: Decryption

Beitrag von Shortyoo » Mi Feb 18, 2015 6:20 pm

Hallo erst mal! :D

Also wie ich schon schrieb, habe mich noch nicht wirklich mit so was beschäftigt... :D

Zu der Hex-Theorie:
7FC801
1C87F
Es ist eben nicht alles da wie ich finde. :/
Ordne ich mal die 1C87F:
7FC81 (0 fehlt, lt. Taschenrechner hat er also einen komplett anderen Binärwert)

Intel Prozessor legen sie Rückwärts ab?
Ich hab AMD o:

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Decryption

Beitrag von cloidnerux » Mi Feb 18, 2015 6:31 pm

0 fehlt
Weil du natürlich auch immer 00001 statt 1 schreibst...
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten