Lab 6-2
问题
1.main函数调用的第一个子过程执行了什么操作?
解答: 也是一样的,先按照书中的步骤走一遍
先是静态分析一下
导入的有文件操作的相关函数,和Sleep
这个函数
然后我们再看下一个导入的DLL
会发现这里导入了这些东西,InternetOpenA
、InternetOpenUrlA
、InternetReadFile
这三个函数比较有趣,估计是会打开一个网络里面的URL
然后在读取一些东西下来本地
我们看字符串
然后从这些字符串中我们可以大概知道这个函数会连接网络,然后从一个网址(OpenUrl
)上面打开一个文件(ReadFile
)然后获取一个命令(get command
)最后执行一个命令(Parsed command
)
然后动态分析的我就不过了,比较简单,也不能分析出来什么东西
我们用IDA
打开这个文件,然后会发现这个程序和上一个分析的一样,会调用一个判断当前网络是否可用的函数
sub_401000
函数如果网络可用,返回1
,如果不可用,返回0
然后实在不懂什么是子过程,看答案才发现说的就是这个函数sub_401000
2.位于0x40117F的子过程是什么?
解答: 这个我们Lab 6-1
就已经详细分析过了,就printf
函数
3.被mian函数调用的第二个子过程做了什么?
解答: 这个的话,其实说的就是这里这个调用函数sub_401040
然后我们分析一下
我们会发现这里压入了一个值Internet Explorer 7.5/pma
,然后调用函数InternetOpenA
函数,那这个值其实就传递给了InternetOpenA
这是MSDN
的解释说明,只压了一个值,说明函数只用了lpszAgent
这个参数,然后这个参数代表什么意思
然后这是用作HTTP
协议里面的user agent
的,而InternetOpenA
将初始化对WinINet
库的使用,然后通过这个压入的数据来设置User-Agent
字段
然后,继续看汇编代码
后面已经自动标注了这些压栈的数据是什么意思
我们也可以查看MSDN
来确认这些数据的意思
按照栈的数据特性,先进后出,我们可以查看最后被压入栈中的数据
这里已经被标注出来了,所以我们也不过多的纠结细节的问题,知道方法就好了
hInternet
是调用了InternetOpenA
后的返回值
MSDN
中也说了这个参数的具体
然后我们可以看到,这里也只传入了一个hInternet
和lpszUrl
,因为其他的入参都是为0
,所以这里会打开一个http://www.practicalmalwareanalysis.com
的句柄,然后User-Agent
是上面设置的Internet Explorer 7.5/pma
然后我们会发现eax
,也就是InternetOpenUrlA
的返回值,被移动到了[ebp+hFile]
中,其实返回值也就是个hFile
格式的东西,然后这个值和0
比较,如果相同,则ZF=1
,然后JNZ
不跳转,也就是继续沿着红色那根线执行
如果hFile
等于0
了,我们看一下会执行什么
这里会调用printf
然后输出Error 2.1: Fail to OpenUrl\n
然后便是调用一些清理函数,然后做一些清理工作,然后便是退出
然后如果不等于0
了
这里便是调用InternetReadFile
从打开的网页中读取数据了,如果没有读到任何数据,调用这里
这里就printf
了一个Error 2.2: Fail to ReadFile\n
,然后便是清理和返回值退出
然后便会进行一连串的比较,然后这里,这里一开始的是[ebp+Buffer]
,但是后面的是什么就不得而知了
我们可以通过这样变换得到如下变化后的代码
[ebp+Buffer]
是等价于[ebp-210h]
,那后面的[ebp-20fh]
就是等价于[ebp-210h+01h]
也就是[ebp+Buffer+1]
,后面的以此类推,最终可以得到的就是和书上一样的结论,是依次比较了[ebp+Buffer+1]
到[ebp+Buffer+3]
的值
然后要比较的值转换成ASCII值之后就是<!--
,按照书上的说法,这是HTML
中注释的开始部分(鄙人对HTML
不熟哈哈)
然后书中假设是这个Buffer
是通过InternetReadFile
下载的网页的字符数组(也就是有一个一个字符组成的数组,区别字符串数组),然后由于Buffer
指向的是网页的开始的一条HTML
注释,然后程序通过比较这个来判断是否是网页
然后我们来做一下这个重新定义栈
按住ctrl k
,然后跳出一个窗口之后,定义Array(数组)
然后这里设置长度为512
字节,宽度为1
然后最后这个栈就会显示成正常的样子,也就是这样的
然后前面那里的Buffer
就会显示正常的值了
代码接着就是比较这个Buffer[0] - Buffer[3]
的值,如果这个值为<!--
了,那么就会将Buffer[4]
的值存入AL
中
然后便会返回EAX
然后结束这个程序
然后我退出这个函数看,这个返回值不同会影响什么
然后会发现这里,al
被移动到了[ebp+var_8]
,然后又被移动回eax
,如果返回的是0
值的话,就会跳转到红线那里继续执行,那里是退出函数,如果返回不为0
的话,就执行绿线的代码
al
最后别移动到了ecx
中,然后调用printf
来输出这么一句话Success...
然后后面就是调用了Sleep
函数,之前push
过一个0EA60h
0EA60h
等同于60000d
毫秒,也就是60
秒,最后程序会Sleep
一个一分钟
所以这个程序最终会从一个网页里面的注释里面,找到一个需要执行的代码,不过这个需要执行的代码只有一个字符(很少有一个字符的命令吧,一个列目录都是dir三个字符)
4.在这个子过程中使用了什么类型的代码结构?
解答:这个子过程使用的结构是就是一个字符数组,InternetReadFile
会将读到的字符流,写入这个数组中,然后一个一个的比较这个字符的头4
个字符,如果等于<!--
就将第5
个字符用al
返回
5.在这个程序中有任何基于网络的特征的指示吗?
解答: 这个特诊就是会打开一个访问一个特殊的网址http://www.practicalmalwareanalysis.com
然后会使用Internet Explorer 7.5/pma
做User-Agent
可以使用这两个特征来识别病毒
6.这个恶意代码的目的是什么?
解答: 这个恶意代码的目的是从恶意网址上获得一个要执行的远程命令,然后休眠一分钟,如果没有获得这个命令,则退出
本文完