该存储库包含一个库,该库允许本机Linux程序从Windows DLL加载和调用功能。
作为演示,我将Windows Defender移植到Linux。
$ ./mpclient eicar.com
main(): Scanning eicar.com...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Virus:DOS/EICAR_Test_File identified.
peloader目录包含一个自定义的PE/COFF加载程序,该定制量来自NDISWRAPPER。库将处理重新定位和导入,然后提供类似dlopen的API。该代码支持GDB(包括符号),基本块覆盖范围集合以及运行时钩和修补程序的调试。
目的是允许Linux上的自包含Windows库的可扩展和高效的模糊。好的候选人可能是视频编解码器,减压库,病毒扫描仪,图像解码器等。
如果您需要添加对任何外部进口的支持,则写存根通常很快,简单。
窗户上的分布式,可扩展的模糊可能具有挑战性且效率低下。对于端点安全产品尤其如此,端点安全产品使用跨越内核和用户空间的复杂互连组件。这通常需要旋转整个虚拟化的Windows环境,以模糊它们或收集覆盖范围数据。
这在Linux上不是一个问题,我发现将Windows Antivirus产品的移植组件转换为Linux是可能的。这使我可以在最小容器中运行要测试的代码,而开销很少,并且可以轻松扩展测试。
这只是个人意见,但我也认为Linux具有更好的工具。 ¯_(ツ)_/¯
MSMPeng是恶意软件保护服务,默认情况下在Windows 8、8.1、10,Windows Server 2016等上启用。此外,Microsoft Security Essentials,System Center Endpoint保护和其他各种Microsoft Security产品共享相同的核心引擎。
负责扫描和分析的MSMPENG的核心组成部分称为MPENGINE。 Mpengine是一个巨大而复杂的攻击表面,包括数十个深奥的档案格式,可执行的包装工,各种架构的完整系统模拟器和各种语言的口译器的完整系统模拟器。所有这些代码均可访问远程攻击者。
要构建测试客户端,只需键入make 。
$ make
请注意, .i686或:i386后缀很重要,我们需要32位库来使用32位DLL。
| fedora / redhat | Ubuntu / Debian | 评论 |
|---|---|---|
glibc-devel.i686 | libc6-dev:i386 / libc6-dev-i386 | 名称随版本而变化。 |
libgcc.i686 | gcc-multilib | |
readline-devel.i686 | libreadline-dev:i386 | 可选,用于mpscript。 |
cabextract | cabextract | 用于提取定义。 |
您将需要从此页面下载32位反对软件更新文件:
这应该是指向正确文件的直接链接:
这将下载一个名为mpam-fe.exe的文件,该文件是一个可以用cabextract提取的机柜文件。将文件提取到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.
如果您想知道自己有哪个版本,请尝试以下操作:
$ exiftool mpengine.dll | grep 'Product Version Number'
Product Version Number : 1.1.13701.0
主MPENGINE加载程序称为mpclient ,它接受文件名作为参数。
$ ./mpclient netsky.exe
main(): Scanning netsky.exe...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Worm:Win32/Netsky.P@mm identified.
还有其他一些示例工具, mpstreamfuzz和mpscript 。
如果您想调试崩溃,请逐步浏览例程或设置断点,请按照以下示例。首先,您需要IDA的地图文件。
微软并没有为每个构建发布公共符号,有时在发布后几个月落后了符号。确保您使用的是带有公共符号的mpengine版本。
使用以下示例命令行生成地图和IDB文件。
> idaw -A -P+ -S"createmap.idc mpengine.map" mpengine.dll
如果您在Windows上生成了地图文件,则将获得CRLF线终结器,请这样修复它们:
$ dos2unix mpengine.map
当您在GDB下运行MPCLIENT时,它将检测到调试器并打印您需要输入的命令来教GDB有关符号的信息:
$ 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)
如果输入它显示在GDB中的命令,则将有可用的符号。
请注意,
genmapsym.sh假定您使用的是GNU尴尬。
(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>
然后,您可以继续,它将像正常人一样运行。
(gdb) c
断点,观察点和回溯都正常工作,尽管使用硬件断点可能比软件断点更可靠。
要在GDB中使用硬件断点,您只需使用hb或hbreak而不是break即可。请注意,您只能获得有限数量的硬件断点。
(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
该项目不能取代葡萄酒或葡萄酒。
Winelib用于将Windows C ++项目向Linux移植,葡萄酒旨在运行完整的Windows应用程序。该项目旨在允许本机Linux代码加载简单的Windows DLL。
最接近的类比是NDISWRAPPER,但对于用户空间。
GPL2