逆向学习笔记

(8086CPU)

一、汇编语言中的大小写转换

A: 65 100 0001B
a: 97 110 0001B

B: 66 100 0010B
b:98 110 0010B
大写字母与小写字母间的ASCII码相差32,即可以使用与或的方式进行转换
变小写 0100 0001B || 0010 0000 B
变大写 0110 0001B && 1101 1111 B

二、常用寄存器

1.ax

AX寄存器称为累加器(Accumulator),使用时主要用于存放数据,如存放算术、逻辑运算中的操作数或结果。也可临时时用于存放地址。可以拆分为ah,al

2.bx

BX寄存器称为基址寄存器(BaseRegister),常用来存放访问存储器时的地址。可以拆分为bh,bl

3.cx

4.dx

5.si,di

6.bp,sp,ip

7.cs,ss,ds,es

三、标志寄存器

1. ZF标志(flag的第6位)

零标志位。(Zero Flag)
执行相关指令后,如果
结果为0,ZF=1
结果不为0,ZF=0

sub ax,ax
执行后,结果为0,则ZF=1
and ax,0
执行后,结果为0,则ZF=1
mov ax,1
or ax,0
执行后,结果为1,则ZF=0

2. PF标志(flag的第2位)

奇偶标志位。(parity flag)
指令执行后,结果中所有二进制位中1的个数
为偶数,PF=1
为奇数,PF=0

3. SF标志(flag的第7位)

符号标志位。(sign flag)
在我们将数据当作有符号数来运算时,可以得知结果的正负
在我们将数据当作无符号数来运算时,该位无意义
指令执行后,
结果为负,SF=1
结果为正,SF=0

4. CF标志(flag的第0位)

进位标志位。(无符号数)
最高位产生进位或借位,CF=1

5. OF标志

溢出标志位。(有符号数)
若结果超出表示范围,则成为溢出,OF=1,否则为0

6.AF标志

辅助进位标志
一个加法(减法)运算结果的低4位向高4位有进位(或借位)时,则AF=1,否则AF=0

7.TF 标志

跟踪标志。
该标志位为方便程序调试而设置的。若TF=1,CPU处于单步工作方式,
即在每条指令执行结束后,产生中断

8.IF标志

中断标志。
该标志位用来控制cpu是否响应可屏蔽中断。若IF=1则运行中断,否则禁止中断

9.DF方向标志

该标志位用来控制串处理指令的处理方向。若DF=1,则串处理过程中,自动递减,否则自动递增。

6. abc标志

7. sbb标志

8. cmp标志

四、汇编指令

1.cmp 指令

比较指令,相当于减法,不保存结果。对标志寄存器影响。
格式: CMP A,B
功能:两个操作数相减,A-B ,结果影响标志位。
主要用于条件转移指令,如:JZ/JE 当ZF=1时,跳转

2.MOVSX

符号扩展传送。
(操作数B所占空间必须小于操作数A)
MOVSX A,B

3.MOVZX

零扩展传送.
(操作数B所占空间必须小于操作数A)
MOV A,B

4.LEA

有效的地址传送指令
格式:LEA  A,B
将操作数B的有效地址传送到某个指定的寄存器,操作数A必须是寄存器
(32位系统上就是32位寄存器)

5.SUB

减法指令
格式:sub A,B A=A-B
功能:两个操作数相减,结果放在A中
影响 ZF标志位

6.JE/JZ

等于条件转移指令。
格式:JE/JZ 标号 //等于跳转
功能:ZF=1,跳转到指定地址执行。
根据标志ZF进行跳转

7.JNZ/JNZ

不等于转移指令。
格式:JNE/JNZ 标号
功能:ZF =0;转移至标号地址处

8.JMP/GOTO

无条件跳转指令。
格式:JMP A
不对标志位影响。

9.JL/JNGE

有符号小于/不大于等于转移指令
格式:JL/JNGE 标号地址
功能:小于/不大于等于 时转移到标号地址
JL 有符号 小于 则跳转 Jump if less
JNGE 有符号 不大于等于 则跳转 Jump if not greater or equal
SF =1; 跳转到标号地址执行

10.JLE/JNG

有符号小于等于/不大于转移指令
格式:JLE/JNG 标号
功能:小于等于或不大于时转到标号地址
JNG 有符号 不大于 则跳转 (JUMP if not greater)
JLE 有符号 小于等于 则跳转 (Jump if less or equal)
ZF =1 || SF != OF

11.JG/JNLE

有符号大于/不小于等于转移指令
格式: JG/JNLE 标号地址
功能:大于/不大于等于 时转到目标地址
JG 有符号 大于 则跳转 jumpo if greater
JNLE 有符号 不小于等于 则跳转 jump if not less or equal
ZF=0 && SF=OF (SF =1 && OF =1 两个数相减 结果为负 有溢出)(SF&&OF=0,两个数相减 结果位正 ,么有溢出)

12.JA/JNBE

无符号大于转移指令。
Above 高于
Below 低于
JA : 高于时 跳转 >
JNBE 不低于等于 跳转 !<=
CF=0 && ZF=0 则跳转

13.JNB/JAE/JNC

无符号大于等于
JNB : 不低于 跳转
JAE:高于等于 跳转
JNC:没有进位时 跳转 jump not carry //CF

