汇编指令CALL的硬编码E8 和 JMP 的硬编码E9 后面参数的计算方法
参考博客:https://blog.csdn.net/lygl35/article/details/114059915
试验的C函数代码如下:
#include <stdio.h>
void function()
{
printf("hello");
}
int main(int argc,char* argv[])
{
function();
return 0;
}
反汇编后的代码如下
call 硬编码是E8 , 但是后面的 1E B3 FF FF 是怎么计算出来的呢?
E8 后面的硬编码计算公式如下
假设我们需要获得E8 后面的硬编码为X
X=真正要跳转的地址-E8这条指令的下一行地址
X=047163Bh-0047631D
X=FF FF B3 1E
转换一下 低位在前高位在后就获得了硬编码 1E B3 FF FF
JMP 硬编码E9 后面的参数计算方法和CALL是一样的
4764A0-471640=4E60
继续研究
下一条指令地址的获取方法
E8 这条指令固定 是 5个字节组成, 当前这条E8指令的地址加5个字节就是下一条指令的地址
下一条指令地址=当前E8指令地址+5
下一条指令地址=00476318+5
下一条指令地址=0047631D
硬编码的公式就可以修改成为如下
X=真正要跳转的地址-(E8这条指令的地址+5)
X=047163B-(0476318+5)
注意
E8这条指令的地址是 ImageBuffer拉伸后的地址,而且是系统加载到内存运行时的虚拟地址
要计算ImageBase +E8所在的偏移地址