能力值:
( LV2,RANK:10 )
|
-
-
2 楼
RVA是一个相对模块基址的偏移,而且是取后12位,前四位是一个标记,OrigImage-OriginalImageBase算出的是新老内存地址的差值,这个差值加上 uRelocAddress ,就是真正的重定位后的地址. 看你的代码,应该是加载到了内存中了,uRelocAddress就是第一次加载成功后的绝对地址,然后再求出新分配内存与老内存的差值,加上老的uRelocAddress,就是新的定位地址. *uRelocAddress=*uRelocAddress 就是把uRelocAddress地址的值加上那个差值,所以这代码应该是没问题的.
|
能力值:
( 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文件地址)?
我很扯,但是我认为理解好它们各种地址的意义和用途,很多问题都不用问就自己可以知道为什么。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
你好谢谢回复 , 是这个帖子里面的代码~
OrigImage 是原始内核地址
http://bbs.pediy.com/showthread.php?t=177555
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
我的确理解错了阁下的意思!阁下分析的正确,我把imagebase理解成了申请内存的守地址了!而它的确是愿望地址!
疑点解决了! 谢谢
|
能力值:
( LV9,RANK:190 )
|
-
-
6 楼
如果 OrigImage 是原始内核地址
那 uRelocAddress 指向的数据必须已经被 用 OriginalImageBase 重定位过,这样的重定位需要先分析 uRelocAddress 地址的是代码或数据以及uRelocAddress指针指向的数据是指向代码或数据!...(很绕!)
http://bbs.pediy.com/showthread.php?t=177555 这个帖子我收藏了,还没有去看。原来你是在看现成的代码啊!我建议先把PE格式理解透再看代码就不会有多少疑问的!最近看雪上有不少内核重载的帖子,但是原理应该都差不多。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
*uRelocAddress=*uRelocAddress+(OrigImage-OriginalImageBase);
这样看不明白,如果写成这样是不是一眼就明白了
*uRelocAddress=*uRelocAddress-OriginalImageBase+OrigImage;
|
|
|