首页
社区
课程
招聘
[求助]关于PE文件重定向的一个问题。
发表于: 2017-11-3 21:52 4024

[求助]关于PE文件重定向的一个问题。

2017-11-3 21:52
4024
已知imagebase:1000000h
1:PE文件重定向,是将整个PE文件重定向吗?
2:struct IMAGE_DATA_DIRECTORY BaseRelocationTable这个数组中,size代表的是什么?
3:我们将BaseRelocationTable中的VirtualAddress换算成物理地址为2AE00h,找到了一个新的数组。得知: VirtualAddress=1000  SizeOfBlock=150 后面是若干个16位的数据。高四位代表了文件属性我知道,低16位代表了一个偏移量。这个偏移量加上之前的1000就是总偏移量。但是为什么会有那么多16位的数据。
4:知道了总偏移量,我们再次换算成物理地址。找到了一个新数据。010010c4。这个地址又是什么意思呢?
5:我们重定向,到底是将载入点修改了,还是将其他什么东西修改了?
初学逆向,问题较多,网上博客看了好几篇,但是感觉饿众说纷纭。如能回答一到两个,感激不尽!

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (28)
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
另外,我看《逆向工程核心原理》一书中,他在描写这里的时候,直接将新载入的载入点告诉了我们,而没有告诉我们如何得到。这里疑惑也颇多。
2017-11-3 21:53
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
问题可能问得有点没什么条理,因为大脑现在真的有点混乱,各位见谅。
2017-11-3 22:05
0
雪    币: 39
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
逆向工程核心原理  这本书里有答案。。  我也是逆向新手  你看136页最后那段的:像这样,使硬编码在程序中的内存地址随着当前加载地址变化而改变的处理过程就是PE重定位      我觉得书里讲的挺清楚。。当然这块我前前后后看了不下5遍。
2017-11-4 10:58
0
雪    币: 179
活跃值: (413)
能力值: ( LV13,RANK:357 )
在线值:
发帖
回帖
粉丝
5
重定向主要是用来定位vir地址  ,相对跳转就不用了  比如  jmp  XXXX  ,je  XXX  这些汇编下都是相对跳转的...
而vir地址   
如某dll默认加载地址是0x10000000    其中有语句  push  "你好"    ,
这个汇编下    是  push  0x10002000    如果加载到默认地址  那么这个地址是对的,
如果这个dll加载到0x20000000,那么他就应该重定位到  push  20002000  才能保证访问的是正常数据

这时候,这个地址就需要重定位了....

重定位表  16位地址/每个地址站2字节,注意重定位表
重定位页偏移1000      大小N1        重定位偏移1    重定位偏移2    ...重定位偏移N1
重定位页偏移2000    大小N2          重定位偏移1    重定位偏移2    ...重定位偏移N2
...
每个1000H大小(每一页内存),都有自己的重定位表的,不会出现数量不足的问题
2017-11-4 14:19
0
雪    币: 179
活跃值: (413)
能力值: ( LV13,RANK:357 )
在线值:
发帖
回帖
粉丝
6
不是每个dll都能抢到自己默认的dll地址,为了解决这问题,引入了重定位机制
2017-11-4 14:20
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
瞧红尘 重定向主要是用来定位vir地址 ,相对跳转就不用了 比如 jmp XXXX ,je XXX 这些汇编下都是相对跳转的... 而vir地址 如某dll默认加载地址是0x10000000 其中有 ...
1:那么重定位的0x20000000这个地址是随机给出的吗?
2:重定位偏移1        重定位偏移2        ...重定位偏移N1    这么多的重定位偏移是为了什么?是重定位偏移1也被占用就载入到重定位偏移2吗?
感谢你的回答!
2017-11-4 15:36
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
languang 逆向工程核心原理  这本书里有答案。。  我也是逆向新手  你看136页最后那段的:像这样,使硬编码在程序中的内存地址随着当前加载地址变化而改变的 ...
看了一下,但是感觉讲到数组那个部分有点晦涩。没看懂……
2017-11-4 15:36
0
雪    币: 39
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9



unlocku

看了一下,但是感觉讲到数组那个部分有点晦涩。没看懂……
那你应该没有做后面的练习16.3.4吧    size是程序中硬编码的个数,每个数组的值经过计算得到一个相对地址(而这个相对地址的内容是一个硬编码),你看P141的练习16.3.4  #1首先使用数组中的值420加上1000得到  总偏移量1420;然后找到RVA1420这个位置(里面的C4100001就是一个硬编码),当我们加载的ImageBase不是我们设定的01000000,这个时候我们是不是得对硬编码  做一些处理    然后你看#2、#3得操作      这些都是书上的。


