自学内容网 自学内容网

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的所有数字的和

 可以看到还原成功


原文地址:https://blog.csdn.net/qq_37454479/article/details/142598133

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!