灰鸽子分析报告(知名远程控制软件)
magictong 2012/2一、样本基础信息
MD5:cf6d4d8250e4ba8b5fe87fa4eb940ea8
大小:300,703 字节
文件名:999.v
壳信息:NsPack
解壳后信息:Borland Delphi 6.0 - 7.0
其它:(无)
调试运行环境:XPSP3
调试工具:OD IDA PEID XurTr
二、总结
1、本样本是一个非常复杂的,功能非常齐全的远控木马程序。
样本通过全局钩子的方式Hook一些常见的枚举文件,注册表,服务,进程的API,
使得ring3层完全不可见,达到有效的隐藏自己的目的。
命令接收端支持的命令非常齐全,
通过远程控制几乎可以做到计算机使用者直接操作计算机效果。
2、由于本样本是使用delphi写成,分析时时间比较长,
有些细节还没有完全搞清楚,譬如delphi框架的函数调用序列等等,
这些需要对delphi程序本身的编写有一定的深入了解。
3、通过对这个样本的分析,对delphi样本的一些特点和分析方式有了一定的了解。
4、样本释放的文件。
GServerd.exe(自身拷贝)
GServerd.dll(由GServerd.exe释放)
GServerdkey.dll(GServerd.dll释放)
5、下面的图是GServerd.exe的资源情况,通过对样本的分析,
我们可以知道样本自身没释放GServerdkey.dll,但是它有这个资源,
说明这个样本是一个可以配置的远控服务端。
三、样本基本行为流程
1、样本运行后,作为两种情况运行,如果是普通情形下则会拷贝自身到system32下,
名称修改为GServerd.exe,然后创建一个名为PigeonServer的 服务,
并且启动服务,然后进行自删除。
2、如果样本作为服务程序运行,则会从资源中释放文件GServerd0.dll到临时目录下,
然后创建一块共享内存用于通信,在服务子程中首先关闭IE 的连接向导,
关闭IE的默认浏览器检测,然后启动一个隐藏窗口的IE进程,通过远程线程注入的方式,
让这个IE进程去加载刚刚释放的GServerd0.dll 。
3、GServerd.dll其实这个DLL是完成主要功能也是最复杂的DLL,
但是因为没有灰鸽子的客户端,因此无法进行真实的动态调试操作,
但是也可以通过静态分析获知,这个DLL支持哪些远控操作。
这个dll是一个典型的使用delphi的窗口框架程序来写作的。
不过,这个DLL具体怎么去联客户端的没有分析出来
(就是怎么知道客户端要链接它,因为它自己是服务器,
要弄明白,需要弄清楚delphi窗口框架程序的调用序列)。
这个DLL首先是释放名为GetKey的PE资源文件(如果没有的话),
释放的文件实际就是GServerdKey.dll。设置GServerdKey.dll属性隐藏,系统和只读。
然后进行网络初始化,进入网络命令循环,会等待客户端的连接,
然后对客户端发送的命令进行解析,执行相应的命令。
4、GServerdKey.dll这个DLL实际上会被所有拥有消息循环的ring3进程加载,
它的工作原理是通过样本服务进程启动一个隐藏窗口的IE进程之后,
注入一个远程线程给这个IE进程,然后IE进程会加载这个DLL(GServerdKey.dll),
调用这个DLL的导出函数CreateObject,导出函数里面会设置两个消息钩子,
这样所有的拥有消息循环的进程就会加载这个dll,
然后在这个dll的DllMain里面会进行APIHOOK操作。而钩子函数里面则进行键盘记录操作。
Hook的API主要有
FindNextFileA FindNextFileW EnumServicesStatusA EnumServicesStatusW RegEnumKeyExA RegEnumKeyExW和一些native API
包括NtQuerySystemInformation,RtlGetNativeSystemInformation,ZwQuerySystemInformation。
除了样本服务进程启动的IE进程外,其他的进程还需要inlinehook两个API,
即NtTerminateProcesee和ZwTerminateProcesee。通过HOOK这些API,
使得样本释放的文件,创建的服务,启动的IE进程,创建的一些敏感注册表键值在ring3层不可见。
使得创建的无窗口ie进程不能被轻易在ring3层杀掉。
四、细节分析
--------------------------------------------------
[File1]【GServerd.exe】就是样本自身
--------------------------------------------------
作为非服务运行流程:
1、释放资源的函数入口。
1314B714 . 6A 0A PUSH 0A ; /ResourceType = RT_RCDATA
1314B716 . 50 PUSH EAX ; |ResourceName
1314B717 A1 60E61413 MOV EAX,DWORD PTR DS:[1314E660]
; |
1314B71C . 50 PUSH EAX ; |hModule => 13140000 (GrayUnPa)
1314B71D . E8 1A9BFFFF CALL JMP.&kernel32.FindResourceA> ; \FindResourceA
&
补充:综合编程 , 安全编程 ,