首页
社区
课程
招聘
[原创]基于内联Hook实现的内存模块加载 实现思路
发表于: 2021-8-8 19:24 7731

[原创]基于内联Hook实现的内存模块加载 实现思路

2021-8-8 19:24
7731

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编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 2875
活跃值: (7828)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
还行挺好的  看来大家都从win转行android了
2021-8-9 13:15
0
游客
登录 | 注册 方可回帖
返回
//