恶意代码の奇客pdf分析
远控木马奇客PDF转换器暗刷流量,我们对他进行恶意代码分析。
首先我们拿到恶意代码样本后,一共用如下几种方法对其就行分析
- 静态分析基础技术
- 动态分析基础技术
- 程序代码逻辑分析
- 程序动态调试分析
- 恶意程序分析思路总结
奇客PDF安装包分析
静态分析基础技术
上传杀毒网
我们先将恶意程序上传到https://www.virustotal.com/ 网站进行杀毒,进行一个大概的查杀过程。
上传后发现没有一个杀毒软件报毒,那么有可能是这些杀毒软件都没有收集到特征码,或者这程序进行了加壳加密等免杀技术。
查壳
我们利用StudyPE+ 工具对程序进行查壳操作,我们主要看文件类型这个地方,程序如果加壳了那么在文件类型这地方就会显示壳的特征,如果程序没有加壳呢那么就会显示用什么语言开发或者用什么编译器进行编译的,还有一种情况会显示Unknow Exe Type
,一般遇到这种情况是没有分析出什么类型,这时候点击一下下面的深度搜索按钮即可。
这里我们可以看到是Delphi进行开发的。
编译时间
接着我们再来看看程序是什么时候被编译的,首先我们要知道PE程序他的编译时间存放在哪里,这时候我们可以根据PE结构图来查阅,我这里准备了一张PE结构图,我们可以看到在PE头中有一个_IMAGE_FILE_HEADER
结构体里面有个成员时间戳TimeDateStamp
(荧光笔位置)。
这里我们可以利用StudyPE+ 工具查看自动计算后的编译时间,载入程序后点击PE头选项里面->时间戳->时间计算器。
导入表分析
程序会进行文件的查找,文件的写出等操作,程序中还有资源和动态库载入等的操作。
资源查看
我们用Restorator
程序对其程序资源进行查看,载入程序后我们可以看到在RC数据资源处有一个名为CHARTABLE的数据,其内容看着像是被加密了的十六进制数据,并且在版本资源段处可以看到这个程序是一个安装包程序。
这里我们用压缩软件打开安装包后可以看到里面带压缩包的内容,初步怀疑恶意程序可能会释放这些文件到系统目录,进行病毒木马的一个释放。其中这里的2.0和4.0代表的并不是程序版本,我观察后发现他其实是用.NET FrameWork2.0和4.0编译的程序,他这里之所以分为2.0和4.0是因为为了兼容用户电脑上安装的.NETFrameWork框架,像XP系统自带的可能是.NETFrameWork2.0框架,而像win7系统自带的都是.NETFrameWork4.0框架且无法安装.NETFrameWork2.0框架。
动态分析基础技术
动态分析基础技术我们主要利用到三个工具,一款是Process Monitor
行为分析工具,另外一款是Process Explorer
进程分析工具,还有一个WireShark流量分析工具。
Process Monitor监控
首先我们打开Process Monitor,然后设置过滤器,选Process Name填入我们要监控的程序名。
Process Explorer
打开Process Explorer然后我们实时的关注进程的信息
接着我们把WireShark开启监控后,就可以双击运行我们的奇客PDF转换.exe了,然后留意Process Explorer的窗口。
恶意程序创建奇客PDF转换.tmp进程
双击后出现了安装界面,并且在Process Explorer窗口中先出了进程名并且进程名下有一个.tmp进程。
我们鼠标放在这个.tmp文件上后,可以看到他的命令行和路径,可以看出奇客PDF转换器他释放出这个.tmp程序然后在用.tmp程序进行解压奇客PDF转换.exe里面压缩包内容然后进行安装。
具体我们还可以看看奇客PDF转换.exe创建了哪些Handle句柄,我们鼠标点到奇客PDF转换.exe上面
可以看到奇客PDF转换.exe创建了一个进程.tmp
接着我们在Process Monitor过滤器里面把奇客PDF转换.tmp也加上,然后我们点击快速安装进行程序的安装,这时候还是注意留意Process Explorer窗口。
恶意程序创建FnClientService进程
当我们运行程序后在Process Monitor中出现过一个cmd.exe并且还有taskkill进程,因为出现太快就没有截图成功,接着还出现了一个FnClientSerice.exe进程,这个进程下面还出现了net.exe等进程。所以初步怀疑这个恶意程序会释放进程FnClientService.exe并且运行。
好的接着我们继续切换到Process Monitor中。
Process Monitor详细过滤
在Process Monitor中我们设置Operation添加RegSetValue和WriteFile,看看他写入的文件和注册表操作。
奇客PDF转换.exe创建奇客PDF转换.tmp文件
可以看到exe程序写出了.tmp程序,并且还写出了一个日志文件$LogFile
奇客PDF转换.tmp写出大量dll和.zip
接着主要来看.tmp程序写出的文件和注册表操作,可以看到.tmp程序在其目录下写出了大量的dll和资源文件还有.zip压缩包。
对释放文件详细分析
我们右键跳转到其目录,查看.tmp程序释放出的所有文件,其中有个.bat和.zip引起了我们的注意。
qk.bat内容
其中qk.bat文件他会关闭fn服务,然后删除fn服务,并且结束FnClientService.exe,我怀疑他这里进行这些操作是为了把别人装的同样的恶意程序给结束关掉,安装自己的服务好让自己的恶意程序成功安装,如果不先前结束这些服务的话很有可能恶意程序会安装失败。
psdk.zip内容
然后这个psdk.zip压缩包,正好是我们之前在奇客PDF.exe里面看到的压缩包内容,这里他应该是利用unzipw32.dll动态库对psdk.zip解压并且释放到某个路径下去。
分析程序如何解压释放恶意文件
我们在Process Explorer中确实可以看到.tmp程序有调用到unzipw32.dll解压库。
可以看到解压后的文件被释放到了C:\Users\Administrator\AppData\Roming
目录。
观察进程历史信息
然后接着我们在Process Monitor中点击Process Tree,来查看进程历史运行的命令或历史进程信息等。
可以看到.tmp程序创建的历史进程和进程运行的命令
首先和我们分析的一样,他先运行了qk.bat关闭服务和结束进程等操作。
然后接着他运行了压缩包解压后释放出来的start.bat,看历史记录他应该是创建了Start4.0.exe,Start4.0.exe安装了fn服务,并且启动服务。
我们来看看Start.bat的内容,其中Start.bat的内容主要是为了兼容XP,如果目标系统是XP系统则会运行Start2.0.exe启动对应的.NET FrameWork2.0框架支持的程序,因为我虚拟机里面是Win7所以默认启动的是Start4.0.exe
对了这里补充下,查看服务的话可以按win+r运行,然后输入service.msc
运行后显示的这些就是服务了。
安装包分析总结
首先我们经过了一系列的静态分析还有动态分析后,对这个安装包大概流程可以做个分析了。
恶意代码分析
到目前为止我们对恶意程序的安装包已经有了一个大概的认知,其安装包主要的功能是释放恶意代码并执行,接下来我们就要详细的对恶意代码进行分析了。
Start4.0.exe 分析
查壳
程序并未加壳,显示程序用.NET开发,可以使用c#反编译工具dnspy
对其源码进行还原。
代码分析
打开dnSpy反编译工具拖入Start4.0.exe
,接着找到Main入口函数,他是程序执行的起点,程序执行的第一句代码是从Main入口函数开始。
Main函数分析
前两句代码都是系统自带的我们不需要关注,大概内容是设置程序窗口样式,可视化样式,我们重点从第三行代码开始入手。
CheckServerClentExe函数分析
分析这个函数我们能知道,程序会先获取FnClientService
进程,如果存在这个进程就会先将其关闭,然后再执行函数OpenSercerExe()
,其函数主要的内容是获取FnClientService.exe的路径并运行创建进程。
Start4.0.exe总结
由于C#程序被编译后并没有成为可运行的二进制文件,而是一种中间状态,所以被反编译后基本上能得到源码,所以这里我们就不需要再动态分析了,看代码基本上就能知道这个程序的基本行为了。
Start4.0.exe主要做的事情是关闭FnClientService.exe
进程,并运行本地的FnclientService.exe
程序。
FnClientService.exe分析
接着我们经过一系列分析,已经知道了其最重要的恶意程序是FnClientService.exe
,接下来对其就行动静态分析。
静态基础分析
首先我们还是对其进行基础的一个静态分析。
查壳
未加壳,显示为C#程序开发,可用dnSpy反编译
软件对其源码还原。
Strings字符串查看
使用方法
这里还没介绍Strings这款工具,这是微软开发的一款可以查看PE程序字符串的工具,可在官网https://docs.microsoft.com/zh-cn/sysinternals/downloads/strings处进行下载,因为前面分析的安装包实在是过大,用Strings查看其字符串内容太多。
软件使用方法
Strings.exe xxxx.exe //xxxx.exe表示你要分析的程序
敏感字符串发现
通过Strings分析我们发现了几处网址http://www.qikels.com/FnClientService/4.0/UpdateXml.xml
、zproxy.lum-superproxy.io:22225
、live.com
还有http get请求等关键字,接着还能发现一堆的类似代理池ip带端口号。
这种带xxx-master的文件夹一般都是在github上的开源项目zip解压后的目录,所以我们这里可以简单的进行数据挖掘,我们可以直接去github搜这个NewLife.Net的项目。
简单数据挖掘
从github项目源码介绍上大概可以知道这是一个很强的网络通信框架,所以我们这里可以简单的猜测这个FnClinetService是集成了NewLife的网络通信后门程序。
熟悉NewLife.Net框架
从简单的数据挖掘中我们知道了,其恶意程序主要用NewLife框架开发,那我们可以仔细的看看NewLife官方的文档对其框架进行熟悉,方便我们在分析FnClientService.exe的时候能够进行快速的定位。
NewLife.Net框架主要分为客户端和服务端,服务端负责监听一些端口然后接受客户端连接和数据,进行处理,然后响应。
我们这个恶意程序应该是一个客户端,然后由控制者,控制大量的客户端进行数据处理。
这里我们主要关注客户端就行,因为我们这边的程序应该就是一个客户端程序,接着我们了解了如下信息
var uri = new NetUri("协议:ip:端口");//NewLife用NetUri来创建http https tcp等协议对象并且包含ip地址 端口号
uri.CreateRemote();//创建连接 进行协议的连接
Xtrace.Log;//用Xtrace进行回显到控制台,或者输出到日志
client.Send()//用Send函数来发送数据给服务端
熟悉服务管理NewLife.Agent
NewLife.Agent应该是一个Windows的服务管理程序,用来安装、卸载、启动服务。
我们下载官方的例子,并且修改如下地方进行编译,编译后会生成一个exe的控制台程序,运行后用命令操作后会安装显示服务名称为:恶意代码分析
的服务,服务名为:TestService
。
其安装的服务,可以看到服务名称,显示名称,描述就是我们之前在代码里面改的值。
代码分析
MainClientService
因为我们熟悉了NewLife的一些框架,所以我们进行代码分析的时候,心里面就有一个大概的模型了,根据之前对框架的熟悉我们可以快速的定位到MainClientService
构造函数和StartWork
函数,其中一个用来显示服务名等信息,另外一个是业务的代码,这里他创建的服务名为:fn,服务显示名称为:fnservice。
StartWork
其业务代码会先创建一个计时器,然后执行ClientTools类的函数获取http://fei.wanhuacongzhong.top/get_fixed_ip
获取返回的Json数据,然后执行this.Closed()函数和this.Open()函数。
ClientTools.GetJson
请求网址,获取response(json格式),返回字符串。
Client.Close
应该是些关闭线程操作
Client.Open
应该是创建两个线程执行,其中调用了FnClient.dll
的代码,所以我们接下来最后就是要对FnClient.dll
进行分析了。
FnClientService.exe总结
通过一些列的分析从最基础的静态分析到后面的NewLife框架再到代码分析,我们已经摸透了这个FnClinetService.exe的功能和流程了,FnClientService.exe主要就是一个服务,类似与守护进程,为了重启后能自动运行他主要的功能都在FnClinet.dll
里面。
FnClinet.dll分析
经过上面分析,我们已经知道了恶意程序核心东西都在FnClient.dll里,下面我们通过静态来对FnClient.dll进行详细的分析。
我们还是对照者NewLife项目进行分析https://www.yuque.com/smartstone/blood/net_server,方便我们快速定位到想要的代码处。
因为我们在签名分析FnClientService最后的时候发现他会从FnClient.dll引入代码来创建SessionClient,所以我们先定位到SessionClient这个类,然后他会调用Start,Start其实调用的是StartSeesion.
StartSession
StartSession会从网址fei.wanhuacongzhong.top/get_fixed_ip
获取Json数据并且拿到服务器ip和端口号进行tcp的连接,接着还会接收来自服务器的命令进行处理。
SendValidation
发送受害者的系统信息,操作系统版本、恶意程序版本、通过系统版本组装一个签名Sing发送给服务器。
获取系统版本
利用获取的系统版本和文件版本和固定字符串进行MD5加密生成Sign
Session_Received
因为笔者在写这文章时候,这开发者还有公司都已经被端掉了,所以服务器什么的已经不能返回了,笔者在网上找了之前360分析文章的截图。
首先我们在上图中看到@@@@@@@
分割的字符串前面是一个数字,应该是任务id,然后后面是一个http请求,所以Session_Received
函数主要功能就是接受服务器发过来的任务,然后在本地完成http请求,来达到一个流量暗刷的目的.
ClientHandle
我们在ClinetHandle里面可以看到,传进来一个id,还有一个设置代理的端口号应该是8080,接着会创建线程执行Rend
函数.
我们在Session_Received
中new ClientHandle(id,this.httpProxy_Port)
代码中可以得知他会传进来一个任务和一个用于http代理的端口号8080,而这一切在Rend
函数中全部可以解释清楚了,恶意程序利用服务器派发的任务,然后通过代理上MainServer
中的ip和端口,最后利用http请求任务中的网址,达到用肉鸡代理代理池中的ip来暗刷流量的这一整个过程。
Rend
中还有个else分支,主要功能是如果上面的MainServer没有ip和端口就不代理访问任务,而是通过肉鸡本身来http请求访问任务.
HttpProxy
创建sock代理
最后总结
通过这个例子,我们学习了如何使用动静态分析Process Monitor、Process Explorer、WireShark等,并且通过线索找到开源项目然后利用C#反编译器进行代码分析。