program NitradoEnc; {$APPTYPE CONSOLE} uses SysUtils, Classes, zlib, Math, AnsiStrings, StrUtils; var ms1, ms2: TMemoryStream; z: TZCompressionStream; 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-Enkoder v1.1 // yat.qa // 10. Dezember 2016'); ms1 := TMemoryStream.Create; ms2 := TMemoryStream.Create; ms1.LoadFromFile(paramstr(1)); // Absätze am Ende erkennen Size := ms1.Size; repeat dec(Size); ms1.Position := Size; ms1.ReadBuffer(b, 1); until (b <> $0a) and (b <> $0d); inc(size); writeln(ms1.Size - Size, ' Bytes am Ende entfernt'); ms1.Position := 0; // BOM erkennen ms1.ReadBuffer(b, 1); if b = $ef then ms1.ReadBuffer(temp, 2) else ms1.Position := 0; // Vigenère-Encoder for i := 0 to Size - ms1.Position - 1 do begin ms1.ReadBuffer(b, 1); b := b + Byte(Vigenère[i mod 39 + 1]); ms2.WriteBuffer(b, 1); end; ms1.Clear; ms2.Position := 0; //ms2.SaveToFile(paramstr(1) + '.enc'); // Base64-Encoder (binary-safe) Size := ms2.Size; Count := 3; // Compiler-Blabla for i := 0 to (Size + 2) div 3 - 1 do begin count := Min(Size - i * 3, 3); ms2.ReadBuffer(temp, Count); temp := temp and $ff00 + temp shl 16 + (temp shr 16) and $ff; // Endianness drehen (vereinfacht weil nur 3 Byte verwendet) for j := 0 to Count do begin b := Byte(Base64[(temp shr 18) and $3f + 1]); temp := temp shl 6; ms1.WriteBuffer(b, 1); end; if (i + 1) mod 15 = 0 then begin b := $0A; ms1.WriteBuffer(b, 1); end; end; b := $3D; for j := Count to 2 do ms1.WriteBuffer(b, 1); b := $0A; ms1.WriteBuffer(b, 1); // zlib-Komprimierung ms2.Clear; ms1.Position := 0; z := TCompressionStream.Create(ms2); z.CopyFrom(ms1, ms1.Size); z.Free; // geht sonst manchmal nicht ms2.SaveToFile(paramstr(1) + '.zlib'); writeln('Erfolgreich kodiert!'); except on E:Exception do Writeln(E.Classname, ': ', E.Message); end; readln; end.