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
,永远不会结束执行(除非你关机,哈哈哈)
本文完