能力值:
( LV2,RANK:10 )
|
-
-
2 楼
我不知道你加重定位表做什么用,但是感觉你对这个的概念还不太清楚。
重定位信息是给系统加载器用的,用与不用,完全取决于进程空间的内存占用情况。一般来说exe总是会被加载到基址指定位置,所以即使有重定位表(例如delphi、BC++程序)也会被忽略。
所以加重定位表首先是没有必要,其次,从技术上来讲也很难实现。重定位表的作用是对绝对地址在需要的时候进行修正,如果原本就没有重定位表,要加这个表的话就需要对每行汇编代码进行手工分析,除非代码很少,否则工作量不可想像。
举个例子,假如exe原先的基址是400000,那么程序代码中会有巨量的绝对地址引用,比如:
401000: mov eax, 412000 <------ 如果这里的412000代表一个地址,就需要在这里添加重定位点,问题是你怎么知道412000代表什么呢?也可能它只是一个图书编号或者是一个其它立即数。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
汗, 那就是 没有重定位表 就很难加了?
关键是 我想改他的 基址
没有 重定位表 是不是就不能加了?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
肯定地说,不能。
问一下,为什么要改程序的基址,能说说吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
改程序基址,并不是改个参数那么简单,必须修改程序中的每个绝对地址引用,这也就是DLL为什么要带个重定位表的原因。
重定位表中记录了每个需要修改的地方,而这些个地方只有在被编译的时候才能知道(编译器知道)。
而你现在却想做编译器才能做的事。
只有原本就有重定位表的程序才能修改基址,修改的方法正是利用了重定位表中的定位信息,逐个地方去修改程序指令或数据。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
这个很难..除非你毅力超强....每个4K块就是一个重定位表的块...会累死人的......
|
|
|