首页
社区
课程
招聘
[原创]机器狗病毒技术分析
发表于: 2008-5-15 23:36 23726

[原创]机器狗病毒技术分析

2008-5-15 23:36
23726
3年前在看雪论坛注册了个号,但嫌ID不好听,因此一直没有发过帖。后来想换个ID,却发现不能注册了。昨天来逛逛,发现能注册了,终于注册了个自己比较喜欢的ID。
分析比较长,仅贴出驱动部分的分析。完整版请参看附件。(已贴附件)
附件包含:
机器狗0506技术剖析.pdf
dll_unpack.idb
sys.idb
由于自己能力有限,以及基本没有动态调试。故难免有所纰漏或错误,请各位不吝指正。

摘要
机器狗新变种使用了一些流行的技术,包含了修复SSDT Hook、修复FSD Hook、并对一些系统还原软件进行有针对的Hook,使能达到突破还原软件保护的目的。做了那么多,最终目的还是下载大量的木马到用户的系统上。
一、修复SSDT
1、获取内核第一个模块名(XP系统:ntkrnlpa.exe)及SVA(System Virtual Adrress),映射一份ntkrnlpa.exe到内存中,根据导出表获取KeServiceDescriptorTable的RVA转换成VA,为X,根据重定位表信息获得需要重定位的地址Y,比较[Y]是否等于X,否则循环,是则比较[Y-2]的特征是否是5C7h,是则取[Y+4]到Z。即:
C705E046480040C94200mov ds:_KeServiceDescriptorTable, offset _KiServiceTable
因此,Z得到的是_KiServiceTable的地址。会对Z再通过重定位表验证,最后减去基地址得到KiServiceTable的RVA。
2、映射文件\\SystemRoot\\System32\\ntdll.dll到内存。根据导出表定位下列函数的RVA,转换成VA为X,取[X+1]得Y,Y即为该ZwXXX函数的序号。
ZwOpenProcess
ZwCreateThread
ZwWriteVirtualMemory
ZwRestoreKey
3、根据序号从内存映射文件ntkrnlpa.exe获得上列函数的RVA,并转换成相对于ntkrnlpa.exe模块的地址,为RealAddress。
4、根据内存映射文件ntkrnlpa.exe获得KeServiceDescriptorTable的RVA为X,X+SImageBase获得KeServiceDescriptorTable在系统中的SVA,根据上列函数的序号获得这些函数在系统中的SVA,即NowAddress。
5、判断RealAddress和NowAddress是否相等。如果不相等,则将RealAddress和NowAddress互换,以达到修复SSDT的目的。
二、获取关键函数的SVA
dll和驱动的通信是通过以下注册表value进行的。
\Registry\Machine\SOFTWARE\Microsoft\IE4\Data
1、Dll判断内核中是否存在这些模块,是则映射文件到内存。通过特征码找到函数偏移地址。转换成SVA后,记录入注册表。格式为 序号 地址,每条记录8个字节。
2、驱动读取该注册表value,把地址保存在全局变量中,以便以后调用。
3、有以下的函数:
classpnp.sys:ClassReadWrite
classpnp.sys:ClassDeviceControlDispatch
stpdrive.sys:???        //没有找到这个模块,未知驱动文件。
ntfs.sys:NtfsFsdFileSystemControl
fastfat.sys:FatFsdFileSystemControl
ntoskrnl.exe(NTKRNLPA.exe、ntkrnlmp.exe、ntkrpamp.exe):
Dr_FastCallDrSave_Offset,不是在函数首部,是在函数的中部。
atapi.sys:IdePortDispatch
三、修复FSD的FsdFileSystemControl Object Hook
1、获取\FileSystem\Ntfs或\FileSystem\FastFat的DriverObject。
2、判断_DRIVER_OBJECT.IrpFileSystemControlDispatch的地址是否和从注册表中读到的NtfsFsdFileSystemControl或FatFsdFileSystemControl相等,如果不相等,则恢复。
四、修复对DrFastCallDrSave的inline Hook
不经过检测,直接向从注册表获取的地址Dr_FastCallDrSave_Offset处写入5个字节的数据。2B E1 C1 E9 02这些数据为系统正常Dr_FastCallDrSave_Offset处的数据。
重复修复4遍
五、过还原系统
1、获取\device\Harddisk0\DR0的设备对象。
使用IoGetDeviceObjectPointer获取DeviceObject失败后,会枚举\device\Harddisk0的OBJECT_DIRECTORY_ENTRY,根据ObQueryNameString判断符号名来得到DR0的DeviceObject。
lea     ecx, [ebp+pObjectDirectroy]
push    ecx
push    0
push    0
mov     edx, ds:IoDeviceObjectType
mov     eax, [edx]
push    eax
push    0
push    0
push    40h
lea     ecx, [ebp+wszDeviceName]
push    ecx
call    ObReferenceObjectByName ;
对内核不熟,奇怪的是为什么参数为IoDeviceObjectType,而返回的是OBJECT_DIRECTORY_ENTRY?请大虾指点迷津。
2、获取还原软件的DriverObject
枚举\device\Harddisk0\DR0的AttachedDevice,根据对应的DriverObject的DriverName来获取还原软件设备的DriverObject。如果是影子系统,则会获取\Driver\Atapi的DriverObject。
\Driver\DeepFrz                冰点还原精灵
\Driver\snpshot                影子系统
\Driver\YzIdiot                网络还原精灵
如果没有找到上列还原软件,则走3-5,如果找到了则走6。
3、Inline Hook stpdrive.sys
直接将从注册表中读取的stpdrive.sys的某个偏移地址,写入一个字节C3,即Ret。由于没有stpdrive.sys文件,猜测是patch掉stpdrive.sys的主要功能,从而使之失效。
4、再次修复FSD Object Hook
同三(修复FSD的FsdFileSystemControl Object Hook)。
5、\device\Harddisk0\DR0对应驱动对象的Driver Object Hook
1)、修复DR0设备对应的IrpDeviceControlDispatch
判断_DRIVER_OBJECT.IrpDeviceControlDispatch是否和从注册表读出的ClassDeviceControlDispatch的SVA相等,不相等则修复。
2)、Hook DR0设备对应的IrpWriteDispatch
判断_DRIVER_OBJECT.IrpWriteDispatch是否和从注册表读取的ClassReadWrite的SVA相等,不相等则进行自己的Object Hook。
3)、fnIrpWriteDispatch_0
判断写入文件的内存是否满足条件,满足则直接调用SVA_ClassReadWrite进行写文件,不满足则调用原来的Old_IrpWriteDispatch。
条件算法比较苛刻,判断写入的文件头4个字节是否是4D5A9111,即被感染的Services.exe,如果满足,则直接调用SVA_ClassReadWrite进行写文件。并将Key置1。如果Key为1,则判断写入文件的尾部4个字节是否为4B435546,即病毒dll文件,如果是,则直接调用SVA_ClassReadWrite进行写文件。并且将Object Hook恢复到之前的状态(非系统状态)。
这种方法只进行对2个文件进行过还原的写入,写入完成后,会恢复其它还原软件的Object Hook。
还原系统的Object Hook
6、原理基本同5,Hook的对象为还原设备的Driver Object。
不同点:
1)、首先DrFastCallDrSaveHooK,同四(修复对DrFastCallDrSave的inline Hook)。
2)、修复atapi.sys的IrpInternalDeviceControlDispatch
根据_DRIVER_OBJECT.IrpInternalDeviceControlDispatch和从注册表读取的IdePortDispatch相比较,不同则恢复。
3)、写文件的方式不同
调用IofCallDriver,直接向前一个AttachedDevice发送IRP进行写文件操作。
4)、恢复Object Hook
除了恢复IrpWriteDispatch到之前的状态,也恢复Atapi.sys的IrpInternalDeviceControlDispatch到之前的状态。

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (43)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
老大。。给你加精了。。。有权限没?
没权限QQ叫我一下。。我帮你放附件上来。。。再转到调试区。。。

