首页 > 编程学习 > 恶意代码分析实战 4 识别汇编中的C代码结构

4.1 Lab06-01.exe

  1. 由main函数调用的唯一子过程中发现的主要代码结构是什么?

使用Strings进行查看,需要注意最后的这两个字符串,一个是“没有网”,另一个是“联网成功”。
vmware_t1RocqczuN.png
IDA 中查看图结构。
vmware_4feqjJpxsl.png
明显是if-else结构。

  1. 位于0x40105F的子过程是什么?

明显sub_401000函数决定了分界点,点进去看一看:
vmware_FN6e23edgj.png
这个函数最后返回的值就是该函数的值,似乎这个if-else 中的内容并没有影响他的返回值,在这这两个流程中都有字符串,可以大致猜测出应该是打印字符串的功能,而sub_40105F函数恰好有两个参数,而字符串恰好是第一个参数,该函数应该就是printf。

  1. 这个程序的目的是什么

该程序检查是否有一个可用的Internet连接。如果找到可用连接,就打印"Success: Internet Connection\n",如果没有找到,就打印 “Error 1.1: No Internet\n”。恶意代码在连接Internet之前,可以使用该程序来检查是否存在一个连接。

4.2 Lab06-02.exe

  1. main函数调用的第一个子程序执行了什么操作?

使用Strings查看一下程序,发现了一些有意思的字符串:

Error 1.1: No Internet
Success: Internet Connection
Error 2.3: Fail to get command
Error 2.2: Fail to ReadFile
Error 2.1: Fail to OpenUrl
http://www.practicalmalwareanalysis.com/cc.htm
Internet Explorer 7.5/pma
Success: Parsed command is %c

这几条字符串告诉我们,该程序可能会打开一个网页,并解析一条指令。我们还注意到其中有一个网页的URL,http://www.practicalmalwareanalysis.com/cc.htm。这个域名可以直接当成一条网络特征来使用。
导入表中还包含了一些网络功能的Windows API,如下所示:

InternetCloseHandle
InternetGetConnectedState
InternetOpenA
InternetOpenUrlA
InternetReadFile

这些函数都是WinINet的一部分,该库提供了通过网络使用HTTP的一组简单的API,其具体功能如下:

  • InternetOpenA 用于初始化对WinINet库的使用,并设置用于HTTP通信的User-Agent字段
  • InternetOpenUrlA 使用一个完整的FTP或者HTTP的URL,来打开一个句柄
  • InternetReadFile 用于从InternetOpenUrlA打开的句柄中读取数据
  • InternetCloseHandle 用于关闭这些一打开的文件的句柄。

接下来,使用WireShark进行动态分析。
vmware_5uwOsy0Zux.png
vmware_o8KFm4DymU.png
确确实实解析了这个网址。
使用IDA进行分析:
vmware_sI8uM3EZl2.png
第一个子进程是sub_401000,进去之后一看很熟悉。
vmware_1xpnVpRZya.png
就是Lab06-01.exe中的函数,判断是否联网的函数。

  1. 位于0x40117F的子过程是什么?

vmware_yXmyTcaa51.pngvmware_JBOEaY0flC.png
两个参数,还压入了格式化字符串,应该就是printf。

  1. 被main函数调用的第二个子过程做了什么?

点进去一看,比较复杂,单击F5,查看反汇编代码。

char sub_401040()
{char result; // al@2int Buffer; // [sp+0h] [bp-210h]@2char v2; // [sp+4h] [bp-20Ch]@9HINTERNET hFile; // [sp+200h] [bp-10h]@1HINTERNET hInternet; // [sp+204h] [bp-Ch]@1DWORD dwNumberOfBytesRead; // [sp+208h] [bp-8h]@3int v6; // [sp+20Ch] [bp-4h]@3hInternet = InternetOpenA(szAgent, 0, 0, 0, 0);hFile = InternetOpenUrlA(hInternet, szUrl, 0, 0, 0, 0);if ( hFile ){v6 = InternetReadFile(hFile, &Buffer, 0x200u, &dwNumberOfBytesRead);if ( v6 ){if ( (char)Buffer != 60 || SBYTE1(Buffer) != 33 || SBYTE2(Buffer) != 45 || SBYTE3(Buffer) != 45 ){sub_40117F(aError2_3FailTo, Buffer);result = 0;}else{result = v2;}}else{sub_40117F(aError2_2FailTo, Buffer);InternetCloseHandle(hInternet);InternetCloseHandle(hFile);result = 0;}}else{sub_40117F(aError2_1FailTo, Buffer);InternetCloseHandle(hInternet);result = 0;}return result;
}

