汇编指令CALL的硬编码E8 和 JMP 的硬编码E9 后面参数的计算方法

试验的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是一样的

在这里插入图片描述

下图是用计算器16进制计算出的结果截图

在这里插入图片描述

继续研究*******************************

下一条指令地址的获取方法

E8 这条指令固定 是 5个字节组成, 当前这条E8指令的地址加5个字节就是下一条指令的地址
下一条指令地址=当前E8指令地址+5
下一条指令地址=00476318+5
下一条指令地址=0047631D

在这里插入图片描述

硬编码的公式就可以修改成为如下

X=真正要跳转的地址-(E8这条指令的地址+5)
X=047163B-(0476318+5)

注意

E8这条指令的地址是 ImageBuffer拉伸后的地址,而且是系统加载到内存运行时的虚拟地址
要计算ImageBase +E8所在的偏移地址
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值