[+]Topic: Code
[+]Von: zer0p
[+]Return: Code
Bernsteinstrand verschleiert Batchskripte und unterwandert heuristische Scans.
* Nur kleine (lowercase) Buchstaben werden verschlüsselt.
* Konstanten müssen komplett gross (uppercase) geschrieben werden.
* Nach einer Idee von SPTH
program Bernsteinstrand;
(* Bernsteinstrand - Batch Obfuscator
Veröffentlichung: bi0tic.info Dezember 2010
Datum: Sommer 2007
Autor: zer0p
Sprache: Delphi
* Compiler: Delphi 7
Bernsteinstrand verschleiert Batchskripte und unterwandert heuristische Scans.
* Nur kleine (lowercase) Buchstaben werden verschlüsselt.
* Konstanten müssen komplett groß (uppercase) geschrieben werden.
* Nach einer Idee von SPTH
*)
{$APPTYPE CONSOLE}
// REAL VX WILL NEVER DIE!
uses
StrList,
windows;
var
batfile,Endung,charset,ks,addst,test1: string;
input,output: TStrlist;
i,ii,iii,j,jj,länge: integer;
arrayset :array of string;
alphaarray : array of char;
/// Zufallsgenerator für Zeichenketten der Länge n
function RandomString(const len: Integer): string;
var
i: Integer;
charset:string;
begin
charset :='abcdefghijklmnopqrstuvwxyz';
SetLength(Result,len);
for i := 1 to len do
begin
Result[i] := CharSet[1+Random(Length(CharSet))];
end;
end;
/// Hinzufügen von %-Zeichen
// In Batch werden Variablen von %-Zeichen umschlossen
function prozent(st: string): string;
begin
Result:= '%'+st+'%';
end;
/// Ermitteln der Dateigröße
function getfilesize(const s: String): LongWord;
var
hFile: LongWord;
begin
hFile := CreateFile(@s[1],
GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_DELETE or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
result := windows.GetFileSize(hFile, nil);
CloseHandle(hFile);
end;
/// Ermitteln der Datei Extension
function ExtractFileExt(const s: String): String;
begin
result := Copy(s, Pos('.', s), length(s) - Pos('.', s) + 1);
end;
/// Datei auf ihr Vorhandensein überprüfen
function FileExists(const FileName: string): Boolean;
type
LongRec = packed record
case Integer of
0: (Lo, Hi: Word);
1: (Words: array [0..1] of Word);
2: (Bytes: array [0..3] of Byte);
end;
var
Handle : THandle;
FindData : TWin32FindData;
LocalFileTime : TFileTime;
n : Integer;
begin
Result := True;
Handle := FindFirstFile(PChar(FileName), FindData);
if (Handle <> INVALID_HANDLE_VALUE) Then
begin
Windows.FindClose(Handle);
if ((FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0) then
begin
FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
if FileTimeToDosDateTime(LocalFileTime, LongRec(n).Hi, LongRec(n).Lo) then
Exit;
end;
end;
Result := False;
end;
/// Beginn des Programms
begin
windows.SetConsoleTitle('Bernsteinstrand');
windows.SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11);
writeln(' ');
writeln(' ');
writeln(' Land der dunklen Waelder ');
writeln(' und kristall''nen Seen, ');
writeln(' ueber weite Felder ');
writeln(' lichte Wunder geh''n. ');
writeln(' ');
writeln(' Starke Bauern schreiten ');
writeln(' hinter Pferd und Pflug. ');
writeln(' Ueber Ackerbreiten ');
writeln(' streicht der Vogelzug. ');
writeln(' ');
writeln(' ');
writeln(' Und die Meere rauschen ');
writeln(' den Choral der Zeit. ');
writeln(' Elche steh''n und lauschen ');
writeln(' in die Ewigkeit. ');
sleep(3500);
/////////////// clear screen////
writeln('');
writeln('');
writeln('');
writeln('Bernsteinstrand 0.1 ');
writeln('--Batch Obfuscator--');
repeat
writeln('Dateiname :');
readln(batfile);
if not Fileexists(batfile) then writeln('Datei ist invalid!') // Existiert die Datei?
else
begin
if ExtractFileExt(batfile) <> '.bat' then writeln('Ausser .bat wird kein Dateityp unterstuetzt! ') // Ist es ein Batchskript?
else
begin
if GetFileSize(batfile)> 10000 then writeln('Datei zu groß! 10.000 Bytes werden maximal unterstützt.'); // Ist die Datei zu groß ?
end;
end;
until Fileexists(batfile) and (ExtractFileExt(batfile) ='.bat') and (GetFileSize(batfile) <= 10000);
// Erzeugen zweier Stringlisten
input := Tstrlist.create;
output := TStrlist.Create;
writeln('Loading '+batfile);
input.LoadFromFile(batfile);
///Header einfügen
output.Add('rem ~~~encrypted with Bernsteinstrand');
output.Add('rem ~~~ '+ DatetoString(now)); // Datum einfügen
charset :='abcdefghijklmnopqrstuvwxyz'; // Alphabet laden
writeln('Loading Variables');
setlength(arrayset,26);
setlength(alphaarray,26);
randomize;
for i := 0 to 25 do arrayset[i] := Randomstring(6);
for ii := 0 to 25 do alphaarray[ii] := charset[ii+1];
for iii := 0 to 25 do
begin
output.add('set ' + arrayset[iii]+'=' + Randomstring(6)); /// Zuweisung, welche editiert wird( 6 Zeichen)
output.add('set ' + arrayset[iii]+'=' + alphaarray[iii]); /// Richtige Zuweisung
output.add('%'+Randomstring(7)+'%%'+randomstring(7)+'%%'+Randomstring(7)+'%'); //Zufällige Variablen mit 7 Zeichen, Kollision nicht möglich
output.add('goto ' + arrayset[iii]);
output.add('set ' + arrayset[iii]+'=' + Randomstring(6)); //wird übersprungen
output.add(':'+ arrayset[iii]);// Sprungmarke
end;
output.add(prozent(arrayset[2])+prozent(arrayset[11])+prozent(arrayset[18])); //cls wird eingefügt
/////////////////Ersetzen////////////
///
///
for j := 0 to input.Count - 1 do
begin
addst := Input.strings[j]; // Zeile für Zeile wird eingelesen
länge := length(addst); // Zeilenlänge ermitteln
for jj := 1 to länge do
begin
if addst[jj] =' ' then test1 := ' ' else // Leerzeichen?
begin
if addst[jj] in ['a'..'z'] then // Nur lowercase Buchstaben werden verschleiert
test1 := prozent(arrayset[byte(addst[jj]) - byte('a')]); // ''wird nicht erkannt
end;
ks := ks + test1;
end;
output.add(ks);
ks := '';
end;
output.SaveToFile('output.bat'); // Verschleierte Datei wird als output.bat erzeugt
writeln('Fertig!');
readln;
end.