能力值:
(RANK:260 )
|
-
-
2 楼
.reloc这个节中存放的是重定位表,dll不像exe,它的默认加载基址(通过连接器参数指定)在某个进程的地址空间中有可能无法使用,系统只能将它加载到另外一个地址,此时程序中全局变量以及函数指针等“地址”都需要进行修正,这个过程就是所谓的重定位(加载器重定位,另外还有一种连接器重定位,是另外一回事,与此无关),而重定位表中的表项就是记录了哪些数据是指针,指针类型以及需要修正的size等信息。
你破坏了重定位表,dll文件就无法正常加载了。
有关重定位的知识,自己参考一下相关文档,如微软的PE格式、ELF标准文档等。如果要深入学习,有一本书叫《连接器与加载器》,可以看一下。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
谢谢书呆彭,修改reloc表是必须修改我才修改的,因为我自己增加了指针,需要重定位,修改后将reloc表的size也根据我修改后的表大小改了,但结果出了这个问题,不知道怎么解决,PE格式我也看了,就是不知道出了什么问题!
|
能力值:
(RANK:260 )
|
-
-
4 楼
详细说一下,你都修改、增加、删除了哪些地方的哪些内容。
用OD跟一下修改后的dll,不要忽略内存异常,这样遇到异常时,顺着堆栈可以大约找到引发异常的代码,再分析一下是哪个指针出错了,为什么出错等。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
具体说下:
我做的工作就是汉化一个动态链接库,在代码段的大量0处增加了宋体九号的logfont结构,然后作为createfontdirect函数的参数来设置界面上的字体,在原程序中都能正常运行,没有错误,且结果正确,但使用其进行二次开发后的程序就不能运行了,我分析了下,因为其原程序将这个dll加载到他的镜像地址上了,而二次开发程序没有加载到它的镜像地址,所以就考虑到修改reloc段,但修改完后所开发的程序也不能运行,注册也不行了,不知道是什么原因.
谢谢呆子彭
|
能力值:
(RANK:260 )
|
-
-
6 楼
只修改了.reloc节,没有修改重定位目录?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
你指的重定位目录是不是重定位表中的item吗?
|
能力值:
(RANK:260 )
|
-
-
8 楼
OptionalHeader中的DataDirectory指向的Image_directory_entry_basereloc表。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
修改这个是不是指修改reloc表的地址和大小?
如果时,我修改了的
|
能力值:
(RANK:260 )
|
-
-
10 楼
那section table中的节大小也改了?
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
section table是指?
|
能力值:
(RANK:260 )
|
-
-
12 楼
section table是OptionalHeader之后的一个结构,由ImageFileHeader中的相关域指出它的位置和大小。
要修改重定位表,重定位目录和.reloc节都需要看一下的。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
这两个地方我都修改了,你有qq吗,能和你在线聊吗?
|
|
|