位置无关特性有谁能帮忙解释一下吗?

foxyz123 2009-03-24 09:53:16
我看书上有说到位置无关性,汇编里有,动态链接里也有,这个应该怎么样理解
...全文
165 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lmxd70 2009-03-26
  • 打赏
  • 举报
回复
应该是重定位吧,一般用
call @F
@@:
pop ebx
sub ebx,offset @B

这样ebx里存放的就是修正的地址,以后在调用API时,将ebx加上API的地址就可以了,一般用于远程注入或要在别的地址空间执行代码的情况,这种用法只局限于汇编,高级语言是不行的,必须借助dll

另外4楼RVA的说法好像不太对吧,00403008不是RVA,3008才是(如果基址是00400000的话)

killbug2004 2009-03-26
  • 打赏
  • 举报
回复
应该叫访问的VA 虚拟内存地址。。。。。
xiaopoy 2009-03-24
  • 打赏
  • 举报
回复
汇编的位置无关指依据偏移来控制跳转和符号。比如常用的
call XX;
XX:
pop ebp;
dll的位置无关指符号和跳转重定位。比如MOFF格式可执行文件的符号头基本上完全是为重定位服务的。
killbug2004 2009-03-24
  • 打赏
  • 举报
回复
一个简单的程序
.386
.model flat,stdcall
include windows.inc
include user32.inc
includelib user32.lib
option casemap:none
.data
szCaption db "Message",0
szText db "Hello .....",0
.code
Start:
invoke MessageBox,NULL,offset szCaption,offset szText,MB_OK
ret
end Start


生成exe后反汇编代码
00401000 >/$  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
00401002 |. 68 08304000 PUSH MessageB.00403008 ; |Title = "Hello ....."
00401007 |. 68 00304000 PUSH MessageB.00403000 ; |Text = "Message"
0040100C |. 6A 00 PUSH 0 ; |hOwner = NULL
0040100E |. E8 01000000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
00401013 \. C3 RETN


我们看到这里使用的全局变量szCaption和szText的地址分别是00403008、00403000,这个地址是RVA,程序装载到内存中的虚拟地址,
当我们程序装载的基址为0x40000时,使用这个RVA访问全局变量是正确的,当我们程序装载地址不为0x40000时,使用这个地址就访问不到,
这个时候就需要对这些数据进行重定位,比如程序装载基址为0x500000,这是访问szCaption的RVA要变成00403008+(0x50000-0x400000)=0x503008

除了对全局数据访问使用了rva,比如还有一些跳转指令也有用到等等
对于exe系统一般都会装载到默认基址,而动态链接库则不能保证,所以重定位表对dll而言十分重要,dll在装载过程中,系统的loader会利用重定位表对
模块代码段中涉及这种数据访问的指令进行修正以保证模块正常运行
汇编中可以使用重地位技术来实现自修正代码
foxyz123 2009-03-24
  • 打赏
  • 举报
回复
没有人知道吗??有知道的帮忙回答一下哦,这个问题困扰我好久了
foxyz123 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 BAYNPU 的回复:]
汇编就是指令集,也就是机器指令的代替符号,不同硬件给出的当然就是针对自己机型的指令了,所以汇编是针对硬件的,没有高级语言那样的平台无关性,却比高级语言更好的,也更快的、更有效率的控制硬件、汇编和高级语言应用不同领域,有时候相互合作也能有很好的效果.
[/Quote]

你理解错啦,我说的是位置无关,不是平台无关
BAYNPU 2009-03-24
  • 打赏
  • 举报
回复
汇编就是指令集,也就是机器指令的代替符号,不同硬件给出的当然就是针对自己机型的指令了,所以汇编是针对硬件的,没有高级语言那样的平台无关性,却比高级语言更好的,也更快的、更有效率的控制硬件、汇编和高级语言应用不同领域,有时候相互合作也能有很好的效果.

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