{ codeImgUrl : '', // >= v1.1.5 左侧图片设置,不配置使用 window.cnblogsConfig.blogAvatar aboutHtml : '', // 关于博主,不配置使用默认 copyrightHtml: '', // 版权声明,不配置使用默认 supportHtml : '', // 声援博主,不配置使用默认 }

经典定长指令-修改EIP

1、0x70~0x7F

  • EIP无法像通用寄存器那样用mov来修改,只能通过类似于jz,JNB,JNE JBE,call等的跳转指令来进行修改
  • 条件跳转,后跟一个字节立即数的偏移(有符号),共两个字节。
  • 如果条件成立,跳转到当前指令地址+当前指令长度+Ib
  • 最大值:向前跳转7F,向后跳80
0x80    JO
0x81    JNO
0x82    JB/JNA/JC
0x83    JNB/JAE/JNC
0x84    JZ/JE
0x85    JNZ/JNE
0x86    JBE/JNA  
0x87    JNBE/JA
0x88    JS    
0x89    JNS
0x8A    JP/JEP
0x8B    JNP/JPO
0x8C    JL/JNGE
0x8D    JNL/JGE
0x8E    JLE/JNG
0x8F    JNLE/JG

 二、0x0F 0x80 -0x0F 0x8F

  • 条件跳转,后跟四个字节立即数的便宜(有符号),共五个字节
  • 如果条件成立,跳转到 当前指令地址+当前指令长度+Id
  • 最大值:向前跳7FFFFFFF,向后跳80000000
0x0F 0x80    JO
0X0F 0X81  JNO
0X0F 0X82  JB/JNAE/JC
0X0F 0X83  JNB/JAE/JNC
0X0F 0X84  JZ/JE
0X0F 0X85  JNZ/JNE
0X0F 0X86  JBE/JNA
0X0F 0X87  JNAE/JA
0X0F 0X88  JS
0X0F 0X89  JNS
0X0F 0X8A  JP/JPE
0X0F 0X8B  JNP/JPO
0X0F 0X8C  JL/JNGE
0X0F 0X8D  JNL/JGE
0X0F 0X8E  JLE/JNG
0X0F 0X8F  JNLE/JG

三、其他指令

0XE0  LOOPNE/LOOPNZ Ib(Jb)  共2字节
ECX=ECX-1当ZF=0&&ECX!=0时跳转到 当前指令地址+当前指令长度+Ib

指令包含一个要添加到指令指针寄存器的相对偏移量(例如,JMP  (0 e9),循环)。  

 立即数

一个字节

双字,不管操作数大小属性如何

 

0XE1  LOOPE/LOOPZ Ib(Jb)  共2字节
ECX=ECX-1当ZF=1&&ECX!=0时跳转到 当前指令地址+当前指令长度+Ib
0xE2  LOOP Ib(Jb)  共2字节
ECX=ECX-1当ECX!=0时跳转到 当前指令地址+当前指令长度+Ib
0XE3  JrCXZ Ib(Jb)(在32位模式中,rCX为ECX)  共2字节
当ECX=0时跳转到当前指令地址+当前指令长度+Ib
(自己控制步长)
0xE8  CALL Id(Jd)  共5字节
CALL指令的下一条指令地址入栈后,跳转到 当前指令地址+当前指令长度+Id
0xE9 JMP Id(Jd)  共5字节
跳转到 当前指令地址+当前指令长度+Id

 

 

posted @ 2022-01-09 14:14  Mkd1R  阅读(300)  评论(0)    收藏  举报