汇编指令记录


加减乘除影响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