zoukankan      html  css  js  c++  java
  • 学习:跳转指令

    JZ/JE指令:根据Z标志位进行跳转

    JZ和JE相同(shark恒老师说的,我就记录下,但是他也说过不是完全相同)

    1、直接定位到一个存在je跳转的地址,然后发现是存在跳转的,如图

    上图的Z标志位为1,所以会进行跳转,但是如果修改Z标志位为0则不会,如图

    同时JE和JZ也相同


    JNZ/JNE指令:根据Z标志位进行跳转

    同样是根据Z标志位进行跳转,但是是相反的,当Z标志位为0的时候进行跳转,当Z标志位为1的时候不跳转

    1、修改当前地址的汇编指令为cmp eax,ecx,然后下个地址再修改为jnz 0040101D
    2、修改eax的寄存器的值为00000001,ecx的寄存器的值为00000000
    3、单步步过

    cmp计算的结果不为0,所以Z标志位同样不为1,所以JNZ/JEZ会进行跳转,因为跟JE/JZ是相反判断的


    JMP指令:无条件跳转,不会受标志位的影响

    下面两张图能够发现,无论Z标志位是否为1 都会进行跳转


    JS和JNS指令:根据S标志位进行判断是否跳转

    JS和JNS都是根据S标志位进行判断的,只是是否跳转是判断相反S标志位

    1、修改当前地址的汇编指令为cmp eax,ecx,然后下个地址再修改为js 0040101D
    2、修改eax的寄存器的值为00000001,ecx的寄存器的值为00000000
    3、单步步过

    发现S标志位为0,不会进行跳转,原因十六进制00000001减去十六进制00000000,结果是个正数所以S标志位为0,而JS是当S标志位为0的时候不跳转,当S标志位为1的时候进行跳转

    JNS就是反一下,当S标志位为0的时候跳转,为1的时候不跳转


    JP和JPZ指令:根据P标志位进行判断是否跳转

    JP和JNP都是根据S标志位进行判断的,只是是否跳转是判断相反P标志位

    这里需要记录下JP和JPE是相同的,JNP和JPO是相同的

    1、修改当前地址的汇编指令为cmp eax,ecx,然后下个地址再修改为jp 0040101D
    2、修改eax的寄存器的值为00000001,ecx的寄存器的值为00000000
    3、单步步过

    发现不会进行跳转,原因是P标志位是奇偶标志位,根据二进制数中的1的个数进行判断的,cmp eax ecx结果是00000001,转换为二进制那么就是0001,1的个数为奇数那么P标志位就为0,那么也就不跳转了

    JNP就是反一下,当P标志位为0的时候跳转,为1的时候不跳转


    JO和JNO指令:根据O标志位进行判断

    1、修改当前地址的汇编指令为add eax,ecx,然后下个地址再修改为jo 0040101D
    2、修改eax的寄存器的值为7FFFFFF,ecx的寄存器的值为00000001
    3、单步步过

    O标志位当溢出的时候7FFFFFFF + 0x1 为 80000000 变成有符号位的最小整数,自然O标志位为1,JO指令当O标志位为1的时候则进行跳转

    JNO则相反,当O标志位为0的时候则不进行跳转


    JB和JNB指令:当cmp指令第一个操作数小于第二个操作数的时候则进行跳转

    1、修改当前地址的汇编指令为cmp eax,ecx,然后下个地址再修改为jb 0040101D
    2、修改eax的寄存器的值为00000000,ecx的寄存器的值为00000001
    3、单步步过

    原因是eax小于ecx,C标志位为1,所以进行跳转

    当C标志位改为0的时候,则不进行跳转

    JNB则相反,当C标志位为0的时候,进行跳转,否则不跳转


    JBE和JNBE指令:当cmp指令第一个操作数小于等于第二个操作数的时候则进行跳转,并且受标志位C和Z的影响

    发现C标志位为0 但是Z标志位为1 ,则进行跳转

    JNBE则相反,JNBE跟JA相同

    把C标志位置为0,Z标志位置为0,发现能够进行跳转


    JL指令:根据S标志位进行判断是否跳转,并且计算的是有符号位之间的运算

    1、修改当前地址的汇编指令为cmp eax,ecx,然后下个地址再修改为jl 0040101D
    2、修改eax的寄存器的值为00000000,ecx的寄存器的值为00000001
    3、单步步过

    发现S标志位为1,因为cmp指令 结果为十进制0-1 为 -1,是一个负数 所以S标志位为1

    可以再把eax修改为FFFFFFF6,那么十进制就为-10,然后重新定位EIP,再进行单步步过

    可以发现S标志位没变化,还是为1,那么也可以证实了计算的是有符号位之间的运算

    JL和JB指令之间的区别:http://bbs3.driverdevelop.com/read.php?tid=106427

  • 相关阅读:
    GhostBSD 3.0RC3,基于GNOME的FreeBSD
    Nagios 3.4.3 发布,企业级监控系统
    Jolokia 1.0.6 发布, JMX远程访问方法
    微软希望开发人员不要使 WebKit 成为新版 IE6
    Kwort Linux 3.5 正式版发布
    EJDB 1.0.24 发布,嵌入式 JSON 数据库引擎
    Pale Moon 15.3 Firefox“苍月”优化版发布
    Galera Load Balancer 0.8.1 发布
    SmartSVN V7.5 正式发布
    PostgresQL建立索引如何避免写数据锁定
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12052612.html
Copyright © 2011-2022 走看看