InternetOpenUrlA的返回值赋给hFile,判断是否为0,如果为0的话,直接关闭句柄退出了,如果不为零,判断InternetReadFile的值是否为0,然后判断得到的值的buffer,然后判断前四个字符是否是“<!–”然后打印出后面的字符,打印了html注释,否则打印出出错。

  1. 在这个子过程中使用了什么类型的代码结构?

该子例程调用 InternetReadFile ,将返回的数据填充到一个字符数组中,然后每次一个字节对这个数据进行比较,以解析一个 HTML 注释。
if-else嵌套。

  1. 在这个程序中有任何基于网络的指示吗?

vmware_4fDlbBnjxn.png
查找字符串是发现的:

http://www.practicalmalwareanalysis.com/cc.htm

  1. 这个恶意代码的目的是什么?

返回main函数,在sub_401040函数调用后,将解析出来的字符首地址在al返回并最后存放到ecx中压入栈作为参数,然后打印字符串“Success: Parsed command is %c”,而%c就是sub_401040函数解析出来的字符串。紧接着休眠0EA60h=60000ms也就是60秒。
所以综合以上分析可以得出结论,Lab06-02.exe先判断是否有可用的网络,如果没有则停止运行,如果已连接网络则在http://www.practicalmalwareanalysis.com网址下载并解析HTML文件,然后打印字符串Success : Parsed command is加上注释正文字符,最后程序休眠60s然后终止运行。

4.3 Lab06-03.exe

  1. 比较在main函数与实验6-2的main函数的调用。从main中调用的新的函数是什么?

首先从静态分析开始,使用 Strings ,找到了一些有趣的字符串。

Error 1.1: No Internet
Success: Internet Connection
Error 2.3: Fail to get command
Error 2.2: Fail to ReadFile
Error 2.1: Fail to OpenUrl
http://www.practicalmalwareanalysis.com/cc.htm
Internet Explorer 7.5/pma
Error 3.2: Not a valid command provided
Error 3.1: Could not set Registry value
Malware
Software\Microsoft\Windows\CurrentVersion\Run
C:\Temp\cc.exe
C:\Temp
Success: Parsed command is %c

这些信息说明程序可能会修改注册表。其中 Software\Microsoft\Windows\CurrentVersion\Run 是注册表中一个常用的autorun位置。C:\Temp\cc.exe 则是一个目录和文件名,可能是恶意代码将自身复制到了此处。
查看导入表:
vmware_PncbTHV4Vf.png

CopyFileA
DeleteFileA
CreateDirectoryA
RegOpenKeyExA
RegSetValueExA

前三个导入函数是自说明式的。RegOpenKeyExA 函数一般与 RegSetValueExA一起用于往注册表中插入信息,在恶意代码将其自身或其他程序设置为随着系统开机就自启动以持久化运行时,通常会使用这两个函数。
使用IDA Pro查看该程序,sub_401000 和 sub_401040处的函数与Lab 06-02 的一样。sub_401271函数则是printf函数。sub_401130 是新函数,点进去看起来像是一个switch语句。

  1. 这个新的函数使用的参数是什么?

sub_401040函数中返回的值作为了这个新函数的参数,查看sub_401040函数,发现和Lab 06-02中的函数是一样的,返回的是获取的Html中的注释的内容。
这个新的函数有两个参数,第一个是从HTML注释中解析来的指令字符,第二个参数是标准main函数中包含的参数中的argv[0],也就是程序名本身。

  1. 这个函数包含的主要代码结构是什么?

新的函数包含了一条switch语句和一个跳转表。
vmware_UE4E145gzX.png
vmware_WWgq5W8yH3.png
case 0:创建一个目录C:\Temp。
case 1:将自身复制到目录下并改名。“C:\Temp\cc.exe”
case 2:删除文件。
case 3:创建一个自启动项。
case 4:程序睡眠100秒钟。
default: ,打印错误,直接退出。

  1. 这个函数能够做什么?

