c++反汇编逆向还原——for循环(笔记)

 c++反汇编逆向还原代码for循环的实现,for循环和while循环在逆向还原的区别

一、汇编 

 mov :将源操作数复制到目的操作数

lea   :与mov类似

mov a,b   表示将b赋值给a  若是 mov a,[b] 这是将b的地址赋值给a,相当于指针

jmp  跳转指令

cmp :比较

jg    : jle  前面>后面    

push:压栈  这里是 将ebp_n的地址给eax,然后再push eax

把eax压入堆栈,意味着加下来会有操作改变eax

看到后面push的%d以及call j_scanf_s方法

可以猜到 把输入的数赋值给eax,也就是ebp_n的指针,即输入一个数赋值给ebp_n

这些指令的详情解释可以看本笔记专栏的关于这些指令的介绍文章

点我跳转——c++反汇编逆向还原指令jge jg jle jl jne je

二、代码还原 

2.1循环类型判断

可以看上面的汇编代码,向这样蓝色的线绕了一个圈又回到起点,可能是for循环,也可能是while循环,这就需要我们分析汇编代码判断,在上面的汇编代码图片左下角有循环每次

add eax,1   也就是自增1的代码,所以我们可以将其判断为for循环

while循环和for循环在还原的时候其实可以说没有太大的区别,原本是for循环的代码可以逆向还原成while,while也同理

 2.2汇编代码还原

原原本本按照汇编还原代码 

#include<stdio.h>

int main()
{
    int ebp_sum=0;
    int ebp_n=0;
    scanf("%d",&ebp_n);
    int ebp_i=0;
    for(;ebp_i<=ebp_n;){
		int eax=ebp_sum;
		eax=eax+ebp_i;
		ebp_sum=eax;
		eax=ebp_i;
		eax=eax+1;
		ebp_i=eax;
	}
	printf("%d",ebp_sum);
    return 0;
}

正常写代码的思路还原的代码(整理后的代码)

#include<stdio.h>

int main()
{
    int ebp_sum=0;
    int ebp_n=0;
    scanf("%d",&ebp_n);
    for(int ebp_i=0;ebp_i<=ebp_n;ebp_i++){
		ebp_sum+=ebp_i;
	}
	printf("%d",ebp_sum);
    return 0;
}

运行结果

 三、源代码 

源代码的意思:输入一个数字n,输出1-n的所有数字的和

 可以看到还原成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值