本文为本人在 大神论坛 逆向破解脱壳学习笔记之一,为本人对以往所学的回顾和总结,可能会有谬误之处,欢迎大家指出。
陆续将不断有笔记放出,希望能对想要入门的萌新有所帮助,一起进步
JCC指令
cc
代表 condition code(状态码)
Jcc不是单个指令,它只是描述了跳转之前检查条件代码的跳转助记符
例如JNE
,在跳转之前检查条件代码
典型的情况是进行比较(设置CC),然后使用跳转助记符之一
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
例:
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指令时类似的,两个数值进行与操作,结果不保存,但是会改变相应标志位
与的操作表项如下:
可以看到只要有任一操作数为0时,结果就为0
常见用法:用这个指令,可以确定某寄存器是否等于0
只有当eax=0时 eax and eax才会是0
所以
TEST EAX,EAX
观察ZF(零标志位)就可以判断EAX是否为0
JCC指令表
首先要明确一点,所有的判断跳转指令都是根据标志位来进行判断的
JCC指令也只影响EIP
本系列逆向脱壳基础学习都在下方链接中,欢迎下载并交流沟通
大神论坛 逆向脱壳分析基础学习笔记六 汇编跳转和比较指令 - 『学习资料区』 - 大神论坛 |脱壳破解|易语言|病毒分析|www.dslt.tech
版权声明:本文由 lyl610abc 原创,欢迎分享本文,转载请保留出处