[+]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.