c++反汇编逆向还原指令add sub imul idiv cdq

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值