首页
社区
课程
招聘
[原创]Win PE系列之重定位表解析与模块注入技术
发表于: 2021-10-11 19:22 7677

[原创]Win PE系列之重定位表解析与模块注入技术

2021-10-11 19:22
7677

考虑下面这段代码

为了给数组szHello赋值,程序从0x01881C0地址处开始依次取出相应的数据赋给数组szHello,而这个地址中,保存的就是要赋值给数组的字符串

但问题是,由于程序装载到内存中的基地址,也就是ImageBase是不一样的(dll文件和开了ASLR的exe文件),这就导致了这个字符串的地址会发生改变。重新编译上面的程序,会得到如下的结果

可以看到,此时的字符串的地址变成了0x004181C0。所以为了让程序运行的时候找到正确的字符串的地址,这就需要一块内存来保存所有引用了这个字符串地址的地址。当程序加载的时候,对这个地址进行重定位来找到正确的字符串的地址,这块内存就是重定位表。

重定位表位于数据目录的第6项,在文档中的定义如下

所指的地址指向了IMAGE_BASE_RELOCATION结构体,结构体的定义如下

这些需要重定位的地址都是按块保存的,每一个块都是一个IMAGE_BASE_RELOCATION后面跟上若干两字节的偏移地址。当找个一个块,它的VirtualAdreess和SizeOfBlock都是0的时候,说明已经没有重定位块要解析了。

而偏移地址有多少,就需要根据IMAGE_BASE_RELOCATION中的SizeOfBlock来决定,这个字段说明的是整个重定位块的大小,减去VirtualAddress和SizeOfBlock的占的8字节,在除以2就可以得到偏移地址的个数。

每个偏移地址的高4位如果是3的话,那么它的低12位就代表了偏移地址,这个偏移地址加上这个块的IMAGE_BASE_RELOCATION中的VirtualAddress就得到了需要进行重定位的地址。

所以可以用下面的代码来解析重定位表

部分输出结果如下


实现模块注入的相应过程如下

将要注入的模块在内存中的PE状态读入到内存中

将被注入的程序启动,并在它的进程空间中申请可以容纳注入的模块大小的空间

根据申请到的地址,去重定位读入到内存中的注入的模块的重定位表

将重定位以后的内存中的内容写入到申请到的地址

通过创建远程线程的方式启动要运行的模块


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-10-11 19:55 被1900编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//