汇编指令学习总结

更新时间:2023-11-10 02:37:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,和大家一起把它们弄清楚. 首先看看:状态寄存器(即标志寄存器)

PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成, 如下所示:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

OF DF IF TF SF ZF AF PF CF 条件码:

①OF(Overflow Flag)溢出标志,溢出时为1,否则置0.标明一个溢出了的计算,如:结构和目标不匹配.

②SF(Sign Flag)符号标志,结果为负时置1,否则置0. ③ZF(Zero Flag)零标志,运算结果为0时置1,否则置0.

④CF(Carry Flag)进位标志,进位时置1,否则置0.注意:Carry标志中存放计算后最右的位.

⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。

有进位时1,否则置0.

⑥PF(Parity Flag)奇偶标志.结果操作数中1的个数为偶数时置1,否则置0. 控制标志位:

⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。 ⑧IF(Interrupt Flag)中断标志。 ⑨TF(Trap Flag)陷井标志。

为举例方便说一下jnz和jz 测试条件 JZ ZF=1 JNZ ZF=0

即Jz=jump if zero (结果为0则设置ZF零标志为1,跳转) Jnz=jump if not zero 好,接着来看test和cmp

*******************************************************************************

test属于逻辑运算指令

功能: 执行BIT与BIT之间的逻辑运算

测试(两操作数作与运算,仅修改标志位,不回送结果).

Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。EST AX,BX 与 AND AX,BX 命令有相同效果 语法: TEST r/m,r/m/data

影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) 运用举例:

1.Test用来测试一个位,例如寄存器:

test eax, 100b; b后缀意为二进制

jnz ******; 如果eax右数第三个位为1,jnz将会跳转

我是这样想的,jnz跳转的条件是ZF=0,ZF=0意味着ZF(零标志)没被置位,即逻辑与结果为1.

2.Test的一个非常普遍的用法是用来测试一方寄存器是否为空: test ecx, ecx jz somewhere

如果ecx为零,设置ZF零标志为1,Jz跳转

*******************************************************************************

CMP属于算术运算指令

功能: 比较两个值(寄存器,内存,直接数值) 语法: CMP r/m,r/m/data 标志位: C,P,A,Z,O

CMP比较.(两操作数作减法,仅修改标志位,不回送结果).

cmp实际上是只设置标志不保存结构的减法,并设置Z-flag(零标志). 零标志很像carry,也是内部标志寄存器的一位. 例如:

Cmp eax, 2; 如果eax-2=0即eax=2就设置零标志为1 Jz ****; 如果设置了零标志就跳转

******************************************************************************* 我得出的结论

test逻辑与运算结果为零,就把ZF(零标志)置1; cmp 算术减法运算结果为零,就把ZF(零标志)置1.

TEST - Test For Bit Pattern //位测试指令

Usage: TEST dest,src //用法:TEST dest,src

Modifies flags: CF OF PF SF ZF (AF undefined) //受影响的标志位有:

//你要注意的是这一部位才对。你上面的指令test eax,eax后面跟着的是jnz指令,jnz指令作用于零标志位的,若零标志位不为零则跳,所以test eax,eax是测试eax是否为零的指令,若eax有数据,不管是什么数据(111也好,101也好),jnz都会跳。

//更新一下,若eax有数据,不管是111也好,222也好,只要他们两个操作数作逻辑与运算之后,结果不为零,则jnz都会跳。而jz则不跳。 CF //进位标志,主要作用于JC/JNC指令。 OF //溢出标志,主要作用于JO/JNO指令

PF //奇偶标志,主要作用于JP/JPE/JNP/JPO指令 SF //符号标志,主要作用于JS/JNS指令

ZF //零标志,主要作用于JZ/JE/JNZ/JNE指令

AF //辅助进位标志,不过未定义。

Performs a logical AND of the two operands updating the flags //执行两个操作数的逻辑与运算,并更新标志位。 register without saving the result.

//该操作只修改标志位,不保留运算结果值。

已经有经验的知道TEST指令是对寄存器或者说对两个操作数进行逻辑与,然后影响标志寄存器。

最常见的指令是TEST EAX,EAX, 但是如何逆向出TEST指令呢? 对我们新手来说正向经验不足是个难度。

开始的时候 我也不知道从何下手得到这 TEST指令, 我就随便看Object Pascal官方中文版的书,

然后反出来看, 于是渐渐的TEST指令就出来了。 而实际要逆出的指令是这一组, 不妨我们都逆逆看。

0040899C |. 8B1D 4CD24000 mov ebx, dword ptr [40D24C] ; NoPacker.0040D164

004089A2 |. 8B5B 18 mov ebx, dword ptr [ebx+18] 004089A5 |. 85DB test ebx, ebx

004089A7 |. 74 12 je short 004089BB

004089A9 |. A1 4CD24000 mov eax, dword ptr [40D24C]

