if语句,if...else语句的分析

if语句的反汇编判断

  if语句的反汇编判断基本是围绕JCC指令的,如果想要有深刻的理解,可以自行练习JCC指令

  执行各类影响标志位的指令
  jxx xxxx
  1、案例一
  mov eax,dword ptr [ebp+8]        分析:cmp指令 影响标志位
  cmp eax,dword ptr [ebp+0Ch]         jle :小于或者等于就跳转到00401059
  jle 00401059

  2、案例二
  mov eax,dword ptr [ebp+8]        分析:cmp指令 影响标志位
  cmp eax,dword ptr [ebp+0Ch]         jl :小于则跳转
  jl 00401059

  3、案例三
  mov eax,dword ptr [ebp+8]       jge :大于或者等于则跳转
  cmp eax,dword ptr [ebp+0Ch]
  jge 00401059

  4、案例四
  mov eax,dword ptr [ebp+8]       jg :大于则跳转
  cmp eax,dword ptr [ebp+0Ch]
  jg 00401059

  仅列举少许,有兴趣可以尝试全部的JCC指令,以便加深理解

案例分析

  在分析if语句时,我们得先有一个整体概念,即在函数调用前,先分析大段,如下:

  函数调用处代码:

  push 5          分析:
  push 4          两个参数
  call 0040100f
  add esp,8

  分析第一个实例:

 1 00401030   push        ebp
 2 00401031   mov         ebp,esp
 3 00401033   sub         esp,40h
 4 00401036   push        ebx
 5 00401037   push        esi
 6 00401038   push        edi
 7 00401039   lea         edi,[ebp-40h]
 8 0040103C   mov         ecx,10h
 9 00401041   mov         eax,0CCCCCCCCh
10 00401046   rep stos    dword ptr [edi]
11 00401048   mov         eax,dword ptr [ebp+8]
12 0040104B   cmp         eax,dword ptr [ebp+0Ch]
13 0040104E   jle         00401059
14 00401050   mov         ecx,dword ptr [ebp+8]
15 00401053   mov         dword ptr [004225c4],ecx
16 00401059   pop         edi
17 0040105A   pop         esi
18 0040105B   pop         ebx
19 0040105C   mov         esp,ebp
20 0040105E   pop         ebp
21 0040105F   ret

  我在Excel中将其用颜色标注,上下两段颜色一样的,我们可以不用看,之前有过探究,开辟堆栈所进行的一系列操作,实际功能块就是中间紫色那块

        

  我们的分析过程可大致分为下面五个步骤:

  函数内部功能分析:

  1、分析参数:
  [ebp+8] : X [ebp+0Ch] :Y

  2、分析局部变量
  无

  3、分析全局变量
  mov dword ptr 004225c4,ecx

  4、功能分析
  mov eax,dword ptr [ebp+8]
  cmp eax,dword ptr [ebp+0Ch]

  将参数X存到到EAX中,然后比较EAX,与参数Y的大小
  如果X<=Y 那么跳转到00401059的位置

  否则,将X的值存储到全局变量中

  5、返回值分析
  无

  分析第二个实例:

  调用处代码:

  push 5
  push 4
  call 0040100f
  add esp,8

  函数内部:

 1 00401030   push        ebp
 2 00401031   mov         ebp,esp
 3 00401033   sub         esp,44h
 4 00401036   push        ebx
 5 00401037   push        esi
 6 00401038   push        edi
 7 00401039   lea         edi,[ebp-44h]
 8 0040103C   mov         ecx,11h
 9 00401041   mov         eax,0CCCCCCCCh
10 00401046   rep stos    dword ptr [edi]
11 00401048   mov         eax,[004225c4]
12 0040104D   mov         dword ptr [ebp-4],eax
13 00401050   mov         ecx,dword ptr [ebp+8]
14 00401053   cmp         ecx,dword ptr [ebp+0Ch]
15 00401056   jg          00401064
16 00401058   mov         edx,dword ptr [ebp+0Ch]
17 0040105B   add         edx,dword ptr [ebp-4]
18 0040105E   mov         dword ptr [004225c4],edx
19 00401064   pop         edi
20 00401065   pop         esi
21 00401066   pop         ebx
22 00401067   mov         esp,ebp
23 00401069   pop         ebp
24 0040106A   ret

  我还是在Excel中标注一下颜色:

        

  函数内部功能分析:

  1、分析参数:
  Y: ebp+8     Z: ebp+c

  2、分析局部变量
  A:ebp-4

  3、分析全局变量
  Global:dword ptr [004225c4],edx

  4、功能分析

  a、00401048 mov eax,[004225c4]
  0040104D mov dword ptr [ebp-4],eax
  A = Global

  b、00401050 mov ecx,dword ptr [ebp+8]
  00401053 cmp ecx,dword ptr [ebp+0Ch]
  参数Y与Z比较大小

  c、00401056 jg 00401064
  如果Y比Z大,则跳转至0x00401064,否则程序走下一步

  d、00401058 mov edx,dword ptr [ebp+0Ch]
  0040105B add edx,dword ptr [ebp-4]
  0040105E mov dword ptr [004225c4],edx
  到这一步,说明Y小于等于Z,将Z与A相加,并把相加的值赋给Global

  5、返回值分析
  无
  6、还原成C函数

