全局变量:
全局变量在汇编中以mov eax,dword ptr ds:[0xXXXXXXXX]
的形式表现, 在一个立即数地址中存储.
在IDA中表现为dword_XXXXXXXX
局部变量:
局部变量在汇编中以mov eax,dword ptr ds:[EBP-X]
的形式, 存储在子程序的栈中.
在IDA中表现为var_X
自增自减
取模
普通if else
ida中的图形化表示
可以看到明显的两个分支只能执行其中一个
嵌套if else
for循环由四部分组成:初始化 比较 执行代码 递增或递减
, 汇编中分辨这四个模块可以快速判断出是一个for循环代码
在IDA中视图体现为:
while循环类似for循环, 仅少了递增递减的部分 : 初始化 比较 执行代码 再次比较
switch在反汇编中的体现分为两类if样式 跳转表样式
if样式
if样式下, switch语句被视为与if语句相同
跳转表样式
当switch语句的case过多时, 编译器进行了优化生成了一张跳转表
在IDA中体现为:
可以看到多个代码块共用一个jmp, 通过下标进行跳转, 这样可以节省字节空间
数组的格式比较简单, 类似[ebp-x+ecx*4]
,[ebp-x]可以理解为数组首地址, ecx代表数组元素的位置, 4代表每个元素的宽度, 就像查数一样
上图是一份C代码例子,下面是汇编中的体现
可以看到结构体类似数组, 原理都是通过首地址进行成员的访问, 只是结构体的成员宽度不一定相同,因此在访问时不像数组有固定的格式
链表节点指向另一个链表的首地址
由main函数调用的唯一子过程中发现的主要代码结构是什么?
main函数只调用了一个401000, 进去查看汇编
位于0x40105F的子过程是什么?
这个程序的目的是什么?
程序在入口时首先判断网络状态, 分支结构下执行了同一个函数sub_40105F
也就是printf
所以整个样本的功能就是判断网络连接状态后进行打印
main函数调用的第一个子过程执行了什么操作?
位于0x40117F的子过程是什么?
被main函数调用的第二个子过程做了什么?
在这个子过程中使用了什么类型的代码结构?
在这个程序中有任何基于网络的指示吗?
这个恶意代码的目的是什么?
比较在main函数与实验6-2的main函数的调用。从main中调用的新的函数是什么?
这个新的函数使用的参数是什么?
这个函数包含的主要代码结构是什么?
这个函数能够做什么?
在这个恶意代码中有什么本地特征吗?
这个恶意代码的目的是什么?
在实验6-3和6-4的main函数中的调用之间的区别是什么?
什么新的代码结构已经被添加到main中?
这个实验的解析HTML的函数和前面实验中的那些有什么区别?
这个程序会运行多久?(假设它已经连接到互联网。)
在这个恶意代码中有什么新的基于网络的迹象吗?
这个恶意代码的目的是什么?
int
a
=
0
;
a
+
+
;
/
a
-
-
;
mov [ebp
-
4
],
0
mov eax,[ebp
-
4
]
add eax,
1
/
sub eax,
1
mov [ebp
-
4
],eax
int
a
=
0
;
a
+
+
;
/
a
-
-
;
mov [ebp
-
4
],
0
mov eax,[ebp
-
4
]
add eax,
1
/
sub eax,
1
mov [ebp
-
4
],eax
int
a
=
10
;
int
b
=
0
;
b
=
a
%
3
;
mov [ebp
-
4
],
0xA
mov [ebp
-
8
],
0
mov eax,[ebp
-
4
]
/
/
将被除数存到eax中
cdq
mov ecx,
3
/
/
将除数存到ecx中
idiv ecx
mov [ebp
-
8
],edx
/
/
结果会存到edx中
int
a
=
10
;
int
b
=
0
;
b
=
a
%
3
;
mov [ebp
-
4
],
0xA
mov [ebp
-
8
],
0
mov eax,[ebp
-
4
]
/
/
将被除数存到eax中
cdq
mov ecx,
3
/
/
将除数存到ecx中
idiv ecx
mov [ebp
-
8
],edx
/
/
结果会存到edx中
int
x
=
1
, y
=
2
;
if
(x
=
=
y){
code1
}
else
{
code2
}
mov [ebp
-
4
],
1
mov [ebp
-
8
],
2
mov eax,[ebp
-
4
]
cmp
eax,[ebp
-
8
]
jnz code2
/
/
else
code1
/
/
if
jmp xxx
/
/
后续代码 可以看到两段代码只能有其中一段被执行,因此这个jmp是关键
int
x
=
1
, y
=
2
;
if
(x
=
=
y){
code1
}
else
{
code2
}
mov [ebp
-
4
],
1
mov [ebp
-
8
],
2
mov eax,[ebp
-
4
]
cmp
eax,[ebp
-
8
]
jnz code2
/
/
else
code1
/
/
if
jmp xxx
/
/
后续代码 可以看到两段代码只能有其中一段被执行,因此这个jmp是关键
int
x
=
0
,y
=
1
,z
=
2
;
if
(x
=
=
y){
if
(z
=
=
0
){
code1
}
else
{
code2
}
}
else
{
if
(z
=
=
0
){
code3
}
else
{
code4
}
}
mov [ebp
-
4
],
0
mov [ebp
-
8
],
1
mov [ebp
-
c],
2
mov eax,[ebp
-
4
]
cmp
eax,[ebp
-
8
]
/
/
外层
if
jnz FLAG2
/
/
外层
else
cmp
eax,[ebp
-
c]
/
/
外层
if
-
>内层
if
jnz FLAG1
/
/
外层
if
-
>内层
else
code1
jmp XXX
/
/
跳出
FLAG1:code2
jmp xxx
FLAG2:
cmp
eax,[ebp
-
c]
/
/
外层
else
-
>内层
if
jnz code4
/
/
外层
else
-
>内层
else
code3
int
x
=
0
,y
=
1
,z
=
2
;
if
(x
=
=
y){
if
(z
=
=
0
){
code1
}
else
{
code2
}
}
else
{
if
(z
=
=
0
){
code3
}
else
{
code4
}
}
mov [ebp
-
4
],
0
mov [ebp
-
8
],
1
mov [ebp
-
c],
2
mov eax,[ebp
-
4
]
cmp
eax,[ebp
-
8
]
/
/
外层
if
jnz FLAG2
/
/
外层
else
cmp
eax,[ebp
-
c]
/
/
外层
if
-
>内层
if
jnz FLAG1
/
/
外层
if
-
>内层
else
code1
jmp XXX
/
/
跳出
FLAG1:code2
jmp xxx
FLAG2:
cmp
eax,[ebp
-
c]
/
/
外层
else
-
>内层
if
jnz code4
/
/
外层
else
-
>内层
else
code3
for
(
int
i
=
0
;i<
100
;i
+
+
){
code1
}
code2
mov [ebp
-
4
],
0
/
/
初始化
jmp FLAG1
/
/
比较
FLAG2:mov eax,[ebp
-
4
]
/
/
递增
add eax,
1
mov [ebp
-
4
],eax
FLAG1:
cmp
[ebp
-
4
],
0x64
/
/
比较
jge code2
/
/
跳出循环
code1
/
/
执行代码
jmp FLAG2
/
/
递增
for
(
int
i
=
0
;i<
100
;i
+
+
){
code1
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课