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: mpclientmain(): GDB: add-symbol-file engine/mpengine.dll0xf6af4008+0x1000main(): GDB: shell bash genmapsym.sh 0xf6af4008+0x1000symbols_19009.o < mpengine.mapmain(): 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+0x1000add symbol table from file "engine/mpengine.dll"at .text_addr =0xf6af5008Reading symbols from engine/mpengine.dll...done. (gdb) shell bash genmapsym.sh 0xf6af4008+0x1000symbols_19009.o < mpengine.map (gdb) add-symbol-file symbols_19009.o 0add symbol table from file "symbols_19009.o" at .text_addr = 0x0Reading 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

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-05-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏惨绿少年

MongoDB 分片集群技术

---- 在了解分片集群之前,务必要先了解复制集技术! ----  1.1 MongoDB复制集简介   一组Mongodb复制集,就是一组mongod进程,...

4899
来自专栏雨过天晴

转 树莓派无显示器安装系统

1622
来自专栏bboysoul

安装python时碰到的尴尬的事情(使用pyenv离线安装python)

前几天迫不得已重装了系统,所以要重新安装一下python,我用的python版本管理工具是pyenv,大家都得知道一点的是大天朝的电信出口带宽等于断网,所以我用...

1702
来自专栏微服务生态

论代码级性能优化变迁之路(一)

大家好,很久没有和大家一起讨论技术了,那么今天我将和大家一起探讨我负责的某项目的性能变迁之路。

822
来自专栏Java架构

今咱们来聊聊JVM 堆外内存泄露的BUG是如何查找的前言内存泄露Bug现场查找线索总结

2994
来自专栏逢魔安全实验室

wordpress任意文件删除漏洞分析

本文内容比较多,建议点击https://blog.formsec.cn/2018/07/03/wordpress%E4%BB%BB%E6%84%8F%E6%96...

991
来自专栏图像识别与深度学习

Android Studio下打jar包及使用jar包

4905
来自专栏IT技术精选文摘

解Bug之路-记一次JVM堆外内存泄露Bug的查找

1383
来自专栏落影的专栏

iOS开发笔记(五)

前言 社会的模式很多是重复的,当你做一样事情很擅长时,与之类似的事情也能触类旁通。 正文 Code开发 1、delegate的trick 很多人习惯在调用de...

4554
来自专栏kl的专栏

spring batch精选,一文吃透spring batch

批处理是企业级业务系统不可或缺的一部分,spring batch是一个轻量级的综合性批处理框架,可用于开发企业信息系统中那些至关重要的数据批量处理业务.Spri...

8978

扫码关注云+社区

领取腾讯云代金券