program NitradoDec; {$APPTYPE CONSOLE} uses SysUtils, Classes, zlib, Math, AnsiStrings; var ms1, ms2: TMemoryStream; z: TZDecompressionStream; i, j: Integer; b, count: Byte; size: Integer; temp: Cardinal; const Vigenère: AnsiString = '2lly4t4SI8cHoU4h.rk90bk/CvYUq8c4Ols1STx'; Base64: AnsiString = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; begin try writeln('Nitrado-Snapshot-Dekoder // yat.qa // 10. Dezember 2016'); ms1 := TMemoryStream.Create; ms2 := TMemoryStream.Create; ms1.LoadFromFile(paramstr(1)); z := TZDecompressionStream.Create(ms1); ms2.CopyFrom(z, z.Size); // Nicht-Base64-Zeichen löschen ms2.Position := 0; ms1.Clear; for i := 0 to ms2.Size - 1 do begin ms2.ReadBuffer(b, 1); case b of $2b, $2f, $30..$39, $41..$5a, $61..$7a: ms1.WriteBuffer(b, 1); end; end; // Base64-Decoder (binary-safe) ms1.Position := 0; ms2.Clear; size := ms1.Size; for i := 0 to (size + 3) div 4 - 1 do begin count := Min(size - i * 4, 4); // Größe des Base64-Blocks (max. 24 Bits, also 4 Zeichen) temp := 0; for j := 1 to count do begin ms1.ReadBuffer(b, 1); temp := temp shl 6 + Byte(AnsiStrings.PosEx(AnsiChar(b), Base64)) - 1; end; temp := temp shl (24 - count * 6); temp := temp and $ff00 + temp shl 16 + temp shr 16; // Endianness drehen (vereinfacht weil nur 3 Byte verwendet) ms2.WriteBuffer(temp, count - 1); end; // Entschlüsseln ms2.Position := 0; ms1.Clear; for i := 0 to ms2.Size - 1 do begin ms2.ReadBuffer(b, 1); b := b - Byte(Vigenère[i mod 39 + 1]); ms1.WriteBuffer(b, 1); end; ms1.SaveToFile(paramstr(1) + '.decoded'); writeln('Erfolgreich dekodiert!'); except on E:Exception do Writeln(E.Classname, ': ', E.Message); end; readln; end.