1 int Global;
2 void function(int Z, int Y)
3 {
4     int A = Global;
5     if (Y <= Z)
6     {
7         Global = A + Z;
8     }
9 }

IF...ELSE...语句的反汇编判断:

  IF...ELSE...语句的反汇编判断:
  IF_BEGIN:
  先执行各类影响标志位的指令
  jxx ELSE_BEGIN
  ......
  IF_END:
  jmp END
  ELSE_BEGIN:
  ......
  ELSE_END:
  END:

  特点分析:

  1、如果不跳转,那么会执行到jmp处,jmp直接跳转到END处

  2、如果跳转,则会直接跳过jmp END处的代码,直接执行后面的代码

  总结:

  跳转执行一部分代码,不跳转执行另外一部分代码

  第一个jxx跳转的地址前面有一个jmp ,可以判断是if...else...语句

第一个案例分析

 1 004010B0   push        ebp
 2 004010B1   mov         ebp,esp
 3 004010B3   sub         esp,44h
 4 004010B6   push        ebx
 5 004010B7   push        esi
 6 004010B8   push        edi
 7 004010B9   lea         edi,[ebp-44h]
 8 004010BC   mov         ecx,11h
 9 004010C1   mov         eax,0CCCCCCCCh
10 004010C6   rep stos    dword ptr [edi]
11 004010C8   mov         eax,[004225c4]
12 004010CD   mov         dword ptr [ebp-4],eax
13 004010D0   mov         ecx,dword ptr [ebp+8]
14 004010D3   cmp         ecx,dword ptr [ebp+0Ch]
15 004010D6   jle         004010e6
16 004010D8   mov         edx,dword ptr [ebp+8]
17 004010DB   add         edx,dword ptr [ebp-4]
18 004010DE   mov         dword ptr [004225c4],edx
19 004010E4   jmp         004010f1
20 004010E6   mov         eax,dword ptr [ebp+0Ch]
21 004010E9   add         eax,dword ptr [ebp-4]
22 004010EC   mov         [004225c4],eax
23 004010F1   pop         edi
24 004010F2   pop         esi
25 004010F3   pop         ebx
26 004010F4   mov         esp,ebp
27 004010F6   pop         ebp
28 004010F7   ret

        

  函数内部功能分析:

  1、分析参数:
  [ebp+8] : X [ebp+0Ch] :Y

  2、分析局部变量
  [ebp-4] = eax = [004225c4]

  3、分析全局变量
  [004225c4] G

  4、功能分析

  a、004010C8 mov eax,[004225c4]
  004010CD mov dword ptr [ebp-4],eax
  Local = Global

  b、004010D0 mov ecx,dword ptr [ebp+8]
  004010D3 cmp ecx,dword ptr [ebp+0Ch]
  比较X与Y的大小

  c、如果Y<=X 那么执行
  004010E6 mov eax,dword ptr [ebp+0Ch] X
  004010E9 add eax,dword ptr [ebp-4] Local + X
  004010EC mov [004225c4],eax Global = Local + X

  d、如果Y>X 那么执行
  004010D8 mov edx,dword ptr [ebp+8] Y
  004010DB add edx,dword ptr [ebp-4] Local + Y
  004010DE mov dword ptr [004225c4],edx Global = Local + Y
  004010E4 jmp 004010f1

  5、返回值分析
  无

未完待续......

未完待续......

未完待续......

未完待续......

未完待续......

未完待续......

原文地址:https://www.cnblogs.com/Reverse-xiaoyu/p/11621191.html

时间: 2024-10-22 02:57:01

if语句,if...else语句的分析的相关文章

记录sql语句的执行记录,用于分析

原文:记录sql语句的执行记录,用于分析 SET STATISTICS PROFILE ONSET STATISTICS IO ONSET STATISTICS TIME ONGO --这之间是要执行的脚本select * from [UserTable]GO --这之间是要执行的脚本SET STATISTICS PROFILE OFFSET STATISTICS IO OFFSET STATISTICS TIME OFF 可以分析出cpu开销,IO开销,时间开销 备忘

