从指令中获取操作数

时间:2010-05-14 02:26:45

标签: pointers assembly x86 disassembly

给出以下x86汇编指令:

mov     esi, offset off_A
cmp     esi, offset off_B

如何在运行时获得偏移量(第二个操作数)?这是一个场景:一个程序(在运行时注入到进程中)用一些自己的偏移替换了偏移量,结果是:

mov     esi, offset off_X
cmp     esi, offset off_Y

此程序允许通过它编写和加载插件,但不会公开替换地址。因此,考虑到存在上述指令的地址,如何找到偏移量X和Y?

3 个答案:

答案 0 :(得分:1)

我不太明白这是为了什么,但是......

mov esi, ...编码为BE,后跟dword操作数。如果你有mov指令的地址,你可以简单地跳过一个字节并看到地址操作数,off_A

cmp esi, ...编码为81 FE后跟一个双字操作数,所以在这里你可以跳过两个字节来查看操作数。

答案 1 :(得分:0)

我不确定你在问什么。偏移地址。因此第一行代码将off_9F6FBC的地址移动到esi。

如果您的意思是如何获得绝对地址(与PIC等结合使用),则在拆卸时无法知道。它只在运行时才知道,可以改变每次运行

答案 2 :(得分:0)

有许多方法可以编码MOV esi,即时。根据您的汇编程序和编译器,可能会使用它们中的任何一个。

如果在不使用汇编程序助记符的情况下执行此操作,则以十六进制表示。你可以找出那里的偏移量:

db 0xBE; off_X: dd normal_offset