C&汇编基础-if语句
if语句逆向分析
- 源码
1 | void Function() |
- 反汇编
1 | 00401020 push ebp |
if 语句的表现形式:先用 cmp 指令比较影响标志位,然后再使用 JCC 指令跳转到程序结束的位置。这里的跳转指令 jge(jmp greater or equal) 表示 “大于等于就跳转”,与源码中的判断是相反的。
连续的 if 语句
- 源码
1 | void Function() |
- 反汇编
1 | 00401020 push ebp |
连续的 if 语句表现形式:如果不跳转就会执行完第一个判断,再执行第二个判断,如果跳转直接执行第二个判断。接着最后一个判断跳到程序结束位置。同样 JCC 判断指令和源码中的判断是相反的。
if…else…语句逆向分析
- 源码
1 | void Function() |
- 反汇编
1 | 00401020 push ebp |
if…else 语句的表现形式:如果不跳转就会执行到 jmp 处,jmp 直接跳转到程序结束位置;如果跳转,则会直接跳过 jmp 直接执行后面的代码。第一个 JCC 跳转的地址前面是一个 jmp,可以判断是 if…else 语句
if…else if…else逆向分析
- 源码
1 | void Function() |
- 反汇编
1 | 00401020 push ebp |
if…else if…else表现形式:当每个条件跳转指令要跳转的地址前面都有 jmp 指令,而且 jmp 指令跳转的地址都是一样的(程序结束地址),说明这是一个 else if 语句。如果某个分支没有条件判断,则为 else 部分。
if…else 嵌套语句
- 源码
1 | void Function() |
- 反汇编
1 | 00401020 push ebp |
if…else嵌套语句:其基本形式和 if…else 一样。if语句中内嵌的 else 会跳转到外面的 else 语句中。else语句中内嵌的 else 会跳到同一个地址(程序结束位置)
练习
正向代码
- 定义 4 个 int 类型的全局变量,分别是 g_x, g_y, g_z, g_r,使用 if..else.. 分支语句,将最大的值存储到 g_r 中
1 |
|
- 找出数组里面最大的值,并存储到全局变量中
1 |
|
- 将数组所有的元素相加,将结果存储到g_r中
1 |
|
- 俩俩比较数组的值,将最大的一个存储到数组的最后一个位置
1 |
|
代码还原练习
if 语句还原
- 反汇编
1 | 调用处代码: |
- 还原步骤
1 | 截取真正的程序代码: |
- 代码还原
1 |
|
if…else语句还原
- 反汇编
1 | 004010B0 push ebp |
- 还原步骤
1 | 程序代码: |
- 代码还原
1 |
|
if…else if…else 还原
反汇编
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46004010B0 push ebp
004010B1 mov ebp,esp
004010B3 sub esp,4Ch
004010B6 push ebx
004010B7 push esi
004010B8 push edi
004010B9 lea edi,[ebp-4Ch]
004010BC mov ecx,13h
004010C1 mov eax,0CCCCCCCCh
004010C6 rep stos dword ptr [edi]
004010C8 mov dword ptr [ebp-4],0
004010CF mov dword ptr [ebp-8],1
004010D6 mov dword ptr [ebp-0Ch],2
004010DD mov eax,dword ptr [ebp+8]
004010E0 cmp eax,dword ptr [ebp+0Ch]
004010E3 jg 004010f0
004010E5 mov ecx,dword ptr [ebp-8]
004010E8 sub ecx,1
004010EB mov dword ptr [ebp-4],ecx
004010EE jmp 00401123
004010F0 mov edx,dword ptr [ebp+0Ch]
004010F3 cmp edx,dword ptr [ebp+10h]
004010F6 jl 00401103
004010F8 mov eax,dword ptr [ebp-0Ch]
004010FB add eax,1
004010FE mov dword ptr [ebp-4],eax
00401101 jmp 00401123
00401103 mov ecx,dword ptr [ebp+8]
00401106 cmp ecx,dword ptr [ebp+10h]
00401109 jle 00401116
0040110B mov edx,dword ptr [ebp-8]
0040110E add edx,dword ptr [ebp-0Ch]
00401111 mov dword ptr [ebp-4],edx
00401114 jmp 00401123
00401116 mov eax,dword ptr [ebp-0Ch]
00401119 mov ecx,dword ptr [ebp-8]
0040111C lea edx,[ecx+eax-1]
00401120 mov dword ptr [ebp-4],edx
00401123 mov eax,dword ptr [ebp-4]
00401126 add eax,1
00401129 pop edi
0040112A pop esi
0040112B pop ebx
0040112C mov esp,ebp
0040112E pop ebp
0040112F ret还原步骤
1 | 程序代码: |
- 代码还原
1 |
|
- 本文标题:C&汇编基础-if语句
- 本文作者:9unk
- 创建时间:2021-04-01 14:18:28
- 本文链接:https://9unkk.github.io/2021/04/01/c-hui-bian-ji-chu-if-yu-ju/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!