【java开发】分支语句、循环语句学习

一.Java分支语句类型 if-else 语句 switch 关于if-esle语句可以拆分为三种 if语句 if(条件){语句块;} if-else语句if(条件语句){语句块;} if-else if语句if (条件语句1){语句块;}else if(条件语句2);{语句块2;}...else if(条件语句n){语句块n;} 关于switch语句 switch( 表达式){        case 表达式值1: 语句块1; break; .... case 表达式N: 语句块N; brea

if条件语句 for循环语句

(一)if语句 If语句是一个条件分支语句. C#中,空语句是合法的,他不做任何操作. 好的编码风格要求语句块中要有缩进. I f语句中if后面可以没有else,可以有多个else if,但只能最多有一个else! 例题: /*if语句的简单应用 收入和逃税问题 double money; Console.Write("月收入"); money = Convert.ToDouble(Console.ReadLine()); if (money > 3500) { Console.

python学习笔记二:if语句及循环语句,断点,模块,pyc

if语句 注意:语句块中的内容要强制缩进,否则出错.IndentationError,缩进错误 所有代码,如果是顶级的,必须顶格写,前面不能有空格 if - : - elif - : - else: - while语句 while -: - else: - for语句 for i in range(10)--i默认0,步长默认1,最大为9 for i in range (0,2,10)--从0开始,步长为2,最大为8 for  i   in range(-): - else: - break--

选择结构if语句和switch语句的区别

1.选择结构if语句格式及其使用 A:if语句的格式: if(比较表达式1) { 语句体1; }else if(比较表达式2) { 语句体2; }else if(比较表达式3) { 语句体3; } ... else { 语句体n+1; } B:执行流程: 首先计算比较表达式1看其返回值是true还是false, 如果是true,就执行语句体1,if语句结束. 如果是false,接着计算比较表达式2看其返回值是true还是false, 如果是true,就执行语句体2,if语句结束. 如果是fals

选择语句(分支语句)——if else

每晚必备的作业时间,今儿有点晚了,现在这样生活紧张而充实,感觉回到了幸福的学生时代,可摆在面前的现实在提醒自己时刻不能松懈……跑偏了转回正题,今儿学的分支语句不多就几句,可是用了差不多一整天的时间来理解,吃透和熟悉……语句分类:顺序语句,选择语句(分支语句),循环语句 选择(分支语句)if(){}if(){}else{} 二选一:若if成立,则不去走else,:若if不成立,肯定走else if(){}else if(){}else if(){}else{} 多选一若if成立,那其他的所有都不去

Swift流程控制之循环语句和判断语句详解

Swift提供了所有c类语言的控制流结构.包括for和while循环来执行一个任务多次:if和switch语句来执行确定的条件下不同的分支的代码:break和continue关键字能将运行流程转到你代码的另一个点上. 除了C语言传统的for-condition-increment循环,Swift加入了for-in循环,能更加容易的遍历arrays, dictionaries, ranges, strings等其他序列类型. Swift的switch语句也比C语言的要强大很多. Swift中swi

python基础:循环语句和判断语句

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------谢谢您的参考,如有疑问,欢迎交流 一. python语句块和缩进 缩进是Python语法的一部分:在python语句中,空格是用来区分块的,每一块的语句,缩进量(空格)应该是相同的 Python语言利用缩进表示语句块的开始和退出(Off-side规则),而非使用花括号或者某种关键字: 增加缩进表示语句块的开始,而减少缩进则表示语句块的退出. 在Python中,冒号(:)用来标识语

mysql中的if语句和while语句

一.if语法 if 条件 then -- SQL语句; else -- SQL语句; end if; 二.if使用 delimiter $$ -- 创建语句 create trigger my_tri after insert on orders for each row begin -- 获取表中的商品库存inv到变量@inv中 select inv from goods where id = new.g_id into @inv; -- 比较库存是否充足 if @inv < new.g_nu

SQL检索语句及过滤语句

首先推荐一款比较好用的数据库管理软件:navicat premium. 数据库中最重要的检索功能:SELECT语句 1.检索单个列:select 列名 from 表名: 2.检索多个列:select 列名1,列名2,...from 表名: 3.检索所有列:select * from 表名: 4.检索不同的行:select distinct 列名 from 表名:/*列中有重复值,只显示不同的值 5.检索限制行数:select 列名 from 表名 limit 数量:/*返回不多于几行的数据 6.