004089AE |. E8 DDB9FFFF call ; [GetACP 004089B3 |. 3BD8 cmp ebx, eax

004089B5 |. 0F85 D2030000 jnz 00408D8D

004089BB |> BA 9CE94000 mov edx, 0040E99C

一、

(1)函数调用

00407CDC |. B8 FC7C4000 mov eax, 00407CFC ; ASCII \00407CE1 |. E8 8AFFFFFF call 00407C70

00407CE6 |. B8 087D4000 mov eax, 00407D08 ; ASCII \ld\

00407CEB |. E8 90FFFFFF call 00407C80

(2)另外一种形式的 如 MessageBox(0, PChar(varb), PChar(varb2), 0); 00407CBF |. 6A 00 push 0

00407CC1 |. 8B45 F8 mov eax, dword ptr [ebp-8] 00407CC4 |. E8 77BCFFFF call 00403940 00407CC9 |. 50 push eax

00407CCA |. 8B45 FC mov eax, dword ptr [ebp-4]

00407CCD |. E8 6EBCFFFF call 00403940

00407CD2 |. 50 push eax ; |Text

00407CD3 |. 6A 00 push 0 ; |hOwner = NULL

00407CD5 |. E8 8EC8FFFF call ; \\MessageBoxA

(3)两个整型参数 func(90, 90);

00407D3A |. BA 5A000000 mov edx, 5A 00407D3F |. B8 5A000000 mov eax, 5A 00407D44 |. E8 47FFFFFF call 00407C90

(4)将两个值相加再转为string tmpStr:=IntToStr(a + b); 00407CB8 |. 8D55 FC lea edx, dword ptr [ebp-4] 00407CBB |. 8D041E lea eax, dword ptr [esi+ebx] 00407CBE |. E8 01D6FFFF call 004052C4

(5)值相加tBuf := Integer('A'); tmpStr:=IntToStr(a + b + tBuf);

00407CB9 |. BB 41000000 mov ebx, 41

00407CBE |. 8D55 FC lea edx, dword ptr [ebp-4] 00407CC1 |. 8D0437 lea eax, dword ptr [edi+esi] 00407CC4 |. 03C3 add eax, ebx

00407CC6 |. E8 F9D5FFFF call 004052C4

(6)获取一个函数指针

00407CB9 |. A1 A0974000 mov eax, dword ptr [4097A0] 00407CBE |. A3 9C974000 mov dword ptr [40979C], eax

(7)来回传递 F := Func(P); Func(P) := F;

00407CB9 |. A1 A0974000 mov eax, dword ptr [4097A0] 00407CBE |. A3 9C974000 mov dword ptr [40979C], eax 00407CC3 |. A1 9C974000 mov eax, dword ptr [40979C] 00407CC8 |. A3 A0974000 mov dword ptr [4097A0], eax

(8) 相同的反汇编结果 @F := P; 和 F := Func(P);

00407CB9 |. A1 A0974000 mov eax, dword ptr [4097A0] 00407CBE |. A3 9C974000 mov dword ptr [40979C], eax

00407CCD |. A1 A0974000 mov eax, dword ptr [4097A0] 00407CD2 |. A3 9C974000 mov dword ptr [40979C], eax

P := @F; 和 Func(P) := F;也是相同的

(9)调用 N := F(N);

00407CDC |. A1 A4974000 mov eax, dword ptr [4097A4] 00407CE1 |. FF15 9C974000 call dword ptr [40979C]

00407CE7 |. A3 A4974000 mov dword ptr [4097A4], eax

(10) N := Func(P)(N);

00407CEC |. A1 A4974000 mov eax, dword ptr [4097A4] 00407CF1 |. FF15 A0974000 call dword ptr [4097A0]

00407CF7 |. A3 A4974000 mov dword ptr [4097A4], eax (11)

00407CB9 |. BB 03000000 mov ebx, 3 ; I := 3

00407CBE |. 8D55 FC lea edx, dword ptr [ebp-4] ;得到tmpStr地址 00407CC1 |. 8D0437 lea eax, dword ptr [edi+esi] ;edi+esi就是90+90 00407CC4 |. 03C3 add eax, ebx ; I + edi + esi值

00407CC6 |. E8 F9D5FFFF call 004052C4 ; 存储在tmpStr内 (12)

00407CB9 |. BB 03000000 mov ebx, 3 ;I := 3 00407CBE |. 43 inc ebx ;I := I+1;

(13)当不自动为变量初始化时Delphi会自己给变量初始化, 形态是这样的。 //一般不是自己手动的临时变量要么是作为输入参数要么是作为中转存储。 00407C9B |. 894D F8 mov dword ptr [ebp-8], ecx 00407C9E |. 894D F4 mov dword ptr [ebp-C], ecx 00407CA1 |. 8955 FC mov dword ptr [ebp-4], edx

(14)Delphi的临时栈空间是在每个函数的后面。 00407D1F 00 db 00

00407D20 . FFFFFFFF dd FFFFFFFF 00407D24 . 14000000 dd 00000014

00407D28 . 4D 69 63 72 6F 73 >ascii \00407D38 . 6C 61 6E 64 00 ascii \00407D3D 00 db 00 00407D3E 00 db 00 00407D3F 00 db 00

如这段, 它在00407D1F之前存在一个函数将引用此段内某临时变量。

(15) 一个逻辑表达式 Done := (I>=1) and (I<100); 00407CB6 |. 83FB 01 cmp ebx, 1 (1) 00407CB9 |. 7C 05 jl short 00407CC0 00407CBB |. 83FB 64 cmp ebx, 64 (100)

本文来源:https://www.bwwdw.com/article/7b9v.html

Top