STATEMENT
声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测及文章作者不为此承担任何责任。
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
dll劫持-劫持exe导入表中的dll
当一个可执行文件运行时,Windows加载器会将PE文件映射到内存中,然后分析可执行文件的导入表,并将相应的DLL文件装入,EXE文件通过导入表找到DLL中相应的函数,从而运行相应的函数。
比如我们先来看一个可执行文件的导入表。
可以使用https://ntcore.com/files/CFF_Explorer.zip
将可执行文件导入此工具。
这里我就将微信导入进去了
找到一个系统Knows表中没有的dll,为什么不劫持HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerKnownDLLs 中的dll?
是因为这些dll劫持难度较大,Know DLLs注册表项里的DLL列表在应用程序运行后就已经加入到了内核空间中,多个进程公用这些模块,必须具有非常高的权限才能修改。
dbghelp.dll是没出现在knowndlls中的,我们可以在当前文件夹中找到它。
那我们就劫持这个dll,接下来需要借助aheadlib这个工具去完成劫持,下载地址:
https://pan.baidu.com/s/1ulNXz-EQEyDVL2tXE2G5sg
提取码: t3kp
直接转发
如果输出那块报错了 那么可以尝试低权限的路径,原始的dll名字叫 dbghelporg
生成之后我们 去打开它看看
最后有个入口函数
我们在入口函数中写一些恶意代码,然后新建个dll给他编译下
要在头文件中的pch.h中加入 # include <stdlib.h>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
.......
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
system("calc");
}
else if (dwReason == DLL_PROCESS_DETACH)
{
}
return TRUE;
}
然后将原本的dbghelp.dll改名为dbghelporg.dll
将我们刚刚编译好的dll改名为dbghelp.dll
然后直接运行weichat.exe
通过代码去分析劫持的原理:
可以看见使用# pragma comment(linker, "/EXPORT:omap=dbghelporg.omap,@199")
这是常见的导出函数写法之一,只不过后面跟了个定义。
当主程序想要调用dll中的omap函数的时候,得先去loadlibrary,去加载这个dll,然是在加载的时候根据linker, "/EXPORT:omap=dbghelporg.omap,@199"就会去加载原始的dll dbghelporg.dll这个时候其实就已经转发了,
如何证明这一点呢?
我们把原始dll删去,然后执行wechat.exe
LoadLibrary可用于将库模块加载到进程的地址空间中,结果转发的时候找不到原始的dll,导致运行出错。
即时调用
用Visual Studio 2019 去修改下
下面是需要改动的地方
然后将原本的dbghelp.dll改名为dbghelporg.dll
将我们刚刚编译好的dll改名为dbghelp.dll
直接启动wechat.exe
根据源码去分析原理:
首先调用导出函数之前得经历初始化Dllmain
return到load函数
load函数加载原始dll去初始化程序的所有导出函数的地址
在这里直接getaddress函数去获取所有导出函数的地址
继续跟到getprocaddress函数中去取地址
最后我们再来看看导出函数 定义的就是指向该代码中的函数,以SymGetOmapBlockBase函数为例
主程序要调用SymGetOmapBlockBase函数,直接就可以获取到原始dll中SymGetOmapBlockBase函数的地址,然后jmp到内存中原始dll的那个导出函数的地址,去完成相应功能。
对比之前用直接转发出来的cpp,对比之前用直接转发出来的cpp,直接转发对主程序来说 其实就是调用了原来dll的某个函数。
但是即时调用实际上是调用了劫持dll的某个函数 只不过那个函数会jmp到原本的dll中的相应函数的地址。
达到的效果相同 但是实现的原理不同。
到此劫持导入表中的dll两种方式都完成了。
参考链接
https://www.cnblogs.com/cswuyg/archive/2011/09/30/dll.html
https://cloud.tencent.com/developer/article/1005669
https://www.cnblogs.com/punished/p/14715771.html
参考书籍
《windows核心编程(第五版)》
RECRUITMENT
招聘启事
END
长按识别二维码关注我们
本文始发于微信公众号(雷神众测):dll劫持从0到1-篇2(劫持导入表中的dll)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论