OBJ文件解析之静态链接的效果

来源:互联网 发布:ddos攻击网络抓包 编辑:程序博客网 时间:2024/05/24 22:42

至于发生静态链接的时机是在编译器编译生成OBJ文件之后,在链接器链接 各个obj文件之时,在运行生成程序之前,详细的过程你可以去参考《程序员的自我修养》,在这里我只是引证一下静态链接的发生时存在的:

还积极的上篇哪个简单的obj1.cpp文件吗?里面只有一个简单的printf("This is 1st .c file : obj1.c"), 以及用dumpbin  /all obj1.obj生成的 obj1.txt文件 中有一个节,


这是这个obj文件的代码节,里面本来应该调用了printf       ,可为什么是0x 00000000 表示呢? 因为 printf 这个 库函数 不是我们自己写的,是需要 在链接时 填写完成的,

那么,我就得给连接器提供相关 我们在这里调用 printf函数的提示了, 这就是 重定位表项的作用了,通过  相对于节原始数据的偏移 ,类型(确定大小), 符号索引(唯一确定一个符号),链接器就明白了需要去在别的obj文件中查找 该 符号的 地址了,然后在此处填写


最终生成的EXE文件,会将相关obj文件 的区段合并,比如说代码段,所以需要查找PE文件里特定的2进制代码段,我这里用的Hex Editor,查找16进制 55 8B EC 81 EC ,


 显示找到了11项,进过肉眼删除,确定一份

转到重定位相关处  偏移 0x21 处 对字符串的访问 ,68 00 00 00 00 变成了 68 58 58 41 00 了,发生了变化,  可以看到  地址 0x00 41 58 58 是在 pe文件数据区

偏移0x27出的15 00 00 00 00 变成了 15 14 91 41 00

VS2013调试运行截图(会发生运行时重定位)

反汇编窗口



内存窗口

68 58 58 39 01 ff      15 14 91 39 01          83 c4 04 3b f4 


原始obj文件对应处数据

68 00 00 00 00 FF   15 00 00 00 00          83 C4 04 3B F4 


PEVIEW 中数据



调动PEVIEW VA视角,找到 0x415858处 

,找到了字符串


另一个 0X419114 ,



注意了 由于 printf 是被动态 链接进 PE文件中去东,因此 在文件中的时候 ,0x419114 存放的并不是 printf的地址 ,而是它名称字符串“printf”所在RVA地址,真正的地址要等到

加载器,去修复,至于RVA是什么 要等到 你学PE文件结构时 ,就知道了,在这里 你只需要 了解 这个地址指向了名称 字符串 ,通过这个名称 ,在你点击了exe程序后,

加载器会自动帮你找到 该名称对应 函数 的地址的

0 0
原创粉丝点击