-
-
[原创]基于内联Hook实现的内存模块加载 实现思路
-
-
[原创]基于内联Hook实现的内存模块加载 实现思路
Windows下内存加载dll模块或者exe文件并新建线程跳转到入口的方案有不少了,但是限制也极多,例如内存模块之间没法相互调用、正常模块和内存模块之间无法相互调用等等。
我们这里使用的船新版本,有效解决了这些问题,使用的技术为内联钩子,内联钩子技术具体介绍在我以前的文章https://bbs.pediy.com/thread-262034.htm,而我们这里重点讲思路,实际上实现起来是挺简单的。
由于我们使用的是C++语言,因此直接使用STL的map即可解决模块名称、虚拟内存HANDLE的映射功能,有了这个映射系统,我们接下来实现的就简单了。
我们重点关注的是LoadLibraryW、GetModuleFileName、GetProcAddress、FreeLibrary等等关键函数,别的函数实现也特别简单。
在程序启动以后,我们MSHookFunction直接对函数下钩子,大致实现如下:
实例化4个关键map(实际上还有几个不算特别关键的,可以自己摸索),键值 - 内容分别是 名称 - 虚拟HANDLE结构体、HANDLE - 名称(检索虚拟HANDLE用)、导出函数 - 模块名称、导入函数 - 虚拟HANDLE结构体
对LoadLibrary下钩子,首先检查名称是否在映射表里面了,如果已经存在则直接把虚拟HANDLE结构体里面的一个创建出来的HANDLE返回。如果不存在,则判断是本地调用还是需要内存加载,并且实现相关内存加载逻辑。内存加载dll的方案实在是太多,因此不展开讲了(详情看以前的 https://github.com/lianglixin/MemDllLoader),主要是需要自己处理一下导入函数和导出函数、节段映射等等。。。
对GetProcAddress下钩子,也是检索虚拟HANDLE的intptr_t值对应的名称,再通过名称找到虚拟句柄,这个很好理解,如果是内存模块就走内存模块的函数检索了。。。。。
对FreeLibrary、GetModuleFileName以及一些别的函数的内联钩子也比较好理解,主要是这样可以做到无模块内存加载,用途挺多,也不一一列举了。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-8-8 19:25
被lhxdiao编辑
,原因: