Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Do 15.01.09 13:30 
Hallo,
ich hab ein Programm, dass einen Buffer entschlüsselt. Und ich hätte gern gewusst, welcher Algorhitmus verwendet wurde.
Ich kann beliebige Eingaben machen, und mir das "entschlüsselte" Ergebnis angucken.
Bisher habe ich folgendes:
Beim Entschlüsseln wird folgendes gemacht:
Die CRC32 Tabelle wird geladen (Daten davon z.b. hier)
Dann wird das Startpunkt der Tabelle um die Länge des Buffers verschoben.
Danach geht er vom letzten zum zweiten Byte durch und entschlüsselt es folgendermaßen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
While...
begin
tmp:=akt. Byte;
tmp2:=Byte vor akt. Byte (PByte(@akt.Byte-1)^)
tmp2:=PByte(PCRCTable+tmp2)^;
tmp:=tmp XOR tmp2;
tmp:=tmp XOR Byte(Länge);
tmp:=tmp XOR i;
akt.Byte:=tmp;
Inc(i);
end;

wobei i am Anfang 1 ist

danach werden die ersten 8 Byte mit 2 4-Byte werten überschrieben (weiß ne wo die her kommen)

die ersten 4 Byte werden weiter entschlüsselt durch:
aktByte:=aktByte XOR (PorigCRCTable+aktByte)^

für die zweiten 4 Byte wird ein Key verwendet:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
aktKey:=Key;
while...
begin
aktByte:=Byte(aktByte+(aktKey SAR 8));
aktKey:=aktKey*constA+constB;
end;


die restlichen Bytes im packet werden dann ebenfalls nochmal entschlüsselt. Auch hier fehlt mir wieder das Wissen wie.

Kommt das jemand bekannt vor? Kennt jemand den Algorhitmus?
Wäre sehr schön, wenn ich schnell eine Antwort bekäme.

Bsp
Zitat:
0000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000

wird entschlüsselt zu
Zitat:
78BB0346076F3753CAAE94C48BFF4919F145BD59C6B22D3470E720A9E2CB3BC253B9A92305DBE14A24
5B0CD4B8E33DFA78616A6A1F6F7F065897E7DC6CCFD4D3055E79EF01CED35E0D3E34CDF7FEA95B2C44
8CBDD2ED21D6AEA96700C69BCC9F4B82770BD9BE7C70090D47F20D565D78122BA337CE6C5B188123C0
88DEBB4FA53BCABEA0AD06C68B4DA142D9


Moderiert von user profile iconNarses: Umbrüche in die Code-Zitate eingefügt
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Fr 16.01.09 12:35 
Update der Infos:

nachdem die entschlüsslung durch die CRC32-Tabelle vorgenommen wurde (1. Code im 1.Post) werden die ersten 4 Byte mittels "aktByte:=aktByte XOR (PorigCRCTable+aktByte)^ "
entschlüsselt

der rest wird dann mittels eines algos entschlüsselt, der zum teil aus einer generierten tabelle besteht (SEHR ähnlich den Blowfish s-Boxen und p-boxen), einer 8-Byte Blockverschlüsselung, und zum andren teil aus dem schon geposteten Code (mit SAR-Anweisung)
dabei werden auch zum Teil schon verschlüsselte Stellen nochmal mit dem andren Alog-Teil verschlüsselt

Die Tabelle wird anscheinend mit Hilfe eines Algos erstellt, der wiederum auf der CRC32-Tabelle beruht und ebenfalls den Cipher (1.Teil-Algo) und die "SAR-Teil"-Verschlüsselung auf die Tabelle anwendet.

Dabei bleibt der InitialKey ("Key") aus "aktKey:=Key; " immer gleich.


Welche Verschlüsselung benutzt denn CRC32 als Basis?
Ich dachte bisher, das ist nur ein Prüfteil.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Fr 16.01.09 17:33 
Die CRC-Tabelle ist in der Verwendung hier eigentlich nur ein (beliebiger) Seed. Dürfte vermutlich auch mit anderen Daten ähnlicher Größe (4*256=1024byte) klappen.

user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
Die Tabelle wird anscheinend mit Hilfe eines Algos erstellt, der wiederum auf der CRC32-Tabelle beruht und ebenfalls den Cipher (1.Teil-Algo) und die "SAR-Teil"-Verschlüsselung auf die Tabelle anwendet.

... was meine erste Annahme bestätigt... hier wird also ein zweiter Schlüssel erstellt, indem der erste mit dem "echten" Schlüssel verrührt wird. Denke mal, aus dieser Eigenschaft findet man sowas am ehesten...

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Sa 17.01.09 17:20 
ich hab mich anscheinend geirrt, was das erstellen der tabelle angeht.
die tabelle ist verschlüsselt in einer datei gespeichert und wird am anfang geladen entschlüsselt und dann nicht mehr verändert

Die encipher funktion und die Tabelle scheinen tatsächlich Blowfish zu sein, nur angepasst auf einen Buffer als Tabelle bestehend aus 4094 Byte: SBox; 72 Byte PBox
(Anhand der Größe kam ich auf Blowfish)

jetzt spielen aber noch weitere Funktionen eine Rolle:
(In der 2. war ein Fehler!!!)

1 (4 Byte Block): aktByte:=aktByte XOR (PorigCRCTable+aktByte)^
2 (4 Byte Block):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
aktKey:=Key;
while 1.-4.Byte
begin
oldByte:=aktByte;
aktByte:=Byte(aktByte+(aktKey SAR 8));
aktKey:=(aktKey+oldByte)*constA+constB;
end;

3 (8 Byte Block): Der Blowfish-Teil

Diese Funktionen werden anscheinend in einer mir nicht bekannten Reihenfolge (da sehr obfuscateter Code) über den zu entschlüsselnden Buffer gejagt.
Dabei werden auch DWORDS 2 mal (von verschiedenen Funktionen) entschlüsselt

Es gibt also mehrere Keys: den Blowfish Key, der aber in der Tabelle schon drin ist
die CRC-Tabelle anscheinend als Seed (lt Martok)
und die 3 DWords der 2. Funktion (InitKey, Summand, Faktor)

Hilft das weiter?