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的所有数字的和
可以看到还原成功