识别汇编中的C代码结构
知识点
本章将通过讨论超过十种的不同的C代码结构来分析不同的汇编代码,帮助我们快速的提升形成恶意代码功能的高级视图的能力
全局变量|局部变量:全局变量可以被程序中任意函数访问和使用,局部变量只能在它被定义的函数中访问,在汇编代码中,全局变量通过内存地址引用,而局部变量通过栈地址引用。
识别if语句:有if语句一定存在跳转,但是有跳转不一定是if语句,if语句前有一个cmp
指令用于对比条件,之后会有一个jnz
指令来决定是否进行跳转。
for循环:for
循环是一个C变成使用的基本循环机制。for
循环总之有四个组件:初始化、比较、执行命令、变量的递增或递减。
while循环:while
循环与for
循环的汇编代码类似,但是区别在于while循环没有递增或者递减的代码。当一个cmp
指令返回一定的值后while
循环就会终止。
switch语句:switch
语句通常以两种方式被编译,使用if样式或者使用跳转表。跳转表是编译器对汇编代码做出的优化,一旦很多个cmp
指令的数据成等差数列,则编译器会把跳转地址与数据联系起来做成跳转表。
函数调用约定:函数调用约定决定了函数调用发生的方式,这些约定包含了参数被放在栈上或寄存器中的次序,以及是由调用者还是被调用者负责在函数执行完成时清理栈。以下时常见的三种调用约定;
cdecl
:这是最常用的调用约定之一,此约定下。参数从右至左被压入栈,当函数执行完成后由调用者清理栈。stdcall
:除了被调用者在函数执行完成之后清理栈之外,其他与cdecl
约定非常类似。fastcall
:fastcall调用约定跨编译器时变化最多,但是整体上的工作情况时类似的,在此约定中,前一些参数(典型的是前两个)被传到寄存器中,备用的寄存器是EDX和ECX(微软fastcall约定),如果需要的话,剩下的参数再以从右至左的次序被加载到栈上,通常使用fastcall比其他约定更高效。
反汇编数组:在汇编代码中,数组是通过一个基地址作为起始点来进行访问的,每一个元素的大小并不总是明显的,但是可以通过看这个数组是如何被索引的来进行判断。
识别结构体:结构体和数组类似,在IDA中可以使用热键T来建立结构体的识别。
课后练习
Lab6-1
在这个实验中,你将分析在文件Lab06-01.exe中发现的恶意代码。
问题
1.由main函数调用的唯一子过程中发现的主要代码结构是什么?
可以由IDA的图形模式很简单的看出这是一个if语句的结构
2.位于0x40105F的子过程是什么?
printf
3.这个程序的目的是什么?
跟着程序的顺序走,先找到main
函数:
main
函数中只有一处函数调用sub_401000
,查看该函数的逻辑:
1 |
|
可以从以上内容看到决定jz
跳转的是函数InternetGetConnectedState
,查阅MSDN发现此函数当存在一个可用的网络连接时返回值为1,ZF标志位为0,jz
指令不执行,因此程序调用printf
输出"Success: Internet Connection\n"
否则输出"Error 1.1: No Internet\n"
。因此可以得出判断这是一个用于测试网络连接状态的函数。
Lab6-2
分析在Lab06-02.exe中发现的恶意代码。
问题
1.main函数调用的第一个子过程执行了什么操作?
发现这道题的程序跟上一题是一模一样的,就是判断当前是否有网络连接。
2.位于0x40117F的子过程是什么?
还是跟上题一样,printf()
3.被main函数调用的第二个子过程做了什么?
尝试下载http://www.practicalmalwareanalysis.com/cc.htm
并解析此网页的注释部分。
1 |
|
1 |
|
4.在这个子过程中使用了什么类型的代码结构?
if
语句的结构和数组,以下明显是一个数组的比较过程:
5.在这个程序中有任何基于网络的指示吗?
程序会尝试下载网页http://www.practicalmalwareanalysis.com/cc.htm
6.这个恶意代码的目的是什么?
连接http://www.practicalmalwareanalysis.com/cc.htm
用于远程命令和控制服务器。
Lab6-3
在这个实验中,我们会分析在文件Lab06-03.exe中发现恶意代码。
问题
1.在比较main函数与实验6-2的main函数调用。从main中调用的新函数是什么?
sub_401130
2.这个新的函数的参数是什么?
char a1 |
LPCSTR lpExistingFileName |
---|---|
从网页中解析出来的命令 | 程序名 |
3.这个函数包含的主要代码结构是什么?
1 |
|
由这个跳转命令可以得知这里主要的代码结构是switch
结构,采用跳转表。
4.这个函数能够做什么?
根据获取到的指令来执行不同的操作,比如创建目录C:\\Temp
、拷贝文件cc.exe
至目录C:\\Temp
、删除文件、休眠100s、打印错误信息、删除文件。
5.在这个恶意代码中有什么本地特征吗?
创建目录C:\\Temp
,创建文件cc.exe
、注册表键Software\Microsoft\Windows\CurrentVersion\Run
6.这个恶意代码的目的是什么?
根据网页注释中的命令来选择在目标主机上选择执行不同的功能。
Lab6-4
在这个实验中,我们会分析在文件Lab06-04.exe中发现的恶意代码。
问题
1.在实验6-3和实验6-4的main函数的调用之间的区别是什么?
函数地址发生了变化。
2.新的代码结构已经被添加到main中?
实验6-4的main函数中有一个for循环,而实验6-3是一个if判断语句:
3.这个实验的解析HTML的函数和前面实验中的那些有什么区别?
这个实验中,此函数新增了一个参数作为函数sprintf()
的参数
sprintf(&szAgent, aInternetExplor, a1);
4.这个程序会运行多久?(假设它以经连接到互联网)
Sleep函数的参数为
此循环会执行1440次,因此程序会运行1440*60s=1440m=24h=1d
所以此程序会运行整整一天。
5.在这个恶意代码中有什么新的基于网络的迹象吗?
这道题需要细心,之前的HTTP
头中的User-Agent
使用的是Internet Explorer 7.5/pma
,而现在是Internet Explorer 7.5/pma%d
6.这个恶意代码的目的是什么?
在24小时内每一分钟连续尝试从网页上获取命令并执行。
本章结束🎊
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!