反汇编逆向实例_while语句反汇编

反汇编逆向实例_while语句反汇编

                                                                                                by:比方

逆向反汇编第四章, while语句反汇编
示例代码:

 1 #include"stdio.h"
 2 int function(int a,int b)
 3 {
 4     int c=a+b;
 5     int i=0;
 6     while(i<50)
 7     {
 8         c=c+i;
 9     }
10     return c;
11 }
12 void main()
13 {
14     function(1,2);
15 } 

反汇编代码:

1 #include "stdio.h"
2
3 int function(int a,int b)
4
5 {

00AE1A40 push ebp

00AE1A41 mov ebp,esp

00AE1A43 sub esp,0D8h

00AE1A49 push ebx

00AE1A4A push esi

00AE1A4B push edi

00AE1A4C lea edi,[ebp-0D8h]

00AE1A52 mov ecx,36h

00AE1A57 mov eax,0CCCCCCCCh

00AE1A5C rep stos dword ptr es:[edi]    ;开始分配36个4字节空间,定位到edi,edi是来自[ebp-od8h],定位到缓冲区头部并初始化为CC,

1 int c=a+b;

00AE1A5E mov eax,dword ptr [a]              ;   变量A放入到eax,

00AE1A61 add eax,dword ptr [b]                ;   变量B加上个变量A ,结果放入到eax

00AE1A64 mov dword ptr [c],eax               ;   变量C等于变量A+变量B,等于 C = A+B;

1  int i=0;

00AE1A67 mov dword ptr [i],0                    ; 变量D等于0

1    while(i<50)    

00AE1A6E cmp dword ptr [i],32h                 ;比较变量D是否大于等于0x32h(16进制)

00AE1A72 jge function+3Fh (0AE1A7Fh)    ;如果不大于等于,则指向下面语句,否则跳0x00AE1A7F

1 {
2         c=c+i;

00AE1A74 mov eax,dword ptr [c]                     ;c = c+i

00AE1A77 add eax,dword ptr [i]

00AE1A7A mov dword ptr [c],eax

    }

00AE1A7D jmp function+2Eh (0AE1A6Eh)       如果这里是往下跳就可以还原成if,else语句

00AE1A7F mov eax,dword ptr [c]                     ;把c的结果放到eax中,eax是函数返回值,所以结果就是return c; 

}

00AE1A82 pop edi

00AE1A83 pop esi

00AE1A84 pop ebx

00AE1A85 mov esp,ebp

00AE1A87 pop ebp

00AE1A88 ret  


该死的排版,麻烦死了  

反汇编逆向实例_while语句反汇编

时间: 2024-11-01 23:48:01

反汇编逆向实例_while语句反汇编的相关文章

反汇编逆向实例_dowhile语句反汇编

反汇编逆向实例_dowhile语句反汇编 by:比方 示例代码如下: 1 #include"stdio.h" 2 int function(int a,int b) 3 { 4 int c=a+b; 5 int i=0; 6 do 7 { 8 c=c+i; 9 }while(i<50); 10 return c; 11 } 12 void main() 13 { 14 function(1,2); 15 } 反汇编代码 1 #include "stdio.h"

反汇编逆向实例_For语句反汇编

反汇编逆向实例_For语句反汇编 by:比方 逆向反汇编第二章,For语句反汇编 示例代码: 1 #include"stdio.h" 2 1.int function(int a,int b) 3 2.{ 4 3. int c=a+b; 5 4. int i; 6 5. for(i=0;i<50;i++) 7 6. { 8 7. c=c+i; 9 8. } 10 9. return c; 11 10.} 12 11.void main() 13 12.{ 14 13. funct

反汇编逆向实例_ifelse语句反汇编

反汇编逆向实例_ifelse语句反汇编 by:比方 逆向反汇编第五章,ifelse语句反汇编  by:比方示例代码: 1 #include"stdio.h" 2 int function(int a,int b) 3 { 4 int c=a+b; 5 6 if(c>0&&c<10) 7 { 8 printf("c>0"); 9 } 10 else if(c>10&&c<100) 11 { 12 print