欢迎高质量的病毒分析报告
2008-5-16 00:51
0
雪    币: 254
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
有时候低级的也是很需要的
2008-5-16 08:23
0
雪    币: 124
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
谢谢笨笨雄,晚上来加附件。
2008-5-16 08:25
0
雪    币: 124
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
附件已上传,由于大小大于1M,故拆成2个附件。
2008-5-16 12:29
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6


不过希望上传原始样本
2008-5-16 12:57
0
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
又一只牛儿浮出水面了,哈。
2008-5-16 15:26
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
ID 不好听-》不发帖
偶得 求神拜佛 大牛都有个好名儿
2008-5-16 15:52
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
这年头,国内没几头“牛”
有的只是随便在哪个方面花了点时间就到菜鸟堆里装B的假牛。没有10年以上的经验积累,根本就别用“牛”这个字。某些小屁孩,以为花了几个月到一年时间再某些方面学了点东西,就到这里来装B,乱评论别人的劳动成果,“科普”什么的。

这些话不是针对楼主的,我很承认楼主的劳动成果。只是刚看见几个装B的家伙的帖子,我这种菜鸟火大。

楼主您能不能发下原始样本?
2008-5-16 22:06
0
雪    币: 124
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
我并不觉得自己牛,我身边比我牛的人就有好几个。因此我在不停地学习,在学习中做了点笔记。个人觉得idb文件是一种财富,分好类并建立索引,然后积累下来便是一种财富。只是觉得有些写出来了,发出来或许有点用。
个人觉得idb比样本更有价值。
pdf中前言部分已经提到没有原始样本,只有释放的dll和sys,如果需要的话,发邮箱给我,我发你邮箱里去。
2008-5-16 22:58
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
谢谢,算了,我还是找朋友要吧。个人习惯不太好,喜欢自己分析东西才放心。

