给定以下 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
后跟 dword 操作数。如果您有mov
指令的地址,您可以简单地向前跳过一个字节并查看地址操作数,off_A
cmp esi, ...
被编码为81 FE
后跟一个双字操作数,所以在这里你可以跳过两个字节来查看操作数。
我不确定你在问什么。偏移量是地址。所以第一行代码是将地址移动off_9F6FBC
到esi。
如果您的意思是如何获取绝对地址(结合 PIC 等),那么这在反汇编时是不知道的。它仅在运行时已知,并且可以更改每次运行
MOV esi,立即编码有很多方法。根据您的汇编器和编译器,可能会使用它们中的任何一个。
如果您在不使用汇编程序助记符的情况下执行此操作,例如十六进制。您可以确定那里的偏移量:
db 0xBE; off_X: dd normal_offset