Dieses Repository enthält eine Bibliothek, in der native Linux -Programme von einer Windows -DLL geladen und aufrufen können.
Als Demonstration habe ich Windows Defender auf Linux portiert.
$ ./mpclient eicar.com
main(): Scanning eicar.com...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Virus:DOS/EICAR_Test_File identified.
Das peloader -Verzeichnis enthält einen benutzerdefinierten PE/Coff -Lader, der von NDIsWrapper abgeleitet ist. Die Bibliothek verarbeitet die Umzug und Importe und liefert dann eine dlopen -ähnliche API. Der Code unterstützt Debugging mit GDB (einschließlich Symbolen), grundlegender Blockabdeckungssammlung sowie Laufzeit -Hooking und Patching.
Es ist beabsichtigt, skalierbares und effizientes Fuzzing von in sich geschlossenen Windows-Bibliotheken unter Linux zu ermöglichen. Gute Kandidaten könnten Video -Codecs, Dekompressionsbibliotheken, Virenscanner, Bilddecoder usw. sein.
Wenn Sie Unterstützung für externe Importe hinzufügen müssen, ist das Schreiben von Stubs normalerweise schnell und einfach.
Verteilte, skalierbare Fuzzing unter Windows können herausfordernd und ineffizient sein. Dies gilt insbesondere für Endpoint -Sicherheitsprodukte, die komplexe miteinander verbundene Komponenten verwenden, die sich über Kernel und Benutzerraum erstrecken. Dies erfordert häufig eine gesamte virtualisierte Windows -Umgebung, um sie zu verflechten oder Abdeckungsdaten zu sammeln.
Dies ist weniger ein Problem unter Linux, und ich habe festgestellt, dass die Portierung von Komponenten von Windows -Antivirenprodukten auf Linux häufig möglich ist. Auf diese Weise kann ich den Code ausführen, den ich in minimalen Containern mit sehr wenig Overhead teste, und die Tests problemlos zu skalieren.
Dies ist nur eine persönliche Meinung, aber ich denke auch, dass Linux bessere Tools hat. ¯_(ツ)_/¯
MSMPeng ist der Malware -Schutzdienst, der standardmäßig unter Windows 8, 8.1, 10, Windows Server 2016 usw. aktiviert ist. Darüber hinaus teilen Microsoft Security Essentials, System Center Endpoint Protection und verschiedene andere Microsoft -Sicherheitsprodukte die gleiche Kernmotor.
Die Kernkomponente von MSMPeng, die für das Scannen und Analysen verantwortlich ist, wird als MpenEngine bezeichnet. MpenEngine ist eine riesige und komplexe Angriffsfläche, die aus Handlern für Dutzende esoterischer Archivformate, ausführbarer Packer, vollem Systememulatoren für verschiedene Architekturen und Dolmetscher für verschiedene Sprachen besteht. All dieser Code ist für Remote -Angreifer zugänglich.
Um den Testkunden zu erstellen, geben Sie einfach make .
$ make
Beachten Sie, dass die Suffixe .i686 oder :i386 wichtig sind. Wir benötigen die 32 -Bit -Bibliotheken, um die 32 -Bit -DLL zu verwenden.
| Fedora / Redhat | Ubuntu / Debian | Kommentar |
|---|---|---|
glibc-devel.i686 | libc6-dev:i386 / libc6-dev-i386 | Der Name variiert mit der Version. |
libgcc.i686 | gcc-multilib | |
readline-devel.i686 | libreadline-dev:i386 | Optional, in MpScript verwendet. |
cabextract | cabextract | Wird verwendet, um Definitionen zu extrahieren. |
Sie müssen die 32-Bit-Antimalware-Aktualisierungsdatei von dieser Seite herunterladen:
Dies sollte ein direkter Link zur richtigen Datei sein:
Dadurch wird eine Datei namens mpam-fe.exe heruntergeladen, eine Schrankdatei, die mit cabextract extrahiert werden kann. Extrahieren Sie die Dateien in das engine -Verzeichnis:
$ cabextract mpam-fe.exe
Extracting cabinet: mpam-fe.exe
extracting MPSigStub.exe
extracting mpavdlta.vdm
extracting mpasdlta.vdm
extracting mpavbase.vdm
extracting mpasbase.vdm
extracting mpengine.dll
All done, no errors.
Wenn Sie wissen möchten, welche Version Sie haben, versuchen Sie Folgendes:
$ exiftool mpengine.dll | grep 'Product Version Number'
Product Version Number : 1.1.13701.0
Der Hauptlader des mpengine wird als mpclient bezeichnet und akzeptiert Dateinamen als Parameter.
$ ./mpclient netsky.exe
main(): Scanning netsky.exe...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Worm:Win32/Netsky.P@mm identified.
Es gibt einige andere Beispielwerkzeuge, mpstreamfuzz und mpscript .
Wenn Sie einen Absturz debuggen möchten, einen Schritt durch eine Routine oder eine Breakpoints festlegen möchten, folgen Sie diesen Beispielen. Zunächst benötigen Sie eine Kartendatei von IDA.
Microsoft veröffentlicht keine öffentlichen Symbole für jeden Build, und manchmal bleiben die Symbole nach der Veröffentlichung einige Monate zurück. Stellen Sie sicher, dass Sie eine MPengine -Version mit öffentlichen Symbolen verwenden.
Verwenden Sie die folgende Beispiel -Befehlszeile, um MAP- und IDB -Dateien zu generieren.
> idaw -A -P+ -S"createmap.idc mpengine.map" mpengine.dll
Wenn Sie die Kartendateien unter Windows generieren, erhalten Sie CRLF -Zeilenterminatoren und beheben Sie sie wie folgt:
$ dos2unix mpengine.map
Wenn Sie MPClient unter GDB ausführen, werden ein Debugger erkannt und die Befehle drucken, die Sie eingeben müssen, um GDB über die Symbole zu unterrichten:
$ gdb -q ./mpclient
(gdb) r testfile.txt
Starting program: mpclient
main(): GDB: add-symbol-file engine/mpengine.dll 0xf6af4008+0x1000
main(): GDB: shell bash genmapsym.sh 0xf6af4008+0x1000 symbols_19009.o < mpengine.map
main(): GDB: add-symbol-file symbols_19009.o 0
Program received signal SIGTRAP, Trace/breakpoint trap.
0x0804d213 in main (argc=1, argv=0xffffcc64, envp=0xffffcc6c) at mpclient.c:156
156 __debugbreak();
(gdb)
Wenn Sie die angezeigten Befehle in GDB eingeben, stehen Symbole zur Verfügung.
Beachten Sie, dass
genmapsym.shdavon ausgeht, dass Sie Gnu awk verwenden.
(gdb) add-symbol-file engine/mpengine.dll 0xf6af4008+0x1000
add symbol table from file "engine/mpengine.dll" at
.text_addr = 0xf6af5008
Reading symbols from engine/mpengine.dll...done.
(gdb) shell bash genmapsym.sh 0xf6af4008+0x1000 symbols_19009.o < mpengine.map
(gdb) add-symbol-file symbols_19009.o 0
add symbol table from file "symbols_19009.o" at
.text_addr = 0x0
Reading symbols from symbols_19009.o...done.
(gdb) p as3_parsemetadata_swf_vars_t
$1 = {void (void)} 0xf6feb842 <as3_parsemetadata_swf_vars_t>
Dann können Sie weitermachen und es wird wie gewohnt laufen.
(gdb) c
Breakpoints, Watchpoints und Backtraces funktionieren alle als normal, obwohl es möglicherweise zuverlässiger ist, Hardware -Haltepunkte als Software -Haltepunkte zu verwenden.
Um Hardware -Haltepunkte in GDB zu verwenden, verwenden Sie nur hb oder hbreak anstelle von break . Beachten Sie, dass Sie nur eine begrenzte Anzahl von Hardware -Haltepunkten erhalten.
(gdb) b as3_parsemethodinfo_swf_vars_t
Breakpoint 1 at 0xf6feb8da
(gdb) c
Continuing.
main(): Scanning test/input.swf...
EngineScanCallback(): Scanning input
Breakpoint 1, 0xf6feb8da in as3_parsemethodinfo_swf_vars_t ()
(gdb) bt
#0 0xf6feb8da in as3_parsemethodinfo_swf_vars_t ()
#1 0xf6dbad7f in SwfScanFunc ()
#2 0xf6d73ec3 in UfsScannerWrapper__ScanFile_scanresult_t ()
#3 0xf6d6c9e3 in UfsClientRequest__fscan_SCAN_REPLY ()
#4 0xf6d6a818 in UfsNode__ScanLoopHelper_wchar_t ()
#5 0xf6d6a626 in UfsNode__Analyze_UfsAnalyzeSetup ()
#6 0xf6d71f7f in UfsClientRequest__AnalyzeLeaf_wchar_t ()
#7 0xf6d71bb9 in UfsClientRequest__AnalyzePath_wchar_t ()
#8 0xf6dbbd88 in std___String_alloc_std___String_base_types_char_std__allocator_char______Myptr_void_ ()
#9 0xf6d75e72 in UfsCmdBase__ExecuteCmd__lambda_c80a88e180c1f4524a759d69aa15f87e____lambda_c80a88e180c1f4524a759d69aa15f87e__ ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb) x/3i $pc
=> 0xf6feb8da <as3_parsemethodinfo_swf_vars_t+7>: lea ebx,[edx+0x1c]
0xf6feb8dd <as3_parsemethodinfo_swf_vars_t+10>: push esi
0xf6feb8de <as3_parsemethodinfo_swf_vars_t+11>: mov edx,ebx
Dieses Projekt ersetzt weder Wein noch Winelib.
Winelib wird verwendet, um Windows C ++ - Projekte auf Linux zu portieren, und der Wein soll vollständige Windows -Anwendungen ausführen. Dieses Projekt soll den nativen Linux -Code einfache Windows -DLLs laden.
Die nächstgelegene Analogie wäre ndiswrapper, aber für UserSpace.
GPL2