汇编指令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所在的偏移地址

文章目录