Zurück

“Bat To Exe” Converter unsicher *hooking*

14.08.2013 15:50 von Samuel

Problem

Einige kennen es vielleicht: Man schreibt ein kleines Batch Script aber man merkt sofort dass dies sehr unsicher ist, da jeder die Datei mit dem Editor verändern kann.

Abhilfe schaffen, soll laut Google, dieses Programm: http://www.computerbild.de/download/Bat-To-Exe-Converter-2345613.html

Originale Seite: http://www.f2ko.de/programs.php?lang=de&pid=b2e

Computerbild beschreibt das Programm so:

Mit dem „ Bat To Exe Converter“ haben Sie die Möglichkeit, .bat-Dateien ins EXE-Format umzuwandeln. Wählen Sie im ersten Schritt die gewünschte Datei aus. Bei Bedarf lassen sich weitere Elemente wie Icons, Lizenztexte oder Versionsinformationen mit einbinden. Auf Wunsch verschlüsseln Sie das Programm mit einem Passwort oder lassen es unsichtbar erscheinen. Auch ein Decompiler lässt hinzufügen.

 

Das Programm verspricht, dass es ein Batch Script verschlüsseln kann. Sogar mit Passwort. Hört sich doch vielversprechend an. Nach kurzem Überlegen war mir eigentlich klar wie das Programm sowas machen kann. Meine Idee war:

  • Batch Script auslesen und in eine Variable (string) speichern
  • Diesen String verschlüsseln (RC4 o.ä.)
  • Den verschlüsselten String + den Key für die Entschlüsslung als Resource oder EOF anhängen
  • Beim Starten der *.exe wird der String entschlüsselt, als *.bat abgespeichert und ausgeführt

Analyse

Wir schauen uns das Programm mal genauer an. Wir verschlüsseln eine Batch Datei mit diesem Inhalt:

@echo off
echo Hello World!
pause

Ein einfaches “Hello World”.

Die Optionen lassen wir erstmal so. Also standard Optionen. Ohne Verschlüsselung.

Um zu sehen ob die Vermutung mit den Resourcen richtig war, können wir das Programm jetzt z.B. mit dem CFF Explorer anschauen. Unter “Resource Editor” können wir die Resourcen sehen.

Leider zeigt uns der CFF Explorer keine Daten an. Daher gehe ich schwer davon aus, dass ein Packer verwendet wurde beim erstellen der *.exe. Um dies herauszufinden, können wir einen sogenannten “Detector” verwenden.

“Exeinfo PE” ist ein hilfreiches Tool dafür. Das ist hier zu finden: http://www.exeinfo.antserve.com/. Alternativ ist auch PEiD zu empfehen.

Schutzmassnahmen

Und nun sehen wir mit welchem Packer das Programm gepackt wurde. Mit MPRESS.

Da MPRESS ein einfacher Packer und kein Protector ist, wird es relativ einfach ihn zu entpacken. Da ich hier jedoch nicht auf Manual Unpacking eingehen möchte, suchen wir einen Unpacker für MPRESS. Nach kurzer Suche fand ich den “PackerBreaker v1.0.3″ der unter anderem auch MPRESS entpacken kann. Link: http://www.sysreveal.com/packerbreaker-history/

Das Entpacken ist dann eine anfache Sache. Man lädt einfach die *.exe Datei in das Programm und es wird eine neue erstellt. Die entpackte Datei ist natürlich grösser da sie nicht mehr komprimiert ist.

Jetzt können wir die Datei erneut mit dem CFF Explorer öffnen und die Resourcen anschauen.

So, nun haben wir tatsächlich den richtigen Code vor uns. So einfach war das.

Aber Achtung: Das “Bat To Exe” Programm hat ja eine Verschlüsselung als Funktion dabei. Diese schauen wir uns mal genauer an. Wir generieren eine neue *.exe, diesmal mit einem Passwort Schutz.

Nach dem Generieren, entpacken wir diese *.exe Datei wie vorhin. Wenn wir die Datei nun wieder mit dem CFF Explorer anschauen, sehen wir diesmal folgendes.

Der String ist tatsächlich verschlüsselt. Jetzt gibt es zwei Möglichkeiten um an den Code des Batch Scripts zu gelangen:

  • Wir entschlüsseln den String (Key suchen)
  • Wir hooken eine bestimmte Funktion (API)

Hooking

Das Entschlüsseln wäre sicher möglich, wenn man weiss um welche Verschlüsselung es sich handelt. Dennoch wählen wir die zweite Variante. Wir hooken eine bestimmte Funktion die das Schreiben des Scripts übernimmt und fangen dann diese Informationen ab.

Mehr zum Thema Hooking auf Wikipedia: http://de.wikipedia.org/wiki/Hook_%28Informatik%29

