首页
社区
课程
招聘
[求助]关于重载内核重定位百思不得其解
发表于: 2014-6-9 17:23 5806

[求助]关于重载内核重定位百思不得其解

2014-6-9 17:23
5806
基址重定位问题
其中有句代码是  *uRelocAddress=*uRelocAddress+(OrigImage-OriginalImageBase);
uRelocAddress 是重定位数据地址
OrigImage 老内核地址
OriginalImageBase 新内核地址
我不明白的是  uRelocAddress地址的值
如果用CreateFile的方式自己加载新内核,那么uRelocAddress 指向的值就应该是文件里面原来的值 对不?
我用loadpe看了下重定位表 第一个重定位数据RVA是 0x12b2 ,转换成文件偏移是 0xAB2 然后用二进制编辑工具看了下 0xAB2处的数据是 0x00568758 !
也就是说我如果没理解错的话 *uRelocAddress (第一个重定位数据)应该恒等于文件中的那个值 0x00568758 才对啊~
那么上面那句计算*uRelocAddress=*uRelocAddress+(OrigImage-OriginalImageBase);怎么就正确得到老内核数据地址的。。。

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
RVA是一个相对模块基址的偏移,而且是取后12位,前四位是一个标记,OrigImage-OriginalImageBase算出的是新老内存地址的差值,这个差值加上 uRelocAddress ,就是真正的重定位后的地址. 看你的代码,应该是加载到了内存中了,uRelocAddress就是第一次加载成功后的绝对地址,然后再求出新分配内存与老内存的差值,加上老的uRelocAddress,就是新的定位地址.  *uRelocAddress=*uRelocAddress 就是把uRelocAddress地址的值加上那个差值,所以这代码应该是没问题的.
2014-6-9 17:33
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
3
我没有看过你的代码,但是从*uRelocAddress=*uRelocAddress+(OrigImage-OriginalImageBase);
可以得到理解:
OrigImage   应该是新内核基地址
OriginalImageBase   应该是用CreateFile的方式打开PE头部的 ImageBase 值(ImageBase 我的理解是预加载基地址或愿望加载基地址)。
用CreateFile的方式自己加载新内核 uRelocAddress 就是文件地址也是运行地址,但是还要区分你是直接把整个PE文件数据读取还是把各个pe节按内存RVA模拟PE映像加载方式读取数据!

我对:“那么上面那句计算*uRelocAddress=*uRelocAddress+(OrigImage-OriginalImageBase);怎么就正确得到老内核数据地址的。。。 ”这个疑问的理解是:你是否可以理解PE中的几种地址表示:RVA 、预加载基地址、可执行内存映像模块基地址、PE编译地址、PE文件地址、文件偏移量、以及PE运行地址(这个PE运行地址是我个人观点,包括PE的VA(这个VA也包括PE编译地址和实际加载的PE中某个内存地址)和PE文件地址)?  
我很扯,但是我认为理解好它们各种地址的意义和用途,很多问题都不用问就自己可以知道为什么。
2014-6-9 18:49
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你好谢谢回复 , 是这个帖子里面的代码~
OrigImage 是原始内核地址
http://bbs.pediy.com/showthread.php?t=177555
2014-6-9 23:13
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我的确理解错了阁下的意思!阁下分析的正确,我把imagebase理解成了申请内存的守地址了!而它的确是愿望地址!
疑点解决了! 谢谢
2014-6-10 11:25
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
6
如果 OrigImage 是原始内核地址
那 uRelocAddress 指向的数据必须已经被 用 OriginalImageBase 重定位过,这样的重定位需要先分析 uRelocAddress 地址的是代码或数据以及uRelocAddress指针指向的数据是指向代码或数据!...(很绕!)

http://bbs.pediy.com/showthread.php?t=177555 这个帖子我收藏了,还没有去看。原来你是在看现成的代码啊!我建议先把PE格式理解透再看代码就不会有多少疑问的!最近看雪上有不少内核重载的帖子,但是原理应该都差不多。
2014-6-10 19:11
0
雪    币: 178
活跃值: (182)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
*uRelocAddress=*uRelocAddress+(OrigImage-OriginalImageBase);
这样看不明白,如果写成这样是不是一眼就明白了
*uRelocAddress=*uRelocAddress-OriginalImageBase+OrigImage;
2015-2-22 16:51
0
游客
登录 | 注册 方可回帖
返回
//