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;
}
源代码运行结果
可以看到还原的效果和源代码一样,还原成功