add 加法指令
比如add a,b 逆向还原为a=a+b;
sub 减法
比如sub a,b 逆向还原为a=a-b;
imul 乘法
比如sub a,b 逆向还原为a=a*b;
idiv 除法
比如sub a,b 逆向还原为a=a/b;
cdq 在x86 汇编中,用于扩展
eax
寄存器的符号位到edx
寄存器如果
eax
是负数,cdq
会将edx
设置为0xFFFFFFFF
(-1)果
eax
是非负数,cdq
会将edx
设置为0
通常在进行有符号整数除法(
idiv
)之前使用,以确保edx:eax
组合成一个 64 位的被除数,从而进行正确的除法运算
1.加法
mov eax, [ebp+a] 注意这里用了[]代表的是对指针进行操作
add eax, [ebp+b]还原
ebp_a=ebp_a+ebp_b;
2.减法
mov eax, [ebp+a]
sub eax, [ebp+b]还原
ebp_a=ebp_a*ebp_b;
3.乘法
mov eax, [ebp+a]
imul eax, [ebp+b]还原
ebp_a=ebp_a*ebp_b;
4.除法
mov eax, [ebp+a]
cdq
idiv [ebp+b]
push eax注意除法和取余的区别:都是idiv,但是除法前面有mov eax, [ebp+a]的话 后面还会push eax 而区域push的不是eax,而是push edx,作为余数
还原
ebp_a=ebp_a/ebp_b;
5.取余
mov eax, [ebp+a]
cdq
idiv [ebp+b]
push edx注意除法和取余的区别:都是idiv,但是除法前面有mov eax, [ebp+a]的话 后面还会push eax 而区域push的不是eax,而是push edx,作为余数
还原
ebp_a=ebp_a%ebp_b;
6.自增
mov eax, [ebp+i]
mov [ebp+var_E8], eax
mov ecx, [ebp+i]
add ecx, 1
mov [ebp+i], ecx
mov edx, [ebp+var_E8]还原 ebp_var_E8只是临时变量
int ecx=ebp_i;
ecx=ecx+1;
ebp_i=ecx;
7.自减
mov eax, [ebp+i]
mov [ebp+var_E8], eax
mov ecx, [ebp+i]
sub ecx, 1
mov [ebp+i], ecx
mov edx, [ebp+var_E8]还原 ebp_var_E8只是临时变量
int ecx=ebp_i;
ecx=ecx-1;
ebp_i=ecx;