1.7 - 打造DLL内存加载引擎.
1. 7 打造DLL内存加载引擎.
何为dll内存加载引擎?
实际简单说就是我们来模拟loadlibrary函数,只是我们模拟的是内存加载,而不是读取磁盘文件到内存中在进行加载(实际上是一样,恩你要喜欢模拟完全的Loadlibrary 也可以 无非多几个io函数)。我们virus和rat用于来做一些anti 的yy。 国外的一些rat就是采用此方式来躲避杀毒软件,它的应用功能代码集成在dll中,在需要用到应用功能的时候传输dll数据到远程客户端,远程客户端采用DLL内存加载的方式来执行代码,这样杀毒软件就xxxxxxx 呵.动态编码 也和这个思路类似,只不过这个方式更方便些。。
恩我们今天就来实现dll内存加载引擎,其实其实实现这个对于以后的写壳的pe loader也可以来运用 恩,该说的废话说完了,进入主题。
首先看下我们内存加载引擎的流程。
1. 申请一段大小为dll映射内存后的映像大小的内存空间。
2. 移动各个区段的数据到申请的内存。
2. 修复引入表结构的地址表。
4. 通过重定位结构修复需要重定位的地址。
5. 调用DllMain入口点
完毕!.......
流程解析:
1. 首先第一步地球人都知道pe结构中pe header结构当中的imagesize存放的是我们整个文件映射到内存后的映像大小,这个大小是经过对齐的。 恩没错读取这个成员值,来申请内存空间,我
们申请的内存空间的属性为“可读可写可执行”,我们用VirtualAlloc来申请。
2. 读取各个节表结构的各区段的物理偏移和物理大小,然后移动各区段数据到节表结构对应的的内存空间中(注意:实际上就是将节表结构的VirtualAddress + 申请的内存空间地址),移动的
大小则为我们物理大小.
3. 修复引入表结构的地址表。其实就是修复引入表结构FirstThunk指向的地址表,因为我们的程序api调用的也是FirstThunk所指向的地址表成员。有引入表常识的人都知道, 程序在未加载之前FirstThunk指向的地址表成员都指向的是一个IMAGE_IMPORT_BY_NAME结构,当加载后这个地址表的成员都被替换成相应的函数地址。所以我们的处理引入表过程函数 可以直接读取FirstThunk来取得相应的引入函数名称及序号等,没必要读取OriginalFirstThunk来读取。
4. 通过重定位结构修复需要重定位的地址,恩我们连接器在链接可执行程序的时候会将需要重定位的偏移存放到一个结构中,这样pe loader读取重定位结构就可以定位到需要重定位的地址。
5. 这个就不说了吧 压入参数, 取得入口点rva+申请目标空间地址然后call调用即可............
Over。
貌似剩下没什么可说了吧,直接看代码吧。
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