前面一帖是被某些家伙惹毛了,在这里发泄出来。
跟楼主没关系的,请不要误解。
2008-5-17 03:04
0
雪    币: 280
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
学习了,希望多来些
2008-5-17 19:37
0
雪    币: 185
活跃值: (411)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢水大师的文章 学习ing
2008-5-17 22:11
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
为什么我的IDA打不开idb呢?
老是提示 this database has been created by a pirate version of IDA pro
谁能帮下哦?
2008-5-17 23:32
0
雪    币: 185
活跃值: (411)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
感谢水大师的文章 学习ing
2008-5-17 23:46
0
雪    币: 202
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
留下足印了,谢谢楼主。
2008-5-17 23:57
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
17
跟着楼主学习+膜拜

STPDRIVE.SYS是网维厂商的关键文件
这个东西应该属于更新的一代机器狗了 还+了ssdt修复
2008-5-18 07:32
0
雪    币: 214
活跃值: (46)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
很挫,绕不了360还原保护
水中雁,不就是写金山清理专家那个二货吗?

来看一条金山相关新闻:
http://hi.baidu.com/mj0011/blog/item/740b124fd3779233afc3ab99.html
2008-5-18 10:45
0
雪    币: 214
活跃值: (46)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
根本就没说到穿还原的点子上去,说来说去就是些什么还原恢复的,还恢复InternalDispatch??我看你这个2一辈子都不知道那个到底是什么Dispatch,就跟你某个同事一样。
2008-5-18 10:57
0
雪    币: 125
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
果然很偷很金山
2008-5-18 12:14
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
QIQI厉害。。。
2008-5-18 13:03
0
雪    币: 124
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
22
to doking
IDA版本问题,我使用的是IDA5.1,用以前的版本可能不兼容。

另外:
欢迎技术上的批评,但请不要进行人身攻击。
2008-5-18 13:56
0
雪    币: 22
活跃值: (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
完全看不懂..不知道要看哪方面的资料 才能学到相关知识..
2008-5-19 11:44
0
雪    币: 513
活跃值: (2258)
能力值: ( LV9,RANK:2130 )
在线值:
发帖
回帖
粉丝
24
qiqi是哪位来着,技术分析文章,有问题尽管指出,人身攻击的,你要是喜欢呢,欢迎直接pk,"灌水"我也喜欢。
2008-5-19 12:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
应该是"著名"的安全专家MJ
2008-5-19 13:45
0
游客
登录 | 注册 方可回帖
返回
//