其实上一题也提到了,这个新的函数可以打印出错信息,删除文件,创建一个文件夹,设置一个注册表项的值,复制一个文件,或者休眠100秒。

  1. 在这个恶意代码中有什么本地特征吗?

有两个本地特征,一是创建了创建了文件路径"C:\Temp\cc.exe",二是添加了一个自启动项 Software\Microsoft\Windows\CurrentVersion\Run。

  1. 这个恶意代码的目的是什么?

该程序先检查是否存在有效的Internet 连接。如果找不到,程序直接终止。否则,该程序会尝试下载-一个网页,该网页包含了一段以<!–开头的HTML注释。该注释的第-一个字符被用于switch语句来决定程序在本地系统运行的下一步行为,包括是否删除一个文件、 创建一个目录、设置一个注册表run键、复制一个文件或者休眠100秒。

4.4 Lab06-04.exe

  1. 在实验6-3和6-4的main函数中调用之间的区别是什么?

查看一下函数的流程。
首先在main函数现代用了 sub_401000 的函数,检测是否联网状态则跳转到loc_401248 处来到loc_401248处,发现这个代码块是比之前的实验多的,它将var_C偏移地址处的内容赋值0,然后无条件跳转到loc_40125A。
vmware_iEM9ZK9OQ5.png
来到loc_40125A处,这个代码块也是比Lab06-03.exe多出来的,它与5A0作比较,jge指令是如果大于等于则跳转,而之前的变量Var_C被赋值0很显然不能跳转,继续向下执行代码接下来的代码调用了sub_401040函数,和之前一样就是下载HTML文件并返回注释正文的首地址,如果返回首地址成功则跳转到loc_40127E。
vmware_Wn0pJzlwJL.png
来到loc_40127E可以看到和之前一样,就是打印出注释正文的的第一个字符然后调用sub_401150函数,最后休眠60s,然后无条件跳转到loc_401251处。
而sub_401150函数和之前的sub_401130函数一样,就是一个swich语句根据HTML文件注释正文的第一个字符实现程序自我复制和开机自启等功能。
vmware_RuvSeXSfE3.png
来到loc_401251处,发现它就是对变量var_C进行了加1操作,类似于c代码的自增,然后就又回到了loc_40125A处再接着与5A0h做计较,很明显这是一个循环结构,一直到变量大于等于5A0h则跳出循环结束程序。

  1. 什么新的代码结构已经被添加到main中?

vmware_E1IJcKTbnU.png
增添了一个循环函数。

  1. 这个实验的解析HTML的函数和前面实验中的那些有什么区别?

vmware_mtR8XMVkI6.png
进入函数sub_401040中,可以看到相比之前字符串Internet Explorer 7.50/pma%d发生了变化,多了一个%d型的参数,对应变量就是arg_0也就是函数调用之前传入的参数,即循环的次数。接下来还调用了一个sprintf函数,对传入的字符串进行了格式化,然后传给了InternetOpenA函数。
增添了了一个 sprintf 函数,从而使用传入的参数创建用于 HTTP 通信的 User-Agent 字段。

  1. 这个程序会运行多久?

vmware_CwvKMh5DxX.png
1440 * 60 (s),24个小时。

  1. 在这个恶意代码中有什么新的基于网络的迹象吗?

sub esp, 230h
mov eax, [ebp+arg_0]
push eax
push offset aInternetExplor ; “Internet Explorer 7.50/pma%d”
lea ecx, [ebp+szAgent]
push ecx ; char *
call _sprintf

是的,运行了一个新的User-Agent。它的形式是 “Internet Explorer 7.50/pma%d” ,其中%d是程序已经运行了的分钟数。

  1. 这个恶意代码的目的是什么?

首先检测网络连接,如果没有网络连接则停止运行;
如果网络已连接则下载HTML网页,该网页包含了注释,解析该网页,然后根据注释正文的第一个字符做出swich语句的跳转操作:
参数为‘a’时创建C:\Temp的目录;
参数为‘b’时,进行了程序的自我复制;
参数为‘c’时,删除了C:\Temp\cc.exe;
参数为‘d’时,将程序设为开机自启动;
参数为‘e’时,程序休眠100秒。
并且将检测到网络连接后的操作循环运行1440次。


本文链接:https://www.ngui.cc/article/show-841457.html
Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000