问题
首先,以①处的一个对new操作符的调用开始,这表明它正在创建一个对象。一个对象的引用会在EAX寄存器中返回最终存储在②处的var_8变量和③处的var_4变量中。var_4变量在④处被移到了ECX寄存器中,这预示着它将被作为函数调用的this指针传递进去。指向URL http://www.praticalmalwareanalysis.com/的一个指针,随后被存储在对象的开头位置,紧接着调用了sub_401040函数。
在上面的代码中,我们看到ECX中的this指针在①处被访问并存储在var_4变量中。代码的其余部分是参数被压栈,并调用URLDownloadToFileA函数的过程。为了获取将要使用的URL参数值,this指针在②处被读取,随后在③处访问了存储在对象中的第一个数据元素,并将其压入④处的栈中。
回想一下,在main函数中,对象中存储的第一个元素是URL字符串htp:/mwpracticalmalwareanabysiscom/cp p.hml,最后,main函数返回,程序执行完毕。
在0x401040地址处的函数并不带任何参数,但它在ECX中传递了一个对象索引,含义为this指针。
对URLDownloadToFile函数的调用使用http://wwwpracticalmalwareanalysis.com/cpp.html作为URL参数值。
这个程序从远程服务器下载文件,并把它存储到本地系统的C:\tempdownload.exe中。
问题
使用strings程序检查一下文件。
可以看到两个可疑的字符串,这意味着这个程序可能是FTP客户端软件。
使用Dependency Walker查看程序。
这一程序导入了函数FindFirstFile和FindNextFile,这表明这个程序很可能会搜索受害主机的文件系统。而导入了函数Internetopen、Internetconnect、FtpsetcurrentDirectory与FtpPutFile,这告诉我们这一恶意代码会上传受害主机的文件到一个远程FTP服务器。
首先调用了WAStartup,调用了网络函数。
然后使用gethosthome函数获取主机名,最后将一个字符串压栈,然后调用了sub_401000.
这个蓝色的线说明该程序有循环操作,然后我们可以在循环的开始发现调用了
在结束调用了
结合压栈的字符串,我们可以推测,程序进行了遍历文件的操作。
在循环体中,我们也看到了很多字符串操作函数(strcat、strlen、strncmp等等),仔细分析将会发现程序到底在搜索什么。其中一个strncmp函数调用将操纵字符串与.doc进行比较,如果文件名以.doc后结尾,下图代码将会被执行。
我们知道off_496DC处是一个虚函数表,因为在通过new操作符创建对象之后它马上被写入对象中,如果我们仔细查看off_4969DC的偏移位置,可以发现它保存了一个指向sub_401449地址的函数指针。我们将这一函数标识为docobject_Func1,在这个函数被调用时再来分析它。
在0x004011D9地址创建的对象是一个.doc文件。这个对象在偏移0x00401440地址处有一个虚函数,它将把文件上传至远程FTP服务器
分析代码可知,这段代码先判断是不是doc文件,在判断是不是pdf文件,最后都会到如下代码处。
可能调用的就是处理doc、pdf或者什么也不做的函数。
在0x00401349处的虚函数调用将调用在0x00401380、0x00401440或0x00401370处的一个虚拟函数。
首先,安转apateDNS和MINIftp,然后安装Microsoft .NET Runtime >= 2.0。
https://www.microsoft.com/zh-CN/download/confirmation.aspx?id=16614
启动MINIftp。
打开ApateDNS设置返回到本地。
在C盘根目录下,放一些doc和pdf文件,然后建立doc和pdf文件夹。
运行恶意代码。
这一恶意代码会使用高层API函数连接到一个远程的FTP服务器,我们可以下载并建立一个本地FTP服务器,并将DNS请求重定向至这一服务器,以充分分析该恶意代码
这个程序会搜索受害主机的硬盘驱动器,并上传所有.doc和.pdr后缓的文件到远程FTP服务器上。
实现虚拟函数调用的目的是让代码对不同文件类型执行不同的上传函数。
几个看起来像是错误消息的字符串(Error sending Http post,Error sending Http get Errorr sending response,等等)告诉我们,这个程序将会使用HTTP GET和POST命令。我们也看到HTML路径(/srv.html,/put.html等),这暗示着这个恶意代码尝试打开一些文件。
几个wS2_32中的导入函数告诉我们,这个程序会在网络上进行通信。Createprocess导入函表明,这个程序可能会启动另一个进程。
在0x4036F0地址调用的函数除了一个字符串外,不带任何参数,但ECX寄存器中包含了对象的this指针。我们知道包含这一函数的对象是一个异常对象,因为这个对象在后面被用于CxxThrowException函数的一个参数。通过上下文环境我们可以得知0x4036F0地址的函数初始化了一个异常对象,而异常对象中存储了一个字符串来描述到底引发了何种异常。
Switch表的6个条目实现了6种不同的后门命令:NOOP、睡觉、执行一个程序、下载文件、上传一个文件,以及调查受害主机。
该程序实现了一个后门,它使用HTTP作为命令通道,并具备启动程序、下载或上传文件,以及收集受害主机信息的能力。