“鬼影”浅析 - 反病毒,信息安全,网络安全,反木马,病毒资讯平台,安全解决方案,电脑使用技巧,杀毒软件交流,anti-virus,民间反病毒联盟

访问原文


这个鬼影病毒相信大家都比较熟悉,但是最近似乎那个什么XX工作室已经宣布停止开发了,所以逐渐淡出的人们的视线,但是这个病毒的技术含量比较高,值得去学习……

////////////////////////////////////////////////////////////////////////////////
鬼影主体:WMPLAYER.EXE
MD5:f377e0f7c8f1a37cd5c92cf7aea3c8f7 WMPLAYER.EXE
编写语言:不明
类型:可执行文件

1, 开头首先获取一些运行时的必要函数,然后在系统分区下创建"\Program files\MSDN"文件夹
2,通过检测互斥体"Q360MonMutex"是否存在来判断系统中是否装有360安全卫士。

*(1)如果存在则首先从ntdll中获取ZwSystemDebugControl然后,通过ZwQuerySystenInformation获取ntoskrnl(在开启了PAE功能的电脑中ntkrnlpa.exe,下文中提到的Ntoskrnl同样如此)在内存中的基址,然后载入硬盘中的文件来进行计算SSDT表中函数的真实地址,通过ZwSystemDebugControl在R3中还原SSDT表(通常只要是个安全软件都应该拦截了ZwSystemDebugControl的写操作,360很早就拦了,甚至连读操作也拦了一部分,而其实360是没有SSDT HOOK的……
然后在从文件中搜索特征码找到PsLoadImageNotifyRoutine,PsCreateProcessNotifyRoutine,PsCreateThreadNotifyRoutine三个回调表,抹掉里面的回调函数。
(2)遍历进程,找到用户名为"SYSTEM"的卡巴进程(avp.exe),尝试打开进程(这点很疑惑,它用PROCESS_ALL_ACCESS打开的,最后却提升到PROCESS_DUP_HANDLE),然后创建一个事件,计算事件对象到进程PID的偏移,从avp中暴力枚举句柄,直到枚举到一个名为"lBaseNamedObjects\\f953EA60-8D5F-4529-8710-42F8ED3E8CDC"事件句柄,然后远程关闭这个句柄,让卡巴异常退出。
(3)遍历进程,校验进程的公司名,然后通过终止工作对象来终止一些安全进程。

3,释放衍生物到"\Program files\MSDN"文件夹下,有两个驱动。( 一些诸如系统文件夹名由主体在释放后写进衍生物中 )
4,通过互斥体"Jiangmin_WallNotify_Notify"判断系统中是否存在江民杀毒软件。

*如果存在则利用系统的"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DMusic",填写注册表参数为自己的驱动路径后加载驱动,修改注册表使用的是RegRestoreKey而不是RegSetValue,也可以绕过一部分安全软件的注册表监控,绕过江民以及一些HIPS的驱动拦截,如果不存在则通过WDM式的方法加载驱动,创建一个inf以用来加载自身驱动。 由于一般的HIPS只是挂钩ZwLoadDriver函数,而这两种方法都不走ZwLoadDriver,所以可以绕过很多HIPS,当然,现在闹得这么大,更新的HIPS或者杀软都会拦下这种加载方式
5,加载驱动之后,创建一个线程传入解密KEY到atixi.sys,然后延迟删去加载驱动使用的注册表项,然后病毒自删除。

//////////////////////////////////////////////////////////////////////////////////
病毒衍生物:atixx.sys
MD5:a817419a120931c4d31b4f603ab4b531 atixx.sys
编写语言:不明
类型:驱动

1,首先判断是引导时加载还是正常加载,首次加载为正常加载,对自身的部分字节进行解密来对抗静态分析。
2,通过自身传入的参数DriverObject得到InLoadOrderLinks链表的地址,获取Ntoskrnl的DriverSection,保存下这个DriverSection已经自身的DriverSection
3,判断自身的导入表中的函数是否已经在加载的时候被填写好,如果没有则自己从Ntoskrnl的DriverSection->DllBase获取Ntoskrnl基址然后获取需要使用的函数自己填充导入表
4,从自身的DriverSection->FullDllName中获取自身的全路径,读取数据进行解密和重定位,然后写到执行代码中的相应位置,对抗静态分析
5,创建一个系统线程,入口点代码执行完毕。

系统线程:
(1),获取自身线程的EThread->StartAddress,把它修改为系统函数的地址,伪装成系统自身创建的线程

(2),判断是否为引导时加载,是则长时间等待(等待explorer.exe启动)

(3),从PsTerminateSystemThread中用特征码匹配的方式获取PspTerminateThreadByPointer,然后获取KeInsertQueueApc和KiInsertQueueApc地址,最后挂钩KeInsertQueueApc(这个挂钩很有问题,很多时候会导致关机的时候蓝屏)

(4),从ntoskrnl中读取部分数据进行重定向以及修改以后,然后在HOOK的函数中使用,达到绕过原先安全软件的inlinehook的作用。

(5),从自身EPROCESS中获取ActiveProcessLinks双向链表的地址,遍历链表找到"explorer.exe"进程,然后附加到该进程,之后在进程分配内存安放可执行代码,从该进程中找到一个线程,修改KThread->KAPC_STATE->UserApcPending为1,使这个线程的用户态APC能够尽快交付,最后插入用户态APC到该线程。

*该APC会执行访问网络,下载木马等功能。 (代码未分析)

(6),从自身DriverSection->DllBase中获取自身的内存镜像,然后把从DOS头开始的512个字节用0填充,防止被暴力搜索内存PE头这种方式找到。
(7),线程进入死循环,隔一段时间执行一次扫描函数

*(1)该函数通过NtQuerySystemInformation获取系统中的进程列表,然后使用PsLookupProcessByProcessId依次获取每一个进程的EPROCESS,传入扫描函数

(2)扫描函数首先调用系统函数KdDisableDebugger来屏蔽系统内核调试器(如windbg)

(3)然后把被扫描进程的EPROCESS->Debugport置零,基本所有用户态调试器都依赖这个端口,因为这个操作无差别,所以会导致系统的所有用户态调试器失效

(4)从EPROCESS->SeAuditProcessCreationInfo中获取进程的全路径,打开以后获取该进程的公司名,然后进行算法比较,如果是一些安全软件的进程则通过终止所有线程予以终止 ( 使用的是HOOK时载入的Ntoskrnl部分原始代码,可以绕过一些安全软件的挂钩 ) ,有两个特殊的公司的进程是通过EPROCESS->ObjectTable枚举进程的句柄表,用算法匹配一个对象名,匹配成功则将其关闭。
“鬼影”浅析 - 反病毒,信息安全,网络安全,反木马,病毒资讯平台,安全解决方案,电脑使用技巧,杀毒软件交流,anti-virus,民间反病毒联盟_第1张图片


写了个小程序试了一下
点击查看大图


点击查看大图


//////////////////////////////////////////////////////////////////////////////////
病毒衍生物:atixi.sys
MD5:0a12657de987e74423f6205b47112f06 atixi.sys
编写语言:不明
类型:驱动


1,对自身数据进行解密,对抗静态分析,获取KUSER_SHARED_DATA->KdDebuggerEnabled的数值(在内核调试器启动时为1,没有启动时为0),将该数值与解密的KEY相加,修改KEY。
2,读取自身文件到内存使用刚才所说的KEY进行解密,如果KEY被修改,解密出来的代码与原来的代码大相径庭,导致在下面执行的时候蓝屏。
3,对一个系统处理器插入一个DPC,在IDT添加一个门,接受R3传来的参数修改第二次解密的KEY,对抗静态分析。
4,穿还原读写硬盘。
首先尝试使用IDE硬盘的0x1f0和0x3f6寄存器读写硬盘,如果失败则尝试使用0x170和0x376寄存器。如果都失败则访问PCI配置空间(0xcf8和0xcfc寄存器)获取硬盘IO端口。
如果依然失败,则访问PCI配置空间得到硬件的物理地址,将其映射到内存中,然后操作物理硬盘。(未证实)

(理论上可以穿透如影子系统,雨过天晴,冰点等开机还原软件,以及不还原MBR的一键还原软件,如GHOST。但是受硬件类型影响很大,在测试过程中,对于使用SATA硬盘的虚拟机无法写入)

(1)读取硬盘第一个扇区的数据(即MBR)到内存
(2)把真正的MBR写入第二个扇区。
(3)把病毒数据从第三个扇区开始写入,一共56个扇区(28672字节)
(4)把病毒使用的MBR写入第一个扇区


//////////////////////////////////////////////////////////////////////////////////
感染的MBR:
已经出现比较低级的免杀
1,通过修改0x413的值来增加系统预留内存大小。( 实现这部分的内存的常驻
2,复制数据到高端内存

3,挂钩BIOS提供的13号中断。( 该中断用来在引导时的硬盘数据管理,如读取和写入硬盘数据
判断是否是读操作,如果是,则在调用原中断例程之后,用特征码匹配读取缓冲区中的数据,扫描Ntldr中的BlLoadBootDrivers(特征码为0x74F685F0和0x3D80) 
4, 把原始MBR加载到内存,把控制权交回给原始MBR。
5,挂钩Ntldr!BlLoadBootDrivers下一行的代码
在DBR使用int 13加载Ntldr的时候,病毒重新获得控制权,得到Ntldr!BlLoadBootDrivers下一行的代码地址,进行挂钩。
6,挂钩Ntoskrnl!PspCreateProcess
Ntldr在BlLoadBootDrivers进入钩子处理例程,这时Ntoskrnl已经加载进内存,获取PspCreateProcess地址,进行挂钩
7,启动Atixx.sys实现复活
在钩子处理例程中,判断启动进程的PID是否是4( 即System.exe ),如果是则从感染扇区中读取Atixx.sys代码进行加载,就这样,病毒成功复活。




处理办法:
因为真正的MBR在第二个扇区,直接把第二个扇区的数据写在第一个扇区即可。(病毒没有对其进行保护)



“鬼影”浅析 - 反病毒,信息安全,网络安全,反木马,病毒资讯平台,安全解决方案,电脑使用技巧,杀毒软件交流,anti-virus,民间反病毒联盟_第2张图片


“鬼影”浅析 - 反病毒,信息安全,网络安全,反木马,病毒资讯平台,安全解决方案,电脑使用技巧,杀毒软件交流,anti-virus,民间反病毒联盟_第3张图片



[  本帖最后由 天涯一鸿 于 2010-8-2 20:12 编辑  ]

你可能感兴趣的:(逆向)