以上有个问题:为什么同样的汇编指令JMP 12345678却对应不同的机器码呢?
首先,机器码E9表明这是一个近跳转(Near Jmp)
这里需要补充下相关知识:
JMP分3种:
①短跳转(Short Jmp,只能跳转到256字节的范围内),对应机器码:EB
②近跳转(Near Jmp,可跳至同一段范围内的地址),对应机器码:E9
③远跳转(Far Jmp,可跳至任意地址),对应机器码: EA
短跳转和近跳转指令中包含的操作数都是相对于(E)IP的偏移。
远跳转指令中包含的是目标的绝对地址。
所以短/近跳转会出现跳至同一目标的指令机器码不同,不仅会不同,而且应该不同。
而远跳转中包含的是绝对地址,因此转移到同一地址的指令机器码相同 。
至此,我们知道了跳转指令所对应的机器码根据E(IP)计算出来的,那到底是怎么计算的呢?
比如:
上图的第一条指令:01007568    - E9 0BE13311   JMP 12345678
此时的EIP=01007568
12345678- 01007568  =  1133E110 这里只是指向当前指令的EIP处,实际计算跳转地址要去掉当前指令的长度,当前的跳转指令需要5个字节,  1133E110  -5= 1133E10B
注意颠倒顺序,高位在后

原创文章,转载请注明出处:http://www.cnblogs.com/hongfei/

JMP地址公式推导的更多相关文章

  1. 机器码call和jmp地址的计算

    call和jmp都是跳转指令,但是call的同时会把pc地址压入堆栈,并且这两种方式都有远和近跳转.下面的分析不全,因为没有在网上找到足够的资料,个人创造这个情景还是有些困难. 1.例子中的call的 ...

  2. C++继承与派生(原理归纳)

    1.   C++继承与java不同,java遵循单继承,但java的接口为其不足做了很好的弥补了. C++则是灵活的多,为多继承.即一个C++类可以同时继承N个类的属性. 2. 对于继承方式 : 有三 ...

  3. WinDbg调试流程的学习及对TP反调试的探索

    基础知识推荐阅读<软件调试>的第十八章 内核调试引擎 我在里直接总结一下内核调试引擎的几个关键标志位,也是TP进行反调试检测的关键位. KdPitchDebugger : Boolean ...

  4. exploit writing tutorial 阅读笔记总结

    近日阅读Corelan Team编写的exploit writing tutorial系列,大致了解了一下原理,记了一些笔记.此系列文章有中文翻译版,在看雪论坛上发表. 英文版地址:https://w ...

  5. 于PsIsSystemThread无论是在线程系统线程标识获得

    我一直好奇一个进程的所有线程改变线程标志Terminated mov edi, edi ; IoIsSystemThread push ebp mov ebp, esp mov eax, [ebp+a ...

  6. 通过修改EIP寄存器实现远程注入

    功能:通过修改EIP寄存器实现32位程序的DLL注入(如果是64位,记得自己对应修改汇编代码部分) 原理: 挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,然后把相关的指令机器码和数据拷贝 ...

  7. 通过修改EIP寄存器实现32位程序的DLL注入

    功能:通过修改EIP寄存器实现32位程序的DLL注入 <如果是64位 记得自己对应修改汇编代码部分> 原理:挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,然后把相关的指令机器 ...

  8. 8088汇编跳转和PSW状态字寄存器

    DDD 8088 汇编跳转 日期:2003年6月12日  出处:嬴政天下整理收藏  作者:看雪  人气: 8735 8088 汇编跳转 一.状态寄存器 PSW(Program Flag)程序状态字寄存 ...

  9. 逆向破解之160个CrackMe —— 001

    CrackMe —— 001 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...

随机推荐

  1. IntellJ IDEA2017 springboot2.0.2中读取配置

    IDEA 路径 src\main\resources\application.properties 配置文件名称为 application.properties 默认的位置在classpath根目录下 ...

  2. 第21章:MongoDB-聚合操作--聚合管道--$geoNear

    ①$geoNear 使用“$geoNear”可以得到附近的坐标点. ②范例:准备测试数据

  3. i2c总线,核心,驱动详解

    Linux I2C驱动分析(一)----I2C架构和总线驱动 一.I2C总线原理 I2C是一种常用的串行总线,由串行数据线SDA 和串线时钟线SCL组成.I2C是一种多主机控制总线,它和USB总线不同 ...

  4. DDR中的命令

    (3) 列地址选择(CAS#): 选择器件内感兴趣的地址列 行地址选择(RAS#): 选择设备中感兴趣的地址行. (4)(precharge)预充电 DRAM读取具有破坏性,也就是说,在读操作中会破坏 ...

  5. 动态生成PictureBox控件,涉及:PictureBox控件和flowLayoutPanel面板

    一.概述 flowLayoutPanel面板是一系列控件的容器,有关详细的使用方法留待以后总结. 二.问题提出 问题提出:点击按钮,扫描指定文件夹并将其中的所有图片放在flowLayoutPanel面 ...

  6. (转)FIKKER和Nginx的反向代理服务功能对比评测报告

    转自:http://tieba.baidu.com/p/1268737304 针对高并发反向代理服务器 NGINX和FIKKER评测报告 测试硬件环境:服务端:CPU:E5200硬盘:SATA 133 ...

  7. Qt_模块简介

    Qt4 和 Qt5最大的区别之一就是底层架构有了修改.Qt5引入了模块化的概念,讲众多功能细分到几个模块之中.需要达到,用什么模块知道到哪个模块去寻找. Qt5模块分为Essentials Modul ...

  8. Maven中的配置文件

    <span style="padding:0px; margin:0px"><project xmlns="http://maven.apache.or ...

  9. [mysql] mysql 查询语句收集

    // 1. 筛选出当天的中奖名单            $where = " date_format(f_ctime,'%Y-%m-%d') = current_date()"; ...

  10. 用JavaScript写的动态表格

    实现的功能有Table表格添加,删除.输入,删除的全选,单行删除. HTML代码部分 <body> <form> <table border="1" ...