Posted by
专栏系列逆向基础
01逆向基础 - 进制篇02逆向基础 - 数据宽度与逻辑运算03逆向基础 - 通用寄存器和内存读写04逆向基础 - 堆栈篇05逆向基础 - 标志寄存器06逆向基础 - 指针(二)07逆向基础 - 指针08逆向基础 - 汇编 switch 笔记 if else09逆向基础 - 跳转与比较指令正在阅读10逆向基础 - 堆栈图(重点)11逆向基础 - 反汇编分析 C 语言12逆向基础 - C 语言内联汇编和调用协定13逆向基础 - 汇编寻找 C 程序入口14逆向基础 - 汇编 C 语言类型15逆向基础 - 汇编全局和局部变量16逆向基础 - 汇编 C 语言间类型转换17逆向基础 - 汇编嵌套 if else18逆向基础 - 汇编比较三种循环19逆向基础 - 汇编一维数组20逆向基础 - 汇编二维数组位移和乘法21逆向基础 - 汇编结构体和内存对齐
JCC指令
cc 代表 condition code(状态码)
Jcc不是单个指令,它只是描述了跳转之前检查条件代码的跳转助记符
例如 JNE,在跳转之前检查条件代码
典型的情况是进行比较(设置CC),然后使用跳转助记符之一
X86ASM
CMP EAX,0
JNE XXXXX
条件代码也可以用AND、OR、XOR、加法、减法(当然也可以是CMP)等指令来设置
JCC指令用于改变EIP(CPU要读取的指令地址)
JMP指令
JMP指令:修改EIP的值
JMP指令只影响了EIP,不影响堆栈和其它通用寄存器
JMP 寄存器/立即数 相当于 MOV EIP,寄存器/立即数
CALL指令
CALL指令和JMP指令都会修改EIP的值
但CALL指令会将返回地址(CALL指令的下一条指令地址)压入堆栈
因此也会引起esp的变化
RET指令
call调用跳转后执行完相关代码完要返回到call的下一条指令时使用ret指令
ret指令相当于pop eip
比较指令
CMP指令
指令格式:CMP R/M,R/M/IMM
CMP指令只改变标志寄存器的值
该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结果并不保存到第一个操作数中
只是根据相减的结果来改变ZF零标志位的,当两个操作数相等的时候,零标志位置1
例:
X86ASM
MOV EAX,100
MOV EBX,200
CMP EAX,ECX
CMP AX,WORD PTR DS:[405000]
CMP AL,BYTE PTR DS:[405000]
CMP EAX,DWORD PTR DS:[405000]
TEST指令
指令格式:TEST R/M,R/M/IMM
该指令在一定程度上和CMP指令时类似的,两个数值进行与操作,结果不保存,但是会改变相应标志位
与的操作表项如下:
| 运算 | 结果 |
|---|---|
| 1 and 1 | 1 |
| 1 and 0 | 0 |
| 0 and 1 | 0 |
| 0 and 0 | 0 |
可以看到只要有任一操作数为0时,结果就为0
常见用法:用这个指令,可以确定某寄存器是否等于0
只有当eax=0时 eax and eax才会是0
所以
X86ASM
TEST EAX,EAX
观察ZF(零标志位)就可以判断EAX是否为0
JCC指令表
首先要明确一点,所有的判断跳转指令都是根据标志位来进行判断的
JCC 指令也只影响 EIP
| 指令 | 英文全称 | 含义 | 判断标志位 |
|---|---|---|---|
| JE, JZ | jump equal,jump zero | 结果为零则跳转(相等时跳转) | ZF=1 |
| JNE, JNZ | jump not equal,jump not zero | 结果不为零则跳转(不相等时跳转) | ZF=0 |
| JS | jump sign | 结果为负则跳转 | SF=1 |
| JNS | jump not sign | 结果为非负则跳转 | SF=0 |
| JP, JPE | jump parity,jump parity even | 结果中1的个数为偶数则跳转 | PF=1 |
| JNP, JPO | jump not parity,jump parity odd | 结果中1的个数为偶数则跳转 | PF=0 |
| JO | jump overflow | 结果溢出了则跳转 | OF=1 |
| JNO | jump not overflow | 结果没有溢出则跳转 | OF=0 |
| JB, JNAE | jump below,jump not above equal | 小于则跳转 (无符号数) | CF=1 |
| JNB, JAE | jump not below,jump above equal | 大于等于则跳转 (无符号数) | CF=0 |
| JBE, JNA | jump below equal,jump not above | 小于等于则跳转 (无符号数) | CF=1 or ZF=1 |
| JNBE, JA | jump not below equal,jump above | 大于则跳转(无符号数) | CF=0 and ZF=0 |
| JL, JNGE | jump less,jump not greater equal | 小于则跳转 (有符号数) | SF≠OF |
| JNL, JGE | jump not less,jump greater equal | 大于等于则跳转 (有符号数) | SF=OF |
| JLE, JNG | jump less equal,jump not greater | 小于等于则跳转 (有符号数) | ZF=1 or SF≠OF |
| JNLE, JG | jump not less equal,jump greater | 大于则跳转(有符号数) | ZF=0 and SF=OF |
推荐阅读
PVE 安装 (基于最新PVE8)及相关基础配置(换 Debian 源和 PVE 企业源)本文介绍 PVE 8 的安装及 Debian 源的更换和 PVE 源的更换
Fake Location 1.3.2.2 全功能解锁模块FakeLocation 1.3.2.2 全功能破解,来自52PoJie论坛
Fake Location 1.3.2.2专业版破解(虚拟定位软件)在 52Pojie 上看到的 Fake Location 的破解案例,虽然 APP 已经不能用了,但是破解参考价值还是很好的
OpenWRT 配置 AP 模式OpenWRT 配置 AP 模式
OpenWrt 进阶教程之无线中继配置指南OpenWrt进阶教程之无线中继配置指南
Android逆向 | 某麦网APP抢票接口加密参数分析及抢票工具编写Android逆向 | 某麦网APP抢票接口加密参数分析及抢票工具编写
OpenWRT 主路由模式和旁路由模式配置OpenWRT 主路由模式和旁路由模式配置
PVE 安装 OpenWRT (基于PVE 8)PVE 安装 OpenWRT(基于PVE 8.0
PVE 配置硬件直通(PCI,网卡,显卡,硬盘等) (基于 PVE 8)PVE 8 下配置显卡,硬盘,网卡,PCIE 等设备的硬件直通以提升性能。
什么是 1K,2K,4K,8K 分辨率?什么是 1K,2K,4K,8K 分辨率?
评论交流
暂无评论,欢迎分享您的见解