反汇编逆向实例_简单函数调用

反汇编逆向实例_简单函数调用 by:比方 逆向反汇编第一章,基本函数调用 示例代码: 1 #include"stdio.h" 2 int function(int a,int b) 3 { 4 int c=a+b; 5 return c; 6 } 7 void main() 8 { 9 function(1,2); 10 getchar(); 11 } 反汇编结果: 1 #include "stdio.h" 2 3 int function(int a,int b)

自制反汇编逆向分析工具 迭代第五版本 (一)

这个版本添加了几个功能,分开几篇来写. 本篇是关于这样一个功能,显示选定的条件指令与其它条件分支的关系. 它们的关系分别在初版分支形态分布图,和第二版的汇编代码对应图同样展示. 红色表示被选中的目标 蓝色表示被选定的指令的执行位置之前,可能因为条件跳转而直接跳入到被选中的条件分支内(,忽略该条件判断). 绿色表示在被选中的条件分支内,因为其它条件跳转而直接离开目前分支的代码. 紫色表示在被选中的条件分支内,无条件跳转分支并且直接离开目前分支的代码. 浅紫色表示在被选中的条件分支内,无条件跳转分支

自制反汇编逆向分析工具 迭代第三版本

将一个函数的分支跳转逆向生成cpp文件,使逆向分析过程从分支跳转的分析中解放出来,工具首要的作用是应当解放生产力. 下面是效果图: 然后附上上面效果图对应的反汇编源代码和工具逆向生成的cpp文件. 有了这个逆向出来的文件,接下来的逆向工作有点像在做填空,但已经帮大忙. 不能上传附件,贴代码. 某比较大的函数的反汇编代码 QuartzCore`CA::Context::commit_transaction: -> <+0>: pushq %rbp <+1>: movq %rsp

自制反汇编逆向分析工具 迭代第四版本

上一个版本,本工具支持的第一个逆向策略,(对反汇编的函数体内的分支控制结构逆向生成cpp代码,)一直都可以正常工作,直到遇上了一个函数.这个使我的逆向策略算法失效的函数,主要的特点是它含有众多无条件跳转指令(,都是在函数体内的跳转). 为什么无条件跳转指令会使得我的第一个逆向算法失效,因为这些无条件跳转指令让函数的执行流变得不易于线性理解. 在一个没有反汇编出来的函数汇编代码中,如果无条件跳转指令很少,特殊地连一条无条件跳转指令也没有时,将汇编代码的执行流当作行文阅读,总可以找到一个特例让所有条

自制反汇编逆向分析工具 迭代第六版本 (五)

本工具从最初版的跳转分布图只为了更直观地分析反汇编代码的分支结构,第三版开始对直观图进行逆向分支代码的输出,第四版对分支输出策略的一些探索,第五版结合之前的探索进行改进.第六版在现在功能的基础上进行增强,利用第六版(一)的基本功能-直译,第六版(二)对条件分支增加条件判断翻译,以及改进在函数调用处附带备选参数参考. 第六版(三)将(一)和(二)组合在一起进行逆向代码输出. 第六版(四),在(三)的基础上增加对原子操作指令的逆向以及c++函数的逆向. 本篇是(五),对待c风格的函数符号调用的翻译,

自制反汇编逆向分析工具 迭代第六版本 (三)

本工具从最初版的跳转分布图只为了更直观地分析反汇编代码的分支结构,第三版开始对直观图进行逆向分支代码的输出,第四版对分支输出策略的一些探索,第五版结合之前的探索进行改进.第六版在现在功能的基础上进行增强,利用第六版(一)的基本功能-直译,第六版(二)对条件分支增加条件判断翻译,以及改进在函数调用处附带备选参数参考. 现在将第六版的(一)和(二)组合在一起进行逆向代码输出. 下面选了三个例子 void prepare_commit(CA::Transaction*) { // 0 pushq %r