哪家做公司网站,东莞市镇街建设项目监理招标网站,企业营销型网站概念,什么是自建站c反汇编逆向还原代码for循环的实现#xff0c;for循环和while循环在逆向还原的区别 一、汇编 mov #xff1a;将源操作数复制到目的操作数 lea #xff1a;与mov类似 mov a#xff0c;b 表示将b赋值给a 若是 mov a#xff0c;[b] 这是将b的地址赋值给a#xff0c;相… c反汇编逆向还原代码for循环的实现for循环和while循环在逆向还原的区别 一、汇编 mov 将源操作数复制到目的操作数 lea 与mov类似 mov ab 表示将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 eax1 也就是自增1的代码所以我们可以将其判断为for循环 while循环和for循环在还原的时候其实可以说没有太大的区别原本是for循环的代码可以逆向还原成whilewhile也同理 2.2汇编代码还原 原原本本按照汇编还原代码 #includestdio.hint main()
{int ebp_sum0;int ebp_n0;scanf(%d,ebp_n);int ebp_i0;for(;ebp_iebp_n;){int eaxebp_sum;eaxeaxebp_i;ebp_sumeax;eaxebp_i;eaxeax1;ebp_ieax;}printf(%d,ebp_sum);return 0;
} 正常写代码的思路还原的代码(整理后的代码) #includestdio.hint main()
{int ebp_sum0;int ebp_n0;scanf(%d,ebp_n);for(int ebp_i0;ebp_iebp_n;ebp_i){ebp_sumebp_i;}printf(%d,ebp_sum);return 0;
} 运行结果 三、源代码 源代码的意思输入一个数字n输出1-n的所有数字的和 可以看到还原成功