反汇编逆向实例_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         printf("c>10&&c<100");
13     }
14     else
15     {
16         printf("c>10&&c<100");
17     }
18     return c;
19 }
20 void main()
21 {
22     function(1,2);
23 }

反汇编结果:

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

00E12FE0 push ebp

00E12FE1 mov ebp,esp

00E12FE3 sub esp,0CCh

00E12FE9 push ebx

00E12FEA push esi

00E12FEB push edi

00E12FEC lea edi,[ebp-0CCh]

00E12FF2 mov ecx,33h

00E12FF7 mov eax,0CCCCCCCCh

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

1   int c=a+b;

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

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

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

1 if(c>0&&c<10)

00E13007 cmp dword ptr [c],0

00E1300B jle function+4Ch (0E1302Ch)                  ;比较变量C是否大于等于0,

00E1300D cmp dword ptr [c],0Ah                             ;再次比较变量C是否小于等于0x0A(16进制)

00E13011 jge function+4Ch (0E1302Ch)

1 {
2      printf("c>0");

00E13013 mov esi,esp                                                   ;如果大于0,且小于等于0x0A(16进制)

00E13015 push offset string "c>0" (0E1573Ch)           ;则调用printf函数,输出字符"c>0",否则跳转到0x00e1302ch

00E1301A call dword ptr [__imp__printf (0E182B8h)]

00E13020 add esp,4

00E13023 cmp esi,esp

00E13025 call @ILT+315(__RTC_CheckEsp) (0E11140h)

00E1302A jmp function+88h (0E13068h)

1  {
2      printf("c>10&&c<100");

00E13038 mov esi,esp

00E1303A push offset string "c>10&&c<100" (0E157A0h)       ;如果大于0x0A(16进制) ,且小于等于0x64h(16进制)

00E1303F call dword ptr [__imp__printf (0E182B8h)]               ;则调用printf函数,输出字符"c>10&&c<100",否则跳转到0x00E13051h处

00E13045 add esp,4

00E13048 cmp esi,esp

00E1304A call @ILT+315(__RTC_CheckEsp) (0E11140h)

1  }    else

00E1304F jmp function+88h (0E13068h)

 {
     printf("c>10&&c<100");

00E13051 mov esi,esp                                                                         ;如果以上条件都不满足,直接调用printf函数,

00E13053 push offset string "c>10&&c<100" (0E157A0h)               ;这里需要注意的是,比较函数执行完会有一个jmp指令,,                                                                                                                 ; 如果jmp指令跳转的地址在下面则就是if else语句,                                                                                                                 ; 如果往上跳,则是while语句,do while语句

00E13058 call dword ptr [__imp__printf (0E182B8h)]

00E1305E add esp,4

00E13061 cmp esi,esp

00E13063 call @ILT+315(__RTC_CheckEsp) (0E11140h)

1    }
2     return c;

00E13068 mov eax,dword ptr [c]

}

00E1306B pop edi

00E1306C pop esi

00E1306D pop ebx

00E1306E add esp,0CCh

00E13074 cmp ebp,esp

00E13076 call @ILT+315(__RTC_CheckEsp) (0E11140h)

00E1307B mov esp,ebp

00E1307D pop ebp

00E1307E ret

该死的排版,麻烦死了

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

时间: 2024-11-12 18:06:34

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

反汇编逆向实例_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 "

反汇编逆向实例_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

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

反汇编逆向实例_简单函数调用 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