内容简介:LoadLibrary:一款能够允许Linux程序从DLL文件中加载或调用函数的工具
介绍
今天给大家推荐的这个代码库将允许原生Linux程序从一个WindowsDLL文件中加载或调用功能函数。下面是一个简单的演示示例,我将Windows Defender“移植”到了Linux平台。
$ ./mpclient eicar.com main(): Scanning eicar.com... EngineScanCallback(): Scanning input EngineScanCallback(): Threat Virus:DOS/EICAR_Test_Fileidentified.
工作机制
项目源码的peloader目录中包含一个来自ndiswrapper的自定义PE/COFF加载器,这个库可以完成重定位和导入操作,并提供了一个API(dlopen)。注:代码支持使用gdb进行调试。
这个 工具 的目的是提升Linux系统平台的可扩展性以及对Windows代码库的fuzzing效率,可供测试的待选项可以是视频编码解码器、解压缩库、病毒扫描工具或图片解码器等等。
-C++异常扫描和处理;
-从IDA加载额外的符号链接;
-使用GDB进行调试、设置断点和栈追踪;
-设置运行时函数钩子;
-扫描内存崩溃问题;
如果你需要从外部添加功能,你可以自行编写stubs,实现起来也非常的简单方便。
工具的目的
想要在Windows平台上进行分布式可扩展的Fuzzing测试实际上是非常困难的,而且效率也非常低,对于那些终端安全产品更是如此,因为它们使用了非常复杂的组件,而这些组件会跨内核跨用户空间进行通信互联。如果我们想要对这类产品进行Fuzzing测试或收集数据,将会需要调用到整个虚拟化的Windows环境。
但在Linux平台上,这一切都不成问题。我通过测试之后发现,我们可以将Windows的反病毒产品组件移植到Linux平台上。这样一来,我就能够以很小的开销来对代码进行测试了,而且我们还可以轻松地扩展测试。
当然了,这只是我的个人观点,但我也认为Linux平台上同样有很多功能强大的工具。
Windows Defender
MsMpEng是一款恶意软件保护服务,Windows8、8、10、以及Windows Server 2016等系统默认都会开启这项功能。除此之外,Microsoft Security Essentials、System Centre Endpoint Protection 以及其他的微软安全产品都使用的是相同的核心引擎。
负责扫描和分析的MsMpEng核心组件名叫mpengine,但mpengine本身也是一个庞大而复杂的攻击面,这个组件由大量处理器、可执行文件、多种架构的系统模拟器、以及多语言解释器所组成的,但这些代码通通都可以被远程攻击者访问到。
构建
我们可以输入make命令来构建测试客户端:
$ make
依赖
请注意,后缀.i686和:i386是非常重要的,我们需要32位代码库来使用32位dll。
你可以从下面这个页面下载32位的反恶意软件更新文件:
https://www.microsoft.com/security/portal/definitions/adl.aspx#manual
下面这个链接指向的应该是我们所需要的文件:
http://go.microsoft.com/fwlink/?LinkID=121721&arch=x86
点击了这个链接之后,我们将会下载一个名叫mpam-fe.exe的文件。接下来,我们可以通过命令cabextract将文件提取至engine目录:
$ cabextract mpam-fe.exe Extracting cabinet: mpam-fe.exe extractingMPSigStub.exe extractingmpavdlta.vdm extractingmpasdlta.vdm extractingmpavbase.vdm extractingmpasbase.vdm extractingmpengine.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@mmidentified.
除此之外,类似的工具还有mpstreamfuzz和mpscript。
调试
如果你想要对崩溃进行调试或设置断点的话,你可以按照下面给出的步骤进行操作。首先,你需要生成一个map文件。
你可以通过下列命令生成map以及idb文件:
> idaw -A -P+ -S"createmap.idc mpengine.map"mpengine.dll
如果你的map文件是在Windows平台上生成的,那么你将会得到一个CRLF行终止符,你可以通过下列命令修复这个问题:
$ dos2unix mpengine.map
当你在gdb命令下运行mpclient,它将会自动检测调试器并打印出你所需要输入的命令:
$ gdb -q ./mpclient (gdb) r testfile.txt Starting program: mpclient main(): GDB: add-symbol-file engine/mpengine.dll0xf6af4008+0x1000 main(): GDB: shell bash genmapsym.sh 0xf6af4008+0x1000symbols_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所显示的命令,你将会获取到下列符号文件:
(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+0x1000symbols_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 inas3_parsemethodinfo_swf_vars_t () #1 0xf6dbad7f inSwfScanFunc () #2 0xf6d73ec3 inUfsScannerWrapper__ScanFile_scanresult_t () #3 0xf6d6c9e3 inUfsClientRequest__fscan_SCAN_REPLY () #4 0xf6d6a818 inUfsNode__ScanLoopHelper_wchar_t () #5 0xf6d6a626 inUfsNode__Analyze_UfsAnalyzeSetup () #6 0xf6d71f7f inUfsClientRequest__AnalyzeLeaf_wchar_t () #7 0xf6d71bb9 inUfsClientRequest__AnalyzePath_wchar_t () #8 0xf6dbbd88 instd___String_alloc_std___String_base_types_char_std__allocator_char______Myptr_void_() #9 0xf6d75e72 inUfsCmdBase__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
Wine和Winelib
需要注意的是,这个项目并不能完全替代Wine或Winelib。Winelib可以将WindowsC++项目移植到Linux平台中,Wine可以允许用户在Linux平台上运行Windows应用程序。但这个项目可以允许原生的Linux代码加载简单的WindowsDLL。
许可证
GPL2
* 参考来源: github , FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Python 函数调用&定义函数&函数参数
- Linux内核如何替换内核函数并调用原始函数
- gdb 如何调用函数?
- 汇编层面分析函数调用
- 理解 Golang 的函数调用
- Wasm 介绍(六):间接函数调用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learn Python 3 the Hard Way
Zed A. Shaw / Addison / 2017-7-7 / USD 30.74
You Will Learn Python 3! Zed Shaw has perfected the world’s best system for learning Python 3. Follow it and you will succeed—just like the millions of beginners Zed has taught to date! You bring t......一起来看看 《Learn Python 3 the Hard Way》 这本书的介绍吧!