提示: 作者被禁止或删除 内容自动屏蔽
唉 事实证明 偶还是挺有耐心的。
首先你要理解 为什么吃饱了撑的要用这3句代码组合?这3句以后,对什么东西有影响了?这个你不自己分析清楚 是搞不明白的。
call @F ;不管是按照默认载入还是载入其他地址,这个都没问题,自己会修正
@@: ;这个标号也会自己按照实际载入地址修正
pop ebx ;不管是默认的还是改变的,弹出的都是正确的返回地址,即实际标号地址
sub ebx,offset@B ;你要搞清楚 offset这个取地址,是在什么时候完成的,它早就完成了,而且是按照代码设计时的默认装载地址取的,自己不会修正,即它取到的地址,是按照默认载入时标号的地址。而ebx呢,是实际的标号地址,不管默认还是改变过的,ebx中都是正确的。那么这样一sub,ebx中就是差值了。
如果整段代码都是按照设计时的默认载入地址装载的,那么差值为0。
如果改变载入地址,ebx就是差值,用这个差值去修正代码中其他需要重定位的变量。
整个来说,就是用@@的地址,来计算出默认载入和当前载入地址的差值,放在ebx中,
然后用这个差值 去修正代码中需要重定位的变量地址。 这其中又会牵扯到变量地址何时初始化的问题。。。
看你下面的回帖,想必还是不明白,如果明白,你就不会说什么ebx不会是0了。
按照默认地址装载,自然是0, 如果改变载入地址,当然不为0了。
还是要基础啊 基础啊 你要是还不明白,那就彻底无语了。