恶意代码分析实战 Lab 7-1 习题笔记

Lab 7-1

问题

1.当计算机重启之后,这个程序如何保证它继续运行(达到持久化驻留)

解答: 我们还是按照书上的步骤走一遍看看

先是静态分析

上传

我们会发现这里有一个CreateMuteACreateThread的函数,会操作一个互斥量和一个线程

还有

还有这些好玩的函数,比如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=0jz不跳转,结果便是程序走红色那个线,然后便退出了

反之没打开互斥量,函数返回NULLtest之后ZF=1jz跳转,程序走绿色那个线

这个逻辑上就是,如果能打开HGL345这个互斥量,说明有程序运行并创建了这个互斥量,然后代码编写者只允许一个程序运行在系统中,所以后来这个程序会退出

Failed

打开成功之后就会直接退出程序

如果打开失败了,则执行

函数

程序会创建一个互斥量HGL345来让其他的程序不要重复运行

图片

然后便是传参和调用OpenSCManagerA函数,这个在MSDN中的描述是这样的

在指定的计算机上建立与服务控制管理器的连接,并打开指定的服务控制管理器数据库

书中的描述可能更好懂一点

打开一个服务控制管理器的句柄,以便这个程序可以添加或者修改服务

然后便是获得进程句柄的操作GetCurrentProcess

然后调用

调用

返回现在程序的或正在使用的DLL的全路径名,因为第一个参数hModule的值为0,所以这个函数是返回了这个可执行文件的全路径名

然后下面

调用

然后函数通过CreateServiceA来创建这个服务
按照书中的说法,我们需要注意的是这么几个值的类型

这里

lpBinaryPathName是指这个可执行文件的位置,是由GetModuleFileName来获得的

然后我们研究一下下面这两个参数的意义

MSDN

MSDN中,我们查找这两个值

先找到的dwServiceType

type

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.wHourSystemTime.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的次数,直到esi0了,也就是这个代码片段会执行20次,调用20次的CreateThread

而对于我们来说,最重要的就是这个地方CreateThread函数的入参是什么

图片

我们会发现这里一个入参是StartAddress,这里就是这个CreateThread会启动的一个函数,我们来研究研究这个函数会做什么

这个函数第一个部分是这样的

函数

这里调用InternetOpenA来初始化一个地址,然后设置这个User-AgentInternet Explorer 8.0

然后下一步便是进行循环

图片

这个函数push了几个参数进去,然后调用InternetOpenUrlA这个函数来打开一个连接,值得注意的就是这个szUrl这个参数的值http://www.malwareanalysisbook.com,最后这个函数又跳回到loc_40116D这个位置,所以这个循环一直不会结束,而是会一直循环下去,不断去连接这个网址

然后分析到这里,我们可以基本断定这个代码会干啥了,这个函数会作为服务一直允许在系统中,然后等待那个时间的到来(2100年1月1日),然后到了这个时间就会启动20个线程来一直连接这个网址,和DDOS很像是不


2.为什么这个程序会使用一个互斥量?

解答: 通过上面分析可以得知,因为要保证一个系统中只运行一个这个程序


3.可以用来检测这个程序的基于主机特征是什么?

解答: 还是通过上面的分析,有一个HGL345的互斥量和名为MalService的服务运行


4.检测这个恶意代码的基于网络特征是什么?

解答: 这个会使用User-AgentInternet Explorer 8的方式去连接http://www.malwareanalysisbook.com这个网址


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

解答: 通过上面分析,应该就是一个潜伏木马,等到特殊时刻的到了,然后使用DDOS来攻击一个网站


6.这个程序什么时候完成执行?

解答: 这个程序开始执行是2100/1/1,永远不会结束执行(除非你关机,哈哈哈)

本文完

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值