上一篇: 键盘虚拟码和扫描码转换方法MapV

汇编立即数与机器码之间转换[CALL指令]

做代码注入器,用了CodeInject的代码,发现注入多个call的时候第一个call之后的call地址会发生错误,排查了一晚上才发现是这个asm转换代码的问题,在计算每一行代码机器码时,它没有把地址加上偏移到当前行的地址上。

CALL 指令地址、机器码和指令之间的关系

例如:805cc406 e87507f7ff call 8053cb80

 e8 : call
75 07 f7 ff:代表32位整数 ff f7 07 75 补码表示
也就是说调用一个函数,这个函数的位置距离当前代码的位置是ff f7 07 75
这一句代码5个字节,执行之后eip变为 805cc406+5 = 805cc40b
然后加上这个位置, 805cc40b + fff70775 = 18053cb80,因为是32位整数所以开头的1溢出了,被砍掉,最后变为 8053cb80

于是这一句就是 call 8053cb80 了

推荐阅读

最新发表