汇编指令记录
加减乘除影响FLAG标志位。如果结果为0则ZF 位置为1 ,je 和 jz 意思是一样的都是 zF位为1则跳转。
1 2 3 4 5
| ;0039FA88 18 23 44 58 CB 21 B0 D9 A4 FA 39 00 18 23 44 58 #DX?百9.#DX mov eax [esi+0x3010]; esi+0x3010=0x39FA88 则eax = 58 44 23 18 #小端模式 sub eax,0xB2A97556;0xAD1C9585
|
CMOV系列指令
作用:当传送条件满足时,指令把源值S复制到目的R。有些指令是“同义名”,即同一条机器指令的不同名字。
指令 |
英文原义 |
跳转条件 |
描述 |
cmove/cmovz S, R |
move if equal/zero |
ZF |
相等/零 |
cmovne/cmovnz S, R |
move if not equal/zero |
~ZF |
不等/非零 |
cmovs S, R |
move if sign |
SF |
负数 |
cmovns S, R |
move if not sign |
~SF |
非负数 |
cmovg/cmovnle S, R |
move if greater than |
~(SF ^ OF) & ~ZF |
大于(有符号>) |
cmovge/cmovnl S, R |
move if greater than or equal |
~(SF ^ OF) |
大于等于(有符号>=) |
cmovl/cmovnge S, R |
move if less |
SF ^ OF |
小于(有符号<) |
cmovle/cmovng S, R |
move if less than or equal |
(SF ^ OF) | ZF |
小于等于(有符号<=) |
cmova/cmovnbe S, R |
move if above |
~CF & ~ZF |
超过(无符号>) |
cmovae/cmovnb S, R |
move if above or equal |
~CF |
超过或相等(无符号>=) |
cmovb/cmovnae S, R |
move if below |
CF |
低于(无符号<) |
cmovbe/cmovna S, R |
move if below or equal |
CF | ZF |
低于或相等(无符号<=) |
SET指令相关
作用:每条指令根据条件码的某种组合,将一个字节设置为0或1。有些指令是“同义名”,即同一条机器指令的不同名字。
指令 |
英文原义 |
效果 |
设置条件 |
解释 |
sete/setz D |
set when equal/zero |
D = ZF |
相等/零 |
零比较好理解。相等是因为,如果前一个指令是CMP且两个数相等,则结果为0,ZF置位。 |
setne/setnz D |
set when not equal/zero |
D = ~ZF |
不等/非零 |
与sete/setz的思路相同。 |
sets D |
set when sign |
D = SF |
负数 |
当运算结果为负时成立。 |
setns D |
set when not sign |
D = ~SF |
非负数 |
当运算结果非负时成立。 |
setg/setnle D |
set when greater than / set when not less than or equal |
D = ~(SF ^ OF) & ~ZF |
大于(有符号>) |
如果前一指令为CMP且两(符号)数关系为大于,则减法结果仅有两种可能性:(1)不溢出,结果为正数,SF=0,OF=0;(2)溢出,结果为负数,SF=1,OF=1,即SF与OF相等。若两数相等,则SF=OF=0,仍需加上条件& ~ZF。 |
setge/setnl D |
set when greater than or equal / set when not less than |
D = ~(SF ^ OF) |
大于等于(有符号>=) |
从setg的条件中去掉结果不为0的要求就行。 |
setl/setnge D |
set when less / set when not greater than or equal |
D = SF ^ OF |
小于(有符号<) |
如果前一指令为CMP且两(符号)数关系为小于,则减法结果仅有两种可能性:(1)不溢出,结果为负数,SF=1,OF=0;(2)溢出,结果为正数,SF=0,OF=1,即SF与OF不等,且两数不等。不用特意加上两数相等的判断,因为此时SF=OF。 |
setle/setng D |
set when less than or equal / set when not greater than |
D = (SF ^ OF) | ZF |
小于等于(有符号<=) |
在setl的条件中加上两数相等的可能性,即| ZF。 |
seta/setnbe D |
set when above / set when not below or equal |
D = ~CF & ~ZF |
超过(无符号>) |
如果前一指令为CMP且两(无符号)数关系为大于,则必然有无符号减法结果不溢出(~CF)和减法结果不为0(~ZF)。 |
setae/setnb D |
set when above or equal / set when not below |
D = ~CF |
超过或相等(无符号>=) |
从seta的条件中去掉对结果不为0的约束即可。 |
setb/setnae D |
set when below / set when not above or equal |
D = CF |
低于(无符号<) |
如果前一指令为CMP且两(无符号)数关系为小于,则必然有无符号减法结果溢出。 |
setbe/setna D |
set when below or equal / set when not above |
D = CF | ZF |
低于或相等(无符号<=) |
在setb的条件中加上两数相等的可能性,即| ZF。 |
条件指令
有两类指令只根据运算结果设置条件码而不保存运算结果:CMP和TEST。
指令 |
影响的条件码 |
具体效果 |
TEST |
OF, SF, ZF, AF, CF, PF |
SF,ZF和PF根据两个操作数逻辑与的结果来设置。CF和OF清0,AF无定义。 |
CMP |
OF, SF, ZF, AF, CF, PF |
根据两个操作数的差结果来设置条件码(请注意,AT&T语法是第二个减第一个,Intel语法是第一个减第二个)。 |
调试器相关
对齐OD和IDA反汇编的地址
1 2
| #修改的是rebase base address new_start_address=OD_start_address-(IDA_start_address-IDA_base_address)
|
正向逆向结合
!a.empty() ==> a.empty()^1
IDA学习
IDA视图显示汇编地址
https://www.cnblogs.com/17bdw/p/7097465.html
栈
压栈后,ESP是减少的所以ESP+[参数],或者EBP-{参数}指向的是局部变量。fastcall,stdcall参数入栈方式,是从右往左,由子函数平栈。
参考文献
链接:https://www.jianshu.com/p/095a227184cc