游戏安全实验室 首页 技术入门 查看内容

 阅读目录

基于文件修改的注入方式

发布于: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文件。

 

#include "stdafx.h"

#include <process.h>

#include<Windows.h>

#include <DbgHelp.h>

#pragma comment(lib,"dbghelp.lib") 

int _tmain(int argc, _TCHAR* argv[])

{

PIMAGE_NT_HEADERS  pNtHdr=NULL;

 

pNtHdr=ImageNtHeader(GetCurrentProcess());//让此exe中的导入表中加入系统的dbghelp.dll

system("pause");

return 0;

}

(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可用工具生成,工具源代码在附件中,此处不作详细解释。


#include "stdafx.h"

#pragma comment(linker,"/EXPORT:DbgHelpCreateUserDump=dbghelp_0.DbgHelpCreateUserDump")

#pragma comment(linker,"/EXPORT:DbgHelpCreateUserDumpW=dbghelp_0.DbgHelpCreateUserDumpW")

#pragma comment(linker,"/EXPORT:EnumDirTree=dbghelp_0.EnumDirTree")

#pragma comment(linker,"/EXPORT:EnumDirTreeW=dbghelp_0.EnumDirTreeW")

#pragma comment(linker,"/EXPORT:EnumerateLoadedModules=dbghelp_0.EnumerateLoadedModules")

(2)在dllmain函数中加入中下代码,主要是为了弹出一个对话框用于表明注入成功。#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,

                       DWORD  ul_reason_for_call,

                       LPVOID lpReserved

 )

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

MessageBox(NULL,L"Inject succusfful",L"MyDbgHelp",MB_OK);

break;

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}

 

(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等高权限操作,实现起来也比较简单。


*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)

分享到:
踩0 赞0

收藏

上一篇:全系统注入的方法

下一篇:插APC注入

最新评论
B Color Image Link Quote Code Smilies

发表评论