阅读目录
基于文件修改的注入方式
发布于:2016-6-21 16:51 | 172728次阅读 作者: 管理员 | 来自: 原创
1、概述 本文主要是介绍两种基于文件修改的注入方式,一种是“DLL劫持”,另一种是“修改导入表”。这两种注入方式都是利用操作系统加载PE时的特点来实现的,我们在实现这两种注入方式时只需专注于注入dll的实现,而不用花费额外的精力去关注注入器的实现。要想深入了解这两种方式,需要先对PE Loader的原理以及PE结构有所了解。 2、DLL劫持注入 2.1原理 每个PE文件都有一个“导入表”,pe文件在加载时,会优先加载“导入表”中的PE文件。进程在运行时,会从“导入表”中获取要加载的DLL的名称,然后按照指定的目录顺序去加载这些dll。“导入表”中有系统dll,也有程序自带的dll,因此dll劫持可再细分为系统dll劫持和程序自带dll劫持两类。 DLL在被加载时有个搜索顺序,当注册表HKLM\System\CurrentControlSet\Control\Session Manager键值下的属性SafeDllSearchMode的值设置为1时,DLL搜索顺序如下:(引用自 http://blog.csdn.net/magictong/article/details/6931520) 1、应用程序EXE所在的路径。 2、系统目录。 3、16位系统目录 4、Windows目录 5、当前目录 6、PATH环境变量指定的目录 当SafeDllSearchMode的值为0时,dll搜索顺序又会变为: 1、应用程序EXE所在的路径。 2、当前目录 3、系统目录。 4、16位系统目录 5、Windows目录 6、PATH环境变量指定的目录 通过观察这两种模式下的搜索路径,我们会发现进程在启动时会优先加载该进程exe所在路径下的dll,因此我们可以通过替换应用程序exe所在路径下的dll或将注入dll改名为系统dll并放在应用程序exe所在路径下的方式来实现注入,即”DLL“劫持。 然而在实际的”系统dll劫持“操作中,我们会发现并不是所有dll都能被劫持,xp和win7及win7以后的系统劫持效果也有所不同。Win7及以后的系统增加了HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs 来拒绝部分系统dll被劫持。该注册表中的dll名称不允许被劫持,即系统dll劫持会失败。 不过,微软又莫名其妙的允许用户在上述注册表路径中添加“ExcludeFromKnownDlls”注册表项,排除一些被“KnownDLLs注册表项”机制保护的DLL。也就是说,只要在“ExcludeFromKnownDlls”注册表项中添加你想劫持的DLL名称就可以对该DLL进行劫持,不过修改之后需要重新启动电脑才能生效。(引用自http://www.freebuf.com/articles/78807.html) 下文会介绍劫持系统DLL”dbghelp.dll”的实现方式。
2.2步骤和源码 创建Test工程用于生成test.exe (1)在Test.cpp中加入如下代码,主要是为了让此exe加载系统目录下的的dbghelp.dll文件。
(2)运行test.exe然后用ProcessExplorer来查看该exe所依赖的dll,发现会加载系统目录下的dbghelp.dll(C:\Windows\SysWOW64\dbghelp.dll),如下图所示,到此测试exe准备完毕。 创建MyDbghelp工程,用于生成劫持dll (1)在此工程中加入export.cpp并加入如下代码(完整代码请参阅附件),此段代码的功能其实是让MyDbghelp.dll导出系统目录下dbghelp.dll中的所有“导出函数“。Export.cpp可用工具生成,工具源代码在附件中,此处不作详细解释。
(3)将系统目录(c:\windows\syswow64)下的dbghelp.dll复制到test.exe所在目录,并改名为dbghelp_0.dll,然后将MyDbghelp工程生成的Mydbghelp.dll改名为dbghelp.dll,并复制到test.exe所在目录,接着运行test.exe会发现弹出MessageBox框,提示注入成功。想实现一些其它功能,可以自行修改Mydbghelp工程中的代码。 (4)再用PrcoessExplorer查看test.exe所加载的dll,会发现dbghelp_0.dll(改名后的系统dll)和dbghelp.dll(我们的dll,MyDbghelp.dll改名得到的)都会被加载,如下图所示,请注意两个dll的路径。 3、修改导入表的注入方式 3.1 原理 通过对pe结构的了解,我们会发现进程加载时依赖的dll主要来源于PE的导入表,因此我们可以自己写代码修改pe文件的导入表,也可以利用LordPe等Pe工具自行修改文件的导入表,从而让想注入的dll在原PE文件中有一席之地。修改完原PE文件的导入表后,再次启动程序,就会发现我们的注入dll被加载。这种注入方式的缺点就是为改变原有pe文件的MD5,容易被crc检验检测到。下文会介绍利用LordPe工具修改导入表。
3.2步骤与源码 (1)在上文的Mydbghelp工程的 export.cpp中,加入如下代码,这段代码的作用只是为了让Mydbghelp.dll导出一个Test函数,方便后续利用LordPe修改文件的导入表,然后编译生成Mydbghelp.dll.
extern "C" __declspec(dllexport) int Test(); int Test() { return 1; }; (2)用dependency walker工具查看MyDbghelp.dll的导出表,发现有Test()函数被导出 (3)利用LordPE打开 test.exe 依次点击“目录”-》“输入表”,如下图所示 (4)在打开的“输入表”窗口中,点击右键菜单中的“添加导入表”
(5)在弹出的窗口中填入要注入的dll的名称及该dll中的任意一个导出函数,然后点“+”和“确定”。 (6)最后,点击“保存,“确定”按钮,然后再运行test.exe,会发现注入成功,并弹出MessageBox对话框。用ProcessExplorer再次观察Test.exe加载的dll,会发现mydbghelp.dll被成功加载了,如下图所示。用dependency walker观察test.exe依赖的dll,对比修改前后的导入表,会发现mydbghelp.dll也成为依赖项之一了。 4、总结 DLL劫持的注入方法会面临部分系统dll无法被劫持的问题,而修改导入表的方式会面临 md5被修改、dep保护等问题容易被crc检验。但两种注入方式都可以避免OpenProcess,CreateRemoteThread,SetWindowsHookEx等高权限操作,实现起来也比较简单。 |
最新评论
发表评论