c++反汇编逆向还原代码do while循环的实现
涉及到的汇编指令mov、lea、cmp、jle、push
一、汇编
汇编代码

涉及到的指令
mov :将源操作数复制到目的操作数
lea :与mov类似
mov a,b 表示将b赋值给a 若是 mov a,[b] 这是将b的地址赋值给a,相当于指针
cmp :比较
jle : jle 前面<=后面 翻译 if(a>b){}else{}
push:压栈 这里是 将ebp_a的地址给eax,然后再push eax
把eax压入堆栈,意味着加下来会有操作改变eax
看到后面push的%d以及call j_scanf_s方法
可以猜到 把输入的数赋值给eax,也就是ebp_a的指针,即输入一个数赋值给ebp_a
这些指令的详情解释可以看本笔记专栏的关于这些指令的介绍文章
点我跳转——c++反汇编逆向还原指令jge jg jle jl jne je
二、代码还原
2.1循环类型判断

跟上面的图片一样是绿色的箭头指向本身的就是do while 循环
2.2 汇编代码还原
汇编

原原本本按照汇编还原代码
#include<iostream>
using namespace std;
int main(){
	int ebp_a=0;
	int ebp_sum=0;
	int eax;
	scanf("%d",&ebp_a);
	do{
		eax=ebp_sum;
		eax=eax+ebp_a;
		ebp_sum=eax;
		int ecx=ebp_a;
		ecx=ecx+1;
		ebp_a=ecx;
	}while(ebp_a<=0xa);
	printf("%d",ebp_sum);
	return 0;
}正常写代码的思路还原的代码
#include<iostream>
using namespace std;
int main(){
	int ebp_a=0;
	int ebp_sum=0;
	scanf("%d",&ebp_a);
	do{	
		ebp_sum+=ebp_a;
		ebp_a++;
	}while(ebp_a<=0xa);
	printf("%d",ebp_sum);
	return 0;
}代码运行结果

三、源代码
源代码意思:输入一个数a,输出a-10所有数的和
#include<iostream>
using namespace std;
int main()
{
	int a = 0;
	int sum = 0;
	scanf_s("%d", &a);
	do {
		sum += a++;
	} while (a <= 10);
	printf("%d", sum);
	return 0;
}
源代码运行结果

可以看到还原的效果和源代码一样,还原成功



















