注册 登录
编程论坛 汇编论坛

罗云彬WIN32重定位代码中的奇怪字符

发布于 2010-04-29 09:30, 2424 次点击
大家帮偶看看以下代码:
call @F
@@:
pop ebx
sub ebx,offset@B
其中@F,@@,@B分别表示什么含义?
12 回复
#2
zklhp2010-04-29 09:44
@F 向下跳到@@:处

@B 自己猜~
#3
2010-04-29 10:03
如果@F是向下跳到@@:处,那么pop ebx则是标号@@在内存中的地址,问题是ebx-offset@B指向哪里?

#4
zklhp2010-04-29 10:22
往上看~
#5
2010-04-29 10:34
你别忽悠我了,往上移动offset@B是哪?
#6
swp1601082010-04-29 15:42
书里不是说的很清楚了吗
#7
chengstone2010-04-29 15:56
@Forward
@Back

很多汇编语言都有向前跳转和向后跳转的相对转移指令。
那么@F向前跳的话,@B就是向后跳,这里的前和后的概念一定要弄清楚。
CALL指令执行时,是将此指令的下一条指令地址入栈(在执行该调用指令时,首先将IP的内容入栈保护),那么不难理解
@@:
pop ebx
此次出栈的值应该就是@@位置的指令地址,那么我猜测sub ebx,offset @B的值应该是0

不知道对不对 希望有熟悉的朋友给予指正
#8
zklhp2010-04-29 19:11
以下是引用hb0zyj在2010-4-29 10:34:36的发言:

你别忽悠我了,往上移动offset@B是哪?

类比一下啊

@F 是下一个@@

那@B当然是上一个~
#9
你们都要疼我哦2010-04-29 22:28

call
pop
sub
组合用于自定位。
主要用于这个组合下面的一句代码的重定位

@@为标号, 在它前面 当然是@f , 在它后面 当然是@b ,这样理解比较顺畅。

call把返回地址压入栈中,即@@标号地址, POP弹出此地址到EBX,

offset @B 又取得@@标号地址,sub ebx,offset @B ,结果自然EBX为0,表示无须重定位。

要真正理解重定位的问题,需要知道sub ebx,offset @B 这句代码在编译后offset @B
就是固定的在设计时的地址,其他地址都是根据载入时可以变的,sub以后,ebx中就是差值, 这个组合下面通常也会有个需要重定位的OFFSET取的地址,用这个组合得到的差值ebx加上需要重定位的地址,就得到正确的地址。
喝多了,讲不太清楚,将就看吧。大概就这个意思。
#10
2010-04-30 11:42
还是举老罗的例子:
...
hDllkernel32 dd ?
...
call @F
@@:
pop ebx
sub ebx,offset@B
invoke _GetKernelBase,[esp]
mov [ebx+hDllkernel32],eax
eax中存放的是_GetKernelBase函数的返回值,需要存入[ebx+hDllkernel32]地址中,此处ebx不会是0,那么改写offset@B为多少?请大虾帮助分析
#11
2010-04-30 13:18
偶明白了,ebx-offset@B不是0,offset@B指的是标号@@在文件中的偏移,ebx+hDllkernel32-offset@B指的是字符hDllkernel32在内存中的地址
#12
你们都要疼我哦2010-04-30 15:29
唉 事实证明 偶还是挺有耐心的。

首先你要理解 为什么吃饱了撑的要用这3句代码组合?这3句以后,对什么东西有影响了?这个你不自己分析清楚 是搞不明白的。

call @F            ;不管是按照默认载入还是载入其他地址,这个都没问题,自己会修正
@@:                ;这个标号也会自己按照实际载入地址修正
pop ebx            ;不管是默认的还是改变的,弹出的都是正确的返回地址,即实际标号地址
sub ebx,offset@B   ;你要搞清楚 offset这个取地址,是在什么时候完成的,它早就完成了,而且是按照代码设计时的默认装载地址取的,自己不会修正,即它取到的地址,是按照默认载入时标号的地址。而ebx呢,是实际的标号地址,不管默认还是改变过的,ebx中都是正确的。那么这样一sub,ebx中就是差值了。
如果整段代码都是按照设计时的默认载入地址装载的,那么差值为0。
如果改变载入地址,ebx就是差值,用这个差值去修正代码中其他需要重定位的变量。

整个来说,就是用@@的地址,来计算出默认载入和当前载入地址的差值,放在ebx中,
然后用这个差值 去修正代码中需要重定位的变量地址。 这其中又会牵扯到变量地址何时初始化的问题。。。

看你下面的回帖,想必还是不明白,如果明白,你就不会说什么ebx不会是0了。
按照默认地址装载,自然是0, 如果改变载入地址,当然不为0了。

还是要基础啊  基础啊  你要是还不明白,那就彻底无语了。
#13
chengstone2010-04-30 15:50
同意楼上说的 基础非常重要
1