Zuerst öffnen wir wieder die *.exe mit dem CFF Explorer und suchen nach den APIs. Sofort finden wir die Funktion “WriteFile” welche in der Kernel32.dll liegt.

“WriteFile” ist auf dem MSDN so beschrieben:

Writes data to the specified file or input/output (I/O) device.

Link: http://msdn.microsoft.com/en-us/library/aa365747%28v=vs.85%29.aspx

 

Unsere Aufgabe ist es nun, eine DLL zu programmieren welche dannach in den Prozess injected wird und die “WriteFile” API hookt. Dann fangen wir den Text ab und geben die erwartete Antwort zurück.

Um den Hook zu implementieren, eignet sich die “AfxCodeHook” Library gut. Diese ist hier zu finden: http://www.delphibasics.info/home/delphibasicssnippets/afxcodehookbyaphex

 

Unsere DLL muss nun die “WriteFile” Funktion deklarieren:

var
  WriteFile_Hook: function(hFile: THANDLE; lpBuffer: Pointer; nNumberOfBytesToWrite: DWORD; lpNumberOfBytesWritten: LPDWORD; lpOverlapped: POverlapped): BOOL; stdcall;

 

Mit dieser Funktion holen wir uns den Text.

function WriteFile_HookProc(hFile: THANDLE; lpBuffer: Pointer; nNumberOfBytesToWrite: DWORD; lpNumberOfBytesWritten: LPDWORD; lpOverlapped: POverlapped): BOOL; stdcall;
var
  ZBytes: Cardinal;
  str: string;
begin

  SetLength(str, nNumberOfBytesToWrite);
  CopyMemory(@str[1], lpBuffer, nNumberOfBytesToWrite);

  //MessageBox(0, PChar(str), '', 0);
  UnhookCode(@WriteFile_Hook);
  writeHookedBatch(str);
  Result := WriteFile(hFile, str[1], Length(str), ZBytes, Nil);
end;

Und nach dem Unhooken, schreiben wir dann den abgefangen Text, also der Batch Script Code, in eine Textdatei.

Wichtig: Zuerst Unhooken.

procedure writeHookedBatch(value: string);
var
  Txt: TextFile;
  Buffer: Array[1..4096] of byte;
begin
  AssignFile(Txt, 'decrypted.bat.txt');
  Rewrite(Txt);
  SetTextBuf(Txt, Buffer, SizeOf(Buffer));
  try
    WriteLn(Txt, '-= Batch2Exe "Decrypter" =-');
    WriteLn(Txt, '-=       samsec.ch       =-');
    WriteLn(Txt, value);
  finally CloseFile(Txt);
  end;
end;

Den Hook rufen wir so auf:

HookCode('kernel32', 'WriteFile', @WriteFile_HookProc, @WriteFile_Hook);

 

Um zu wissen in welcher DLL sich unsere Funktion befindet, können wir auch auf dem MSDN nachschauen.

Beispiel: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363851%28v=vs.85%29.aspx

Nach unten scrollen:

Wichtig auch: CopyFileW = Unicode und CopyFileA = ANSI. Muss man bei WriteFile hier nicht beachten.

 

Jetzt müssen wir nur noch die DLL in den Prozess injecten. Mit der “AfxCodeHook” Library ist dies auch möglich: http://www.delphibasics.info/home/delphibasicssnippets/afxcodehookexample-injectlibrary

Oder man nimmt einen Injector aus dem Internet: http://sourceforge.net/projects/autodllinjector/

Um zu überprüfen ob die DLL erfolgreich injected wurde, kann man z.B. ProcessHacker verwenden.

Das Resultat sieht dann so aus.

Fazit

Ich denke es ist recht schwer ein Batch Script wirklich so zu erstellen, dass es dannach nicht mehr einsehbar ist. Dieses Programm ist das meist verbreitete im Internet um Batch Scripts zu verschlüsseln und es bietet keinen ernsthaften Schutz.

Benutzt es nicht um sensible Daten zu verschlüsseln. Wobei das auch wenig Sinn ergibt mit Batch :-)

Zurück

Einen Kommentar schreiben

Kommentar von Write My Essays um 01.03.2018

good research paper <a href="http://researchpaper.store">write research paper</a> research paper http://researchpaper.store - research papers

Kommentar von Essay Write um 10.03.2018

high school research paper <a href="http://researchpaper.store">help me write my research paper</a> a research paper <a href=http://researchpaper.store>write research paper</a>

Kommentar von Term Paper Writer um 27.03.2018

college research paper <a href="http://researchpaper.store">college research paper</a> thesis statement maker for a research paper http://researchpaper.store - research paper