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
病毒样本及分析文件: http://files.cnblogs.com/files/lanrenxinxin/Desktop.7z