一次病毒分析之旅

0x00 前言

这个病毒应该是比较简单的,别人给我的样本,让我帮忙看看,看样子是很早的一个病毒,针对Windows XP系统的,行为分析很简单,但是想着不能就仅仅分析关键点,要不就把整个结构给逆向出来,弄了两天,搞的差不多了,简单的记录一下。

 

0x01 基本介绍

整个病毒是4个文件组成:27.exe,27.dll,27.sys和27.dlx。当然都是设置的为隐藏属性,双击exe以后,exe文件和dll文件被复制到系统system32目录下,伪装起来,sys驱动文件复制到system32\drivers\目录下,删除原文件。

整个病毒大致的过程也就是:先是exe文件自己运行时解密出加密的字符串,然后读取自己的配置文件,再注册服务,加载驱动,在驱动中会进行对SSDT进行Hook来隐藏自己,把驱动和exe都注册成自启动服务,开机自启动。功能性的代码就在dll文件中,联网以后不停的发送数据包,然后逆着逆着发现,远程文件传送,远程桌面抓取......我去,这不活生生就是大灰狼的gh0st的功能代码吗?

非常简单的压缩壳,最开始直接就用OD把壳给脱了,然后就傻眼了,双击以后就直接崩溃了,没办法,只能带壳调了,发现真的是只能带壳调啊。整个字符串的解密代码全是用硬编码写的,一脱壳,偏移全变了,然后就崩溃。虽然是带壳调的,但是脱壳了就可以用上最喜欢的Ida了。

 

0x02 应用层分析

只能用OD带壳去跟整,庆幸的是壳比较简单,首先就是字符串的解密了,解密出来就是这样子,然后该暴露的都暴露了,IP好像都暴露了,哈哈。

                       

                       

然后就可以用解密出来的字符串了,然后读取复制的C:\Windows\System32\27.dlx配置文件,小于0x10,表明是第一次运行,写入配置文件。

                        

                        

在“0123456780ABCDEF”中选取字串生成27.dlx的内容

解密算法:

                      

调用WritePrivateProfileStirng写进27.dlx的值

               

接下来就可以看到非常明显的格式化

C:\Windows\System32\27.exe 

C:\Windows\System32\27.dll

C:\Windows\System32\drivers\27.sys

                 

然后还要伪装起来,将原来的27.exe伪装成System32下的win32.hlp文件

伪装的文件:

                                   

func_copyfile(这是我自己取的名字)的调用参数

在函数func_SQLClose()(自己的命名)中,将C:\Windows\system32\drivers\27.sys作为参数,调用了27.dll中的SQLClose()函数。之后就是路径的解析工作,然后开始操作注册表

这里第一次失败,因为没有这个键值

接着打开服务的键值:

创建目标子键:

创建HKEY_LOCAL_MACHINE\SYSTEM\STEUP\SERVICE的注册表项,添加27的键,在27键下设置的值

                 

                    

通过在ntdll.dll中搜索ZwLoadDriver() 加载驱动27.sys

                      

驱动加载完毕以后开始清理现场,删除无关的注册表项

也就是说在27.exe中调用27.dll中的SQLClose()函数,实际上做的最重要的工作就是创建了注册表项和加载了27.sys的驱动程序。

在驱动程序的DriverEntry中创建了设备对象和链接符号

回到27.exe之后,CreateFile打开 \\.\usbmouseb 设备对象,然后调用27.dll中的InitSQLConnect()函数。

我在这里之前没有往下分析驱动的代码,我还以为是真的是向USB驱动发送的控制码,然后还在WDK中找USB驱动像应用层提供的接口,傻傻的分析IO控制码,感觉好蠢。

找了好久还真给我发现了WDK中的说明,参考路径为Windows Driver KitàDevice and Driver TechnologiesàBus and Port DriversàBueseàUSBàReferenceàI/O Requests for Client Drivers。

实际上27.sys自己创建的符号链接就是这个\\.\usbmousb

在27.exe调用的27.dll中的InitSQLConnect实际上就是将cmd.exe作为input调用DeviceIoControl像27.sys发送了一个控制码。

字符串格式化的CommandLine,然后作为CreateProcess的路径创建进程:

 

创建的进程:

再一次格式化的结果:

接下来调用func_CreateServices() 参数列表:

CreateServiceS()的参数:

创建的服务:

之后调用ChangeSeevicesConfigA()来改变服务的配置:

调用ChangeServiceConfig2A()来设置服务的描述信息:

之后就是调用CreateServices()开启服务运行:

如果进程是以服务状态启动的,则会调用注册服务的处理函数,并启动服务线程

在服务线程中链接了27.dll并调用其中的SQLAlloc函数

在SQLAlloc中以27.sys为路径又创建了内核服务,便于27.sys加载

OpenService()默认的就是SERVICE_AVTIVE_DATABASE

在func_Uninstall中会调用CreateRemoteThread注入。

上面就是应用层大概的分析,有点乱,主要是自己在分析过程中记录的一些东西,免得把自己给搞忘,整个exe分析的主要函数如下:

                  

dll没有进行过多的分析,因为主要是远控实现的功能性代码,驱动基本上全都分析了,因为对于驱动比较熟悉,而这里的驱动也不难,所以分析过程中没有记录太多的东西,贴出了最开始分析的一点,有兴趣的话,我会在最后附上整个文件和我分析的idb文件。

0x03  简要的驱动分析

驱动比较简单,主要是刚开始记录的一些东西,后来发现没有记录的必要了,就没有记录了。

这里是DriverEntry中设置一些根据系统不同的偏移量

通过在Eprocess中搜索”System”字符串确定ProcName的偏移量:

这里确定KeServiceDescriptorTable硬编码0x5C7通过ntos中代码确定的,是在KiInitSystem()中调用的:

然后就是一些分析PE文件的HOOk工作:

Hook NtWriteVirtualMemory:

Hook NtQueryDirectoryFile ()和NtDeviceIoControlFile()

 驱动的大致函数就是这样的;

                 

0x04 小结

之前用OD和Ida主要都是用来做crack,找key,还真没弄过“这么大”的工作量,这应该算第一次吧。过程中也是新学到了很多东西,最主要的就是ida的各种“高级”玩法,当然这里的高级玩法是相对自己之前的"低级"玩法来说的,ida这个工具,怎么说呢,越深入越能感觉到它的强大!最深的感触大概就是在分析应用层的时候,如果一些手段自己玩过用过,会一看就很眼熟,稍微一思考就知道他想干什么,如果没有接触过,估计就得在那死磕了,如果不是之前弄过gh0st的远控程序,可能我现在还是那分析dll中的功能性代码呢!

 最后再安利一个工具,64位下的动态调试工具“xdbg”,目前x64可以用来汇编级调试的,我所知道的就只有这一个了,其中开源的Snowman插件挺好用的,和Ida的F5功能类似,github上有源码:https://github.com/smartdec/smartdec

 

病毒样本及分析文件:  https://files.cnblogs.com/files/lanrenxinxin/Desktop.7z

posted on 2016-01-04 20:58  _懒人  阅读(4921)  评论(17编辑  收藏  举报

导航