Este repositorio contiene una biblioteca que permite que los programas nativos de Linux carguen y llamen a las funciones de un DLL de Windows.
Como demostración, he portado el defensor de Windows a Linux.
$ ./mpclient eicar.com
main(): Scanning eicar.com...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Virus:DOS/EICAR_Test_File identified.
El directorio peloader contiene un cargador PE/Coff personalizado derivado del NDISWRAPPER. La biblioteca procesará las reubicaciones e importaciones, luego proporcionará una API similar dlopen . El código admite la depuración con GDB (incluidos los símbolos), la colección básica de cobertura de bloques y el enganche y el parche de tiempo de ejecución.
La intención es permitir la difusión escalable y eficiente de las bibliotecas de Windows autónomo en Linux. Los buenos candidatos pueden ser códecs de video, bibliotecas de descompresión, escáneres de virus, decodificadores de imágenes, etc.
Si necesita agregar soporte para cualquier importación externa, escribir trozos suele ser rápido y fácil.
La fuzzing distribuida y escalable en las ventanas puede ser desafiante e ineficiente. Esto es especialmente cierto para los productos de seguridad de punto final, que utilizan componentes interconectados complejos que abarcan el núcleo y el espacio de los usuarios. Esto a menudo requiere girar un entorno de Windows virtualizado completo para borrarlos o recopilar datos de cobertura.
Esto es un problema menos en Linux, y he descubierto que a menudo es posible portar componentes de los productos antivirus de Windows a Linux. Esto me permite ejecutar el código que estoy probando en contenedores mínimos con muy poca sobrecarga y ampliar fácilmente las pruebas.
Esta es solo una opinión personal, pero también creo que Linux tiene mejores herramientas. ¯_(ツ)_/¯
MSMPENG es el servicio de protección de malware que está habilitado de forma predeterminada en Windows 8, 8.1, 10, Windows Server 2016, etc. Además, Microsoft Security Essentials, System Center Endpoint Protection y otros productos de seguridad de Microsoft comparten el mismo motor central.
El componente central de MSMPENG responsable del escaneo y el análisis se llama MPEngine. MPEngine es una vasta y compleja superficie de ataque, que comprende los manejadores para docenas de formatos de archivo esotéricos, empacadores ejecutables, emuladores de sistemas completos para diversas arquitecturas e intérpretes para diversos idiomas. Todo este código es accesible para atacantes remotos.
Para construir el cliente de prueba, simplemente escriba make .
$ make
Tenga en cuenta que los sufijos .i686 o :i386 son importantes, necesitamos las bibliotecas de 32 bits para usar la DLL de 32 bits.
| Fedora / Redhat | Ubuntu / Debian | Comentario |
|---|---|---|
glibc-devel.i686 | libc6-dev:i386 / libc6-dev-i386 | El nombre varía con la versión. |
libgcc.i686 | gcc-multilib | |
readline-devel.i686 | libreadline-dev:i386 | Opcional, utilizado en MPScript. |
cabextract | cabextract | Utilizado para extraer definiciones. |
Deberá descargar el archivo de actualización de antimalware de 32 bits de esta página:
Este debería ser un enlace directo al archivo correcto:
Esto descargará un archivo llamado mpam-fe.exe , que es un archivo de gabinete que se puede extraer con cabextract . Extraiga los archivos en el directorio engine :
$ 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.
Si quieres saber qué versión tienes, prueba esto:
$ exiftool mpengine.dll | grep 'Product Version Number'
Product Version Number : 1.1.13701.0
El cargador MPEngine principal se llama mpclient , acepta los nombres de archivo para escanear como parámetro.
$ ./mpclient netsky.exe
main(): Scanning netsky.exe...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Worm:Win32/Netsky.P@mm identified.
Hay algunas otras herramientas de muestra, mpstreamfuzz y mpscript .
Si desea depurar un bloqueo, un solo paso a través de una rutina o establecer puntos de interrupción, siga estos ejemplos. Primero, necesita un archivo de mapa de IDA.
Microsoft no libera símbolos públicos para cada construcción, y a veces los símbolos se quedan atrás durante unos meses después del lanzamiento. Asegúrese de que esté utilizando una versión mpEngine con símbolos públicos disponibles.
Use la siguiente línea de comandos de muestra para generar archivos MAP y IDB.
> idaw -A -P+ -S"createmap.idc mpengine.map" mpengine.dll
Si genera los archivos de mapa en Windows, obtendrá terminadores de línea CRLF, solucionándolos así:
$ dos2unix mpengine.map
Cuando ejecute MPClient en GDB, detectará un depurador e imprima los comandos que necesita ingresar para enseñar GDB sobre los símbolos:
$ 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)
Si ingresa los comandos que muestra en GDB, tendrá símbolos disponibles.
Tenga en cuenta que
genmapsym.shasume que está usando GNU AWK.
(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>
Entonces puedes continuar, y funcionará como normal.
(gdb) c
Los puntos de interrupción, los puntos de vigilancia y los trenes posteriores funcionan como normales, aunque puede ser más confiable usar puntos de interrupción de hardware que los puntos de interrupción del software.
Para usar puntos de interrupción de hardware en GDB, solo usa hb o hbreak en lugar de break . Tenga en cuenta que solo obtiene un número limitado de puntos de interrupción de hardware.
(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
Este proyecto no reemplaza el vino o Winelib.
Winelib se utiliza para portuar los proyectos de Windows C ++ a Linux, y el vino está destinado a ejecutar aplicaciones completas de Windows. Este proyecto está destinado a permitir que el código Linux nativo cargue DLLS simples de Windows.
La analogía más cercana sería NdisWrapper pero para el espacio de usuarios.
GPL2