恶意代码分析实战-实验6

本文最后更新于:2021-08-10 晚上

Lab 6-1

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

使用IDA找到main函数看到调用了一个子函数sub_401000,F5即可看到伪代码。

可以看到调用了InternetGetConnectedState这个API,这个函数是用来检测是否联网的,判断本地网络状态。

1
2
3
4
BOOL InternetGetConnectedState(
LPDWORD lpdwFlags,
DWORD dwReserved
);

当存在一个连接时返回TRUE,否则返回FALSE。

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

这样确实看不太出来是做什么的。

这样看可以看到成功或者失败分别会压入栈不同的文字然后调用。

再看实际运行情况,推测应该是一个printf函数。

3.这个程序的目的是什么?

通过上面的函数分析可以得知,这是一个判断是否有网络连接的程序。如果存在网络连接返回1,否则返回0。

Lab 6-2

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

调用的第一个函数是sub_401000,调用了InternetGetConnectedState这个API判断当前是否连接了网络

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

查看此函数,发现与lab6-1是一样的,所以是一个printf函数。

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

首先调用了InternetOpenA初始化应用程序对 WinINet 函数的使用。

然后调用了InternetOpenUrlA下载“http://www.practicalmalwareanalysis.com/cc.htm”这个页面

再调用InternetReadFile读取数据,如果读取的前几个字符是“<!–”就成功,如果失败就会打印“Error 2.3: Fail to get command”,读取失败会打印“Error 2.2: Fail to ReadFile”

openurl失败会打印“Error 2.1: Fail to OpenUrl”

再仔细分析一下返回值,可以看到前几个值如果比对都正确的话,那么会把第五个字符给al,而前几个字符是html页面的注释,也就是读取注释的第一个字符。

这个函数结束之后,可以看出来后al的值会再次赋给[EBP+var_8],最终会传给ecx,再压入栈作为printf的一个参数。可以看到压入栈一句话”Success: Parsed command is %c\n”,%c对应的就是这个值,打印出这个字符。

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

if-else的结构

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

使用了Internet Explorer 7.5/pma作为InternetOpenA函数lpszAgent参数的值,还有http://www.practicalmalwareanalysis.com/cc.htm这个URL。

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

首先判断是否联网,如果联网那么就会开始读取http://www.practicalmalwareanalysis.com/cc.htm这个页面的,然后获取注释的第一个字符,最后将其打印出来,再调用sleep函数

Lab 6-3

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

多了一个函数sub_401130函数

这个新函数是通过读取到的值来执行不同的操作。

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

使用的参数是通过读取网页资源注释中得到的字符,还有一个是main函数的参数argv[0],就是程序名本身。

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

包含的主要结构式switch结构

4.这个函数能够做什么

首先当字符等于“a”时,可以创建一个文件夹路径是C:\TEMP

当字符等于“b”时,会将自身复制到创建文件夹内,并且重命名为cc.exe

等于“c”时,会删除文件夹下的cc.exe。

等于“d”时,会实现一个自启动功能,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run下写入键值

通过注册表实现自启动可以看这里:自启动技术-注册表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
0040118F  |.  51            push ecx                                 ; /pHandle = kernel32.75B5483B
00401190 |. 68 3F000F00 push 0xF003F ; |Access = KEY_ALL_ACCESS
00401195 |. 6A 00 push 0x0 ; |Reserved = 0x0
00401197 |. 68 70714000 push Lab06-03.00407170 ; |Software\Microsoft\Windows\CurrentVersion\Run
0040119C |. 68 02000080 push 0x80000002 ; |hKey = HKEY_LOCAL_MACHINE
004011A1 |. FF15 04604000 call dword ptr ds:[<&ADVAPI32.RegOpenKey>; \RegOpenKeyExA
004011A7 |. 6A 0F push 0xF ; /BufSize = F (15.)
004011A9 |. 68 A0714000 push Lab06-03.004071A0 ; |C:\Temp\cc.exe
004011AE |. 6A 01 push 0x1 ; |ValueType = REG_SZ
004011B0 |. 6A 00 push 0x0 ; |Reserved = 0x0
004011B2 |. 68 68714000 push Lab06-03.00407168 ; |Malware
004011B7 |. 8B55 FC mov edx,dword ptr ss:[ebp-0x4] ; |
004011BA |. 52 push edx ; |hKey = 0x23C
004011BB |. FF15 00604000 call dword ptr ds:[<&ADVAPI32.RegSetValu>; \RegSetValueExA

等于“e”的时候,调用sleep函数

都不满足的话就打印字符串“Error 3.2: Not a valid command provided”

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

有,就是前面分析的注册表键值的修改,还有对于文件夹的创建和文件的复制。

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

判断网络是否连接,然后读取一个网页资源中的注释后的第一个字符,通过这个字符来判断进行何种操作。具体上面已经分析过了。

Lab 6-4

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

加了一个for循环,sub_401040加了一个参数i。

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

for循环结构

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

主要是给InternetOpenA传入的szAgent参数不一样,这个参数先通过sprintf将“Internet Explorer 7.50/pma”与循环次数i拼接起来。第一次是Internet Explorer 7.50/pma0第二次是Internet Explorer 7.50/pma1…以此类推。

4.这个程序会运行多久?(假设它已经连接到互联网)

看这个for循环,每次都会sleep,其中参数是6000ms,是一分钟,也就是每循环一次沉睡一分钟,那么就是1440分钟。

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

就是InternetOpenA传入的szAgent参数不同了,每次都会变。

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

跟之前的基本一样,只是运行的时间变得特别长。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!