14.JB/JNAE/JC

无符号小于转移指令
JB: 低于 跳转
JNAE:不高于等于时 跳转
JC: 进位时 跳转

15.JBE/JNA

无符号大于转移指令
JBE: 低于等于时 跳转
JNA: 不高于时 跳转

16.PUSH、POP、CALL、RETN

1.push入栈指令(压栈指令)

格式:PUSH 操作数
push ebp相当于:
sub esp,4 ,栈顶上升(内存中减少)
mov [esp],ebp

2.POP出栈指令(弹栈)

格式:POP 操作数
pop ebp 相当于:
mov ebp,[esp]
add esp,4 ;栈顶下降(内存中增加)
操作数不能为立即数

3.CALL

CALL 执行时,会push EIP
RETN 执行时,会pop EIP

17.inc,dec

自增,自减
不影响CF

18.movss

浮点指令
格式 movss xmm0, dword ptr ds:[]
功能:将一个浮点数放入 xmm0寄存器
格式 movss dword ptr ds:[], xmm0,
功能:将 xmm0寄存器中的数字放入内存

19.addss

浮点数加法
格式:addss xmm0,内存地址

20.subss

浮点数减法
格式:subss xmm0,内存地址

21.mulss

浮点数乘法
格式:mulss xmm0,内存地址

22.divss

浮点数除法
格式:divss xmm0,内存地址

23.cvtsi2sd

整数转换为浮点数

将内存地址转换为浮点数放入xmm0,
格式:cvtsi2sd xmm0,dword ptr ss:[ebp-4]

24.cvttss2si

浮点数转换为整数
格式:cvttss2si eax,dword ptr ss:[ebp-4]

25.SHR,SHL,SAR,SAL,ROR,ROL

1.逻辑位移指令

(1)SHR逻辑右移指令(Shift Right)

右移一位相当于整除2,用0补位
格式:shr eax,8

(2)SHL逻辑左移指令

左移一位,相当于乘2,用0补位。有可能溢出
格式:shl eax,2

2.算术位移指令

(1)SAR算术右移指令

右移一位相当于整除2,用符号位补位
格式:sar eax,8

(2)SAL算术左移指令,与SHL完全相同

左移一位,相当于乘2,用0位补位。有可能溢出
格式:sal eax,2

3.循环位移指令ROR,ROL

26.逻辑运算符

1.或运算

1)逻辑或(||)
if(a||b)
{
}
截断原理
2)按位或(|)or

2.与运算

1)逻辑与 (&&)
2)按位与(&)and

Test

命令将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。但是,Test命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。

3.非运算

1)逻辑取反(!)
SETE(SETZ)没见到过。取zf标志位的值保存
SETNE(SETNZ)取zf标志位的值取反后保存
2)按位取反(~)not

4.异或运算 xor

1)按位异或(C语言中^)
1 ^ 1=0;0 ^ 0=0;
1 ^ 0 =1, 0 ^ 1=1;

27.字符操作相关指令

1.strcmp分析

2. REPNE(REPNZ) SCASB 指令

1)SCASB 指令(scan string byte)
编译后 SCAS BYTE PTR ES:[EID]
相当于cmp byte ptr [edi] ,al

对标志位的影响相当于sub,同时修改edi
如果DF =0;inc edi
如果DF =1;dec edi
相似的还有 SCASW(word–ax) ,SCASD(dword–eax)

2)Repne(REPNZ) 指令 repeat not Zero
REPNE SCAS BYTE PTR ES:[EID]
当ecx!=0且zf=0时,重复执行后边的指令
每执行一次ecx-1
(ecx限制比较次数,用于数组。eax 存放查找的内容)

3.REPE(REPZ)和CMPSB、CMPSW、CMPSD

1)CMPS
字符串比较
cmps byte ptr [edi],byte ptr [esi]
cmps word ptr [edi],word ptr [esi]
cmps dword ptr [edi],dword ptr [esi]
对标志位的影响,相当于sub,同时修改edi和esi
如果df=0,则edi、esi按相对大小递增
如果df=1,则edi、esi按相对大小递减
2)REPE/REPZ
repe/repz cmpsb 当ecx!=0并且zf=1时,重复后面指令
每执行一次ecx -1
3)实例运用
字符串是否相等

28.STD/CLD(修改方向标志位)

STD 修改DF=1
CLD 修改DF=0

五、32位通用寄存器

1. EAX 可拆分 AX AH AL

2.EBX 可拆分 BX BH BL

3.ECX 可拆分 CX CH CL

4.EDX 可拆分 DX DH DL

六、栈寄存器

1.EBP 寄存器 栈底指针

EBP是一个特殊的寄存器,通过EBP+偏移量 ,可以发访问CALL的局部变量
低16位叫BP

2.ESP 寄存器 栈顶指针

ESP栈顶指针与EBP栈底指针构成一段空间。一般是本CALL局部变量的空间大小总和。
ESP指针配合EBP使用。

七、C

1.__declspec(naked)

功能:添加在函数头,表示该函数用汇编编写,不需要编译器添加任何代码

上一篇:shiro框架的优势是什么?


下一篇:C#(99):三、.NET 4.0基于任务的异步模式(TAP),推荐使用