2017-11-4 16:11
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
languang unlocku 看了一下,但是感觉讲到数组那个部分有点晦涩。没看懂…… 那你应该没有做后面的练习16.3.4吧    ...
明白了一些,后面跟着那么多的2个字节的数据其实就是对应了一个个的硬编码。在运行的时候需要根据实际加载的imagebase不同来修改他们的值,但是这和重定位有什么关系。  每当我们重启了这个程序,硬编码的地址就会改变。但是我感觉这里没有体现出重定位的思想。(我理解的重定位思想是,a.dll占据了100这个地址,b.dll本来也应该占据这个地址,但是已经被占了它就只能去找别的地址了,但是在这里好像没有体现出来怎么去找到一个别的地址)只是说我们改变了文件的载入点,那么硬编码就需要改变。     
2017-11-4 16:47
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
unlocku 明白了一些,后面跟着那么多的2个字节的数据其实就是对应了一个个的硬编码。在运行的时候需要根据实际加载的imagebase不同来修改他们的值,但是这和重定位有什么关系。 每当我们重启了这个程序,硬编码的 ...
这个只是我的理解。虽然我感觉自己这样了理解肯定有错误,但是实在不知道哪里错了。
2017-11-4 16:48
0
雪    币: 39
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12



unlocku

这个只是我的理解。虽然我感觉自己这样了理解肯定有错误,但是实在不知道哪里错了。
我理解的重定位就是上面说的重新定位程序中硬编码的值。  我知道你想问什么    问b.dll的加载地址是怎么来的  为什么是这样的一个值  ;  这个值应该是PE加载器分配给b.dll    我猜可能是这样的  当加载器要加载b.dll文件到内存中来的时候,发现b.dll的默认加载地址已经分配出去了    然后PE加载器就随便找了个适合b.dll的内存块地址给它(合适是指大小大于b.dll的base  of  image,或许还有其他一些判断标准  我也不是很清楚。)我想你认为的重定位是  重新定位  ImageBase  这个过程。。   
2017-11-4 17:32
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
languang 我理解的重定位就是上面说的重新定位程序中硬编码的值。 我知道你想问什么 问b.dll的加载地址是怎么来的 为什么是这样的一个值 ; 这个值应该是PE加载器分配给b.dll 我猜可能是这样的 当加载 ...
唉,我再搜搜资料把。
2017-11-4 18:16
0
雪    币: 39
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
unlocku 唉,我再搜搜资料把。
好吧    /捂脸    我觉得很清楚了。。
2017-11-4 18:44
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
languang 好吧 /捂脸 我觉得很清楚了。。
因为我看他一开始解释什么是重定位的时候,用的是我b.dll这个例子,结果到后来解释的又是硬编码。感觉有点对不上,还是谢谢你啦
2017-11-4 19:00
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
languang 好吧 /捂脸 我觉得很清楚了。。
不过我在想,既然是硬编码。那就是寄存器直接寻址或者相对寻址。是根据ds为基准的一个偏移量,那么在重载到不同的imagebase之后,实际上偏移量应该是不变的才对啊。因为.data数据段已经根据imagebase来修改了他的实际地址,但是他这里改了,挺奇怪的。
2017-11-5 09:27
0
雪    币: 39
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
unlocku 不过我在想,既然是硬编码。那就是寄存器直接寻址或者相对寻址。是根据ds为基准的一个偏移量,那么在重载到不同的imagebase之后,实际上偏移量应该是不变的才对啊。因为.data数据段已经根据imag ...
老哥  你这是神逻辑。。  【既然是硬编码。那就是寄存器直接寻址或者相对寻址。是根据ds为基准的一个偏移量】这句话的逻辑你是怎么推导出来的    估计你看了些视频又在网上看了些文章    然后书可能你只看了一遍    你练习16.3.4肯定没动手  你再看下16.3.4  动手做下  你就会发现【】里的话好奇怪。  个人建议你以书本为准,来搭建最基本的基础知识  比较稳    我就是这样的    我也是新手。。不过我看书看了很多遍了  最近一遍动手基本完成所有代码练习
2017-11-5 10:22
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
languang 老哥 你这是神逻辑。。 【既然是硬编码。那就是寄存器直接寻址或者相对寻址。是根据ds为基准的一个偏移量】这句话的逻辑你是怎么推导出来的 估计你看了些视频又在网上看了些文章 然后书可能你只看了一遍 ...
额,拿书上的一个例子  call  dword  ptr  ds:[2810fc],包括他很多圈出来需要重定位的信息都是[xxxxxh]这样的形式出来的,那这些不都是寄存器直接寻址吗……
2017-11-5 10:28
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
unlocku 额,拿书上的一个例子 call dword ptr ds:[2810fc],包括他很多圈出来需要重定位的信息都是[xxxxxh]这样的形式出来的,那这些不都是寄存器直接寻址吗……
逆向工程核心原理137页……
2017-11-5 10:34
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
languang 老哥 你这是神逻辑。。 【既然是硬编码。那就是寄存器直接寻址或者相对寻址。是根据ds为基准的一个偏移量】这句话的逻辑你是怎么推导出来的 估计你看了些视频又在网上看了些文章 然后书可能你只看了一遍 ...
那个例题我做了几遍了。但是问题,至少以我的汇编理解,书上137页上他说需要重定位的信息,都是寄存器直接寻址。那么他那里改的目的又是什么呢。
2017-11-5 10:36
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
languang 老哥 你这是神逻辑。。 【既然是硬编码。那就是寄存器直接寻址或者相对寻址。是根据ds为基准的一个偏移量】这句话的逻辑你是怎么推导出来的 估计你看了些视频又在网上看了些文章 然后书可能你只看了一遍 ...
不好意思明白了。原来每一次重新运行,不需要重新把PE文件装载到内存里。所以才需要改变这些硬编码。明白了明白了,谢谢你了!!!
2017-11-5 10:58
0
雪    币: 39
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
unlocku 逆向工程核心原理137页……
那我们就以137页你说的这个地方来讨论,你应该也下载了随书example,你将第16章的程序例子notepad.exe在od中打开,看你说的2810fc处(也就是离入口第9行,push  eax下面这条指令,是调用了GetStartupInfiA函数)这个函数是来自与kernel32,所以这里是不是涉及IAT(IAT是怎么形成,如何发挥作用);2810fc这个地址是notepad.exe这个模块的IAT区域,是不是肯定得跟着notepad.exe的ImageBase走,P136下面也提到了  /捂脸    要不你咬文嚼字再看几遍。。 
2017-11-5 11:03
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
languang 那我们就以137页你说的这个地方来讨论,你应该也下载了随书example,你将第16章的程序例子notepad.exe在od中打开,看你说的2810fc处(也就是离入口第9行,push eax下面这条 ...
嗯,之前对运行时候的机制理解有错误,以为每一次运行都要重新装载一次。这个错误真是太大了……现在了解了。
2017-11-5 11:05
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
languang 那我们就以137页你说的这个地方来讨论,你应该也下载了随书example,你将第16章的程序例子notepad.exe在od中打开,看你说的2810fc处(也就是离入口第9行,push eax下面这条 ...
还有一个问题……就是假如a.dll已经载入了,然后系统随机给了b.dll一个地址,那之后b.dll还会进行硬编码重定位的操作吗?感觉是不会的,但是还是想求证一下。。
2017-11-6 08:57
0
雪    币: 179
活跃值: (413)
能力值: ( LV13,RANK:357 )
在线值:
发帖
回帖
粉丝
25



unlocku

1:那么重定位的0x20000000这个地址是随机给出的吗?
2:重定位偏移1 重定位偏移2 ...重定位偏移N1 这么多的重定位偏移是为了什么?是重定位偏移1也被占用就载入到重定位偏 ...
是系统随机给出的,但你的dll有重定位的话,这些被重定位的地址就会自动被修改掉,
比如  push  10002000,这里的重定位给出的偏移是这个  10002000的值的偏移地址
(如XXXXxxxx:XXXX表内存块偏移,xxxx表小偏移), 
那么系统载入20000000后,就会自动计算找到这个偏移,这个10002000  改成  20002000  了
计算方式也很简单 原始值+(新内存基址-默认内存基址) = 10002000 + (20000000-10000000) = 20002000
通过偏移列表(重定位表)一个一个去改
2017-11-6 09:17
0
游客
登录 | 注册 方可回帖
返回