Lab 7-1
问题
1.当计算机重启之后,这个程序如何保证它继续运行(达到持久化驻留)
解答: 我们还是按照书上的步骤走一遍看看
先是静态分析
我们会发现这里有一个CreateMuteA和CreateThread的函数,会操作一个互斥量和一个线程
还有这些好玩的函数,比如SetWaitableTimer,这是由于设置一个定时的函数,可以在时间到来的时候发出一个信号来激活一个线程
然后就是Sleep,这个说明这个含税会休眠
还有就是SystemTimeToFileTime这是将系统时间转换成UTC时间
然后就是TerminaterProcess这个会终止一个进程的运行
然后还有下个DLL导入的函数
这个是CreateServiceA,这个函数会在Windows上创建一个服务
然后OpenSCManagerA,功能是建立一个连接到服务控制管理器并打开它的数据库
和StartServiceCtrlDispatcherA,将服务进程的主线程连接到服务控制管理器,这将使线程成为调用进程的服务控制分派器线程
最后还有两个函数,会打开一个URL的连接
然后我们看看字符串
额,这个程序没有任何字符串。。。
我们开始查看IDA中的汇编代码
这个main函数很短,这个代码先是将ServiceStartTable.lpServiceName的值赋为MalService
然后又将ServicesStartTable.lpServiceProc的值赋为了sub_401040
现在部署很清楚这个ServicesStartTable的个个结构的作用,我们还是先来Google一下
而我们继续查一下这个ServicesStartTable是哪个结构的
是一个叫SERVICE_TABLE_ENTRYA的结构,一搜这个结构就会出来了
我们就会发现,这个结构内部的一些细节
首先是lpServiceName,这个代表了要在此服务过程中运行的服务的名称
然后是lpServiceProc,这个代表了指向ServiceMain函数的指针(来自MSDN)
所以这个函数结合汇编代码分析,大概用途就是将sub_401040处的函数用名为MalService的名称安装
然后通过
来运行
然后我们去检测一下这个sub_401040处的函数是干什么的
这个函数一开始会打开一个叫HGL345的互斥量
我们也可以这里细究一下这个OpenMutexA这个函数的各个参数的意思
这个函数会打开一个已经命名的互斥量
然后dwDesiredAccess是指访问的权限是什么
然后bInheritHandle是如果此值为TRUE,则此进程创建的进程将继承该句柄。否则,进程不会继承此句柄
然后lpName是要打开互斥体的名称
根据我们以前的经验
我们会发现这个入参是这样的
dwDesiredAccess=1F0001h
bInheritHandle=0
lpName="HGL345"
其他的都好理解,这个dwDesiredAccess=1F0001h代表什么到底
我们继续查,发现
这个值代表MUTEX_ALL_ACCESS的意思,也就是所有权限
所以这个汇编段的意思就是以要求所有权限的方式,打开一个名叫HGL345的互斥量
如果返回值返回一个句柄,说明成功打开了,反之返回了NULL,说明打开失败
然后test一下返回值,如果成功打开了,则eax不为空,test之后ZF=0,jz不跳转,结果便是程序走红色那个线,然后便退出了
反之没打开互斥量,函数返回NULL,test之后ZF=1,jz跳转,程序走绿色那个线
这个逻辑上就是,如果能打开HGL345这个互斥量,说明有程序运行并创建了这个互斥量,然后代码编写者只允许一个程序运行在系统中,所以后来这个程序会退出
打开成功之后就会直接退出程序
如果打开失败了,则执行
程序会创建一个互斥量HGL345来让其他的程序不要重复运行
然后便是传参和调用OpenSCManagerA函数,这个在MSDN中的描述是这样的
在指定的计算机上建立与服务控制管理器的连接,并打开指定的服务控制管理器数据库
书中的描述可能更好懂一点
打开一个服务控制管理器的句柄,以便这个程序可以添加或者修改服务
然后便是获得进程句柄的操作GetCurrentProcess
然后调用
返回现在程序的或正在使用的DLL的全路径名,因为第一个参数hModule的值为0,所以这个函数是返回了这个可执行文件的全路径名
然后下面
然后函数通过CreateServiceA来创建这个服务
按照书中的说法,我们需要注意的是这么几个值的类型
lpBinaryPathName是指这个可执行文件的位置,是由GetModuleFileName来获得的
然后我们研究一下下面这两个参数的意义
在MSDN中,我们查找这两个值
先找到的dwServiceType
dwServiceType=10h代表的就是SERVICE_WIN32_OWN_PROCESS,解释就是在自己的进程中运行的服务
然后是dwStartType
所以dwStartType=2代表的SERVICE_AUTO_START,这个就是这个服务会自当启动,这个说明这个服务会在系统开机的时候开始运行
然后还有一个参数有值,就是dwDesiredAccess,值是2
说明这会创建一个服务
需要调用CreateService函数来创建服务对象并将其添加到数据库。
然后我们继续分析
然后在创建完服务之后,这个函数执行上面这些汇编代码
这些汇编第一步先将edx置为0
然后将eax设为指针,指向[esp+404h+FileTime]的位置,其实也就是指向了FileTime
然后将SystemTime.wYear置为0
还有将ecx指向了SystemTime的位置
然后又将SystemTime.wDayOfWeek置为0,还有SystemTime.wHour和SystemTime.wSecond
这么一圈操作之后,到call ds:SystemTimeToFileTime之前,系统中的情况就是这样的
然后这里会调用几个参数
然后这里将SystemTime.wYear设置为了834h也就是2100d,意思这个到期时间是2100年的时候
根据以上的分析,这个函数会使用WaitForSingLeObject进行等待,知道2100年1月1日的时候
然后继续看汇编代码,最后会对WaitForSingleObject这个值进行判断返回值,如果返回是失败,则跳转Sleep
如果不是退出的话,则执行这些东西
这里有个汇编的知识,就是这里的esi的值的问题,这里将esi的值赋为了14h,在循环的结尾处,执行了
dec esi
将esi递减,然后知道esi达到0的时候,循环结束,这里有个比较难看懂的点就是esi的跳转问题
汇编中dec对标志位的影响是这样的
dec esi
esi等于0 -> ZF=1
esi不等于0 -> ZF=0
所以如果第一次循环,esi减了之后不等于0,则ZF=0,然后JNZ跳转,也就是绿色那条线,然后就又回到这小段程序开头的地方,再次执行,然后这就是个循环
这里会循环14h也就是20d的次数,直到esi为0了,也就是这个代码片段会执行20次,调用20次的CreateThread
而对于我们来说,最重要的就是这个地方CreateThread函数的入参是什么
我们会发现这里一个入参是StartAddress,这里就是这个CreateThread会启动的一个函数,我们来研究研究这个函数会做什么
这个函数第一个部分是这样的
这里调用InternetOpenA来初始化一个地址,然后设置这个User-Agent为Internet Explorer 8.0
然后下一步便是进行循环
这个函数push了几个参数进去,然后调用InternetOpenUrlA这个函数来打开一个连接,值得注意的就是这个szUrl这个参数的值http://www.malwareanalysisbook.com,最后这个函数又跳回到loc_40116D这个位置,所以这个循环一直不会结束,而是会一直循环下去,不断去连接这个网址
然后分析到这里,我们可以基本断定这个代码会干啥了,这个函数会作为服务一直允许在系统中,然后等待那个时间的到来(2100年1月1日),然后到了这个时间就会启动20个线程来一直连接这个网址,和DDOS很像是不
2.为什么这个程序会使用一个互斥量?
解答: 通过上面分析可以得知,因为要保证一个系统中只运行一个这个程序
3.可以用来检测这个程序的基于主机特征是什么?
解答: 还是通过上面的分析,有一个HGL345的互斥量和名为MalService的服务运行
4.检测这个恶意代码的基于网络特征是什么?
解答: 这个会使用User-Agent为Internet Explorer 8的方式去连接http://www.malwareanalysisbook.com这个网址
5.这个程序的目的是什么?
解答: 通过上面分析,应该就是一个潜伏木马,等到特殊时刻的到了,然后使用DDOS来攻击一个网站
6.这个程序什么时候完成执行?
解答: 这个程序开始执行是2100/1/1,永远不会结束执行(除非你关机,哈哈哈)
本文完
本文分析了一个恶意程序的功能,包括其持久化机制、使用互斥量的原因、基于主机和网络的特征等,揭示了其作为潜伏木马的目的。
807

被折叠的 条评论
为什么被折叠?



