考虑下面的x86汇编指令:获取操作数从指令
mov esi, offset off_A
cmp esi, offset off_B
我怎么会在运行时得到的偏移量(第二个操作数)?这是情景:一个程序(注入在运行时的过程)替换了一些自己的偏移量,导致:
mov esi, offset off_X
cmp esi, offset off_Y
这个程序允许插件编写并加载通过它,但不公开替换地址。因此,考虑到上述说明存在的地址,我如何找到偏移量X和Y?
考虑下面的x86汇编指令:获取操作数从指令
mov esi, offset off_A
cmp esi, offset off_B
我怎么会在运行时得到的偏移量(第二个操作数)?这是情景:一个程序(注入在运行时的过程)替换了一些自己的偏移量,导致:
mov esi, offset off_X
cmp esi, offset off_Y
这个程序允许插件编写并加载通过它,但不公开替换地址。因此,考虑到上述说明存在的地址,我如何找到偏移量X和Y?
我不太明白这是对的,但是...
mov esi, ...
编码为BE
其次是双字操作数。如果你有mov
指令的地址你根本就跳到一个字节,看看地址操作数,off_A
cmp esi, ...
编码为81 FE
后跟一个双字操作数,所以在这里你可以跳过两个字节来看看操作数。
我不确定你在问什么。偏移量是的地址。因此,第一行代码将off_9F6FBC
的地址移动到esi。
如果你的意思是如何得到绝对地址(结合PIC等),那么在反汇编时就无法知道这个地址。它只是在运行时已知的,可以改变每运行
有很多方法可以对MOV esi进行编码,立即。取决于你的汇编器和编译器,它们中的任何一个都可能被使用。
如果不使用汇编器助记符,如十六进制。你可以在这里找到补偿点:
db 0xBE; off_X: dd normal_offset
不明确的道歉。我已经编辑了该问题以包含有关使用场景的详细信息。希望现在更清楚。 – shadeMe 2010-05-14 02:44:50