瑞星卡卡安全论坛

首页 » 综合娱乐区 » 活动专区 » 历史活动 » 论坛9周年活动专区 » [Simple Lions]第五关闯关
轩辕小聪 - 2010-3-29 18:04:00
本队队名:Simple Lions
第1个样本
软件环境:动态调试时使用VMWare虚拟机,虚拟机系统版本XP SP3,使用反汇编工具:OllyICE,IDA 5.0

1.exe是一个通过创建并应用虚假的新输入法,达到输入法的文件被加载并下载病毒的下载器,并伴随有相当的KillAV能力。该程序中用到的很多API都是动态获取的,给反汇编分析带来了更大的时间精力消耗。

1.exe主文件主要行为:
1. 尝试以CREATE_NEW的参数创建%systemroot%\system32\at.exe(这个文件是Windows系统的系统进程任务文件),如果创建成功(说明系统之前缺少这个文件),程序认为没有执行的环境,直接退出。如果创建失败,说明此组件是存在的,则继续下面的行为。
2. 将自身文件属性设置为系统属性加隐藏属性。
3. 创建一个新线程,执行一部分KillAV工作。其原理是使用EnumWindow搜索新窗口,在其回调函数中做手脚。当找到avp.EXE进程的窗口时,程序创建一个以"AV"为类名的新窗口,然后将avp.EXE进程的窗口的父窗口指定为这个新创建的窗口,之后使用DestoryWindow直接把新窗口销毁,这样由于avp.EXE进程的窗口已是这个新窗口的子窗口,则也会被销毁,显然是通过这种迂回的方式来实现关闭卡巴的窗口的目的。而当找到的窗口属于如下进程之一:

kswebshield.exe,kav32.exe,Mctray.exe,Rtvscan.exe,mcshield.exe


这时程序则会尝试用 PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION 的权限得到目标进程句柄,之后对目标进程从0x00001000到0x7FFFF000的所有可能的用户态内存页(每页大小为0x1000字节)强行调用VirtualFreeEx进行释放,直到遍历完毕或成功让目标进程崩溃为止。EnumWindow遍历完毕后,新线程就退出了。
4. 主线程在创建新线程CreateThread函数返回后休眠了12秒,似乎是在等待新线程完成,接下来,主线程创建并写入了%systemroot%\system32\winagi.ime(其中在文件后部写入很多"L"字符使得最后文件大到12MB),并将其创建时间和最后修改时间都指定为2005年8月17日20时整。
5. 将winagi.ime注册为系统的输入法,输入法名字为"中文(扩展)",然后对当前所有窗口发送WM_INPUTLANGCHANGEREQUEST消息,将其输入法状态变为这个新的“输入法”,从而实现了这个winagi.ime被加载。
6. 激活新“输入法”的键盘布局,并在注册表
[HKEY_CURRENT_USER\Keyboard Layout\Preload]
写入名为1的项,键值为该键盘布局名称,即指定该键盘布局为默认的键盘布局。
7. 把新“输入法”指定为系统默认的输入语言,从而实现每次开机的加载。
8. 将winagi.ime的文件属性设置为隐藏和系统属性。
至此1.exe主文件的进程退出,由winagi.ime实现核心功能。

winagi.ime是表面上看是输入法文件,其实是带有相当强的KillAV功能的下载模块。由于要以输入法文件加载,该文件中有一些例行的输入法插件需要的内容,在此只说明它的病毒行为内容:
1. winagi.ime被加载后,首先判断自身所在进程的文件名中是否包含"explorer.exe",如是(一般说明自身进程就是explorer.exe),则执行一个KILLAV函数(自ime文件内存地址偏移0x4310处开始)进行利用驱动破坏安全软件的行为(具体行为下面再说明),并启动三个新线程(三个新线程的行为下面再说明),如不包含"explorer.exe",则跳到下一步。
2. 之后程序判断自身所在进程的文件名中是否包含"360safe.exe",如是,同样执行KILLAV函数,不是则又跳到下一步。
3. 再度判断自身所在进程文件名是否包含其他的安全软件文件名,列表如下(为免太占篇辐,我列出来时以逗号分隔,按判断顺序排列,其中avp.exe判断了两次)

360tray.exe,avp.exe,ravmond.exe,avp.exe,rstray.exe,kwstray.exe,kavstart.exe


如果包含其中一个,说明被加载在其中一个进程中,这时程序会调用ExitProcess促使自身所在进程退出,从而达到杀掉安全软件进程的目的。
到此入口点函数返回,剩下新创建的三个线程在跑。

前面提到的KILLAV函数,在病毒加载于explorer.exe或360safe.exe进程时会被调用,其主要行为是:
1. 释放驱动文件%systemroot%\system\pcii.sys,并将其注册为驱动服务(启动方式为手动),服务名及显示名均为pcii,并随即启动该服务。接着尝试打开驱动创建的符号连接设备\\.\WCCCI,得到设备句柄,之后删除%systemroot%\system\pcii.sys文件。
2. 为自身进程提SeDebugPrivilege,然后开始遍历系统中的进程。如发现系统中的如下进程

360tray.exe,ekrn.exe,egui.exe,nod32krn.exe,nod32kui.exe,360Safe.exe,safeboxTray.exe,360safebox.exe,krnl360svc.exe,ZhuDongFangYu.exe,rstray.exe,ravmond.exe,360sd.exe,avp.exe,360rp.exe,kavstart.exe,kwatch.exe,kswebshield.exe,Mcshield.exe


则会通过DeviceIoControl与驱动设备交互,IOCTL为0x22200C,将相应进程的完整文件名(UNICODE编码,UNC格式)传给驱动,由驱动将其文件强制删除(驱动的原理后面会说明)。对于以上列表中除了avp.exe外的所有目标进程,程序会再次调用DeviceIoControl,IOCTL为0x222008,将其进程ID传入,使得驱动用另一种方法促使目标进程崩溃。
3. 对360进行特殊照顾,尝试访问注册表
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\360Safe.exe]
中的Path键值得到360的安装文件夹路径,查找文件夹下是否有如下程序(列表中多了一\的是子文件夹中的程序)

360Safe.exe,safemon\360tray.exe,safemon\360realpro.exe,deepscan\DSMain.exe


对于以上文件,存在的则再度调用驱动设备IOCTL为0x22200C的功能将其文件强制删除。
4. 完成了以上动作后,停止并删除了驱动服务,自此KILLAV函数返回。

病毒加载于explorer.exe进程时,会创建三个新线程,这三个线程的功能分别为:

线程一,用于对抗旧版本的IceSword,调用一个死循环,每隔6秒钟发起一次对旧版本IceSword中有"IceSword"字样的那个子控件的窗口的查找,一旦发现,则使用向IceSword窗口发送WM_CLOSE消息并对弹出的确定框模拟按下Enter键的方法,达到一旦旧版IceSword启动则会被其关闭的效果。

线程二;用于对安全软件进程进行IFEO劫持,同样是一个死循环,每隔8秒钟重写IFEO项目,被IFEO劫持的目标进程有:

RAV.EXE,ekrn.EXE,egui.EXE,VPC32.EXE,DO360sd.EXE,pckav32.EXE,VPTRAY.EXE,RSTray.EXE,kissvc.EXE,Iparmor.EXE,KVMonxp.KXP,RavMonD.EXE,KVSrvXP.EXE,360safe.EXE,KpfwSvc.EXE,Nod32kui.EXE,VsTskMgr.EXE,Navapsvc.EXE,mcshield.EXE,ccEvtMgr.EXE,kavstart.EXE,krnl360svc.EXE,KSWebShield.EXE,360rpt.EXE,SuperKiller.EXE,arpfw.EXE,360tray.EXE,360safebox.EXE,safeboxTray.EXE,AvMonitor.EXE,Ravservice.EXE,RAVTRAY.EXE,RavMon.EXE,IceSword.EXE,KVWSC.EXE,RavTask.EXE,KRegEx.EXE,Frameworkservice.EXE,Mmsk.EXE,Ast.EXE,WOPTILITIES.EXE,Regedit.EXE,ANTIARP.EXE,KASARP.EXE,kwatch.EXE,KAVPFW.EXE,Runiep.EXE,GuardField.EXE,GFUpd.EXE,Rfwstub.EXE,rfwmain.EXE,RavStub.EXE,ScanFrm.EXE,RsAgent.EXE,RsMain.EXE,Rsaupd.EXE,rfwProxy.EXE,rfwsrv.EXE,SREngLdr.EXE,ArSwp.EXE,TrojanDetector.EXE,Trojanwall.EXE,TrojDie.KXP,PFW.EXE,HijackThis.EXE,AutoRun.EXE,VsTskMgr.EXE,naPrdMgr.EXE


所有IFEO的debugger键值都为"ntsd -d"。

线程三:这才是病毒真正有用的线程,即实现木马下载器功能。先是创建了名为"PPKK"的互斥体,然后将自身内存中加密的下载列表URL地址解密,得到下载列表URL地址为http://t.dbakd.com/s.txt,将其下载到%systemroot%\Fonts\sybs.ini,如果第一次下载不成功,隔一分钟再度尝试下载,会重复尝试大约10次。下载下来的列表还是加密的,经过对其中的字符串进行解密(每个字节加0x0A),把每个样本下载到当前用户Temp文件夹下的abb*.tmp(*部分为任意)并运行。,解密后的下载列表为

http://abl.bee.pl:85/d/ce.exe
http://abl.bee.pl:85/d/1.exe
http://abl.bee.pl:85/d/3.exe
http://abl.bee.pl:85/d/nn.exe
http://abl.bee.pl:85/d/tl.exe
http://abl.bee.pl:85/d/6.exe
http://abl.bee.pl:85/d/q.exe
http://abl.bee.pl:85/d/px.exe


pcii.sys驱动程序通过服务加载,在Ring0层为病毒提供删除安全软件的文件和使其进程崩溃的功能。

其行为:
1. 驱动加载时创建设备"\Device\YESFAN",创建成功则输出"OK"的debug信息,并创建符号连接"\??\WCCCI";创建不成功则输出"BcDEFGHIJ"的debug信息。
2. 该设备主要功能是通过响应由应用级程序发起的DeviceIoControl的调用(即IRP_MJ_DEVICE_CONTROL类型的IRP)。
3. 响应DeviceIoControl的调用的IOCTL有两个,一个是0x222008,用来使进程崩溃,一个是0x22200C,用来强制删除安全软件的文件。
4. 当IOCTL为0x222008时,应用层传入的是一个需要被结束的进程的ProcessId,驱动通过调用PsLookupProcessByProcessId得到其EPROCESS结构指针,并对其调用MmUnmapViewOfSection尝试解除其用户态ntdll.dll的Section的映像,从而达到使得目标程序崩溃退出的目的。对ntdll.dll的映像地址没有利用动态获取,而是采用了0x7C920000和0x7C930000这两个地址来尝试,这两个地址分别为ntdll.dll在Windows XP和Windows 2003系统的默认加载基址。
5. 当IOCTL为0x22200C时,应用层传入的是一个满足UNC标准的UNICODE编码的文件名全路径,驱动通过调用IoCreateFile得到文件句柄,对句柄调用ObReferenceObjectByHandle得到其FileObject对象,并调用IoGetRelatedDeviceObject得到其文件系统设备的DeviceObject。之后驱动自行构造一个类型为IRP_MJ_SET_INFORMATION,FileInformationClass为FileDispositionInformation的IRP结构,将与文件相关的内容填充此结构,最终直接使用IofCallDriver对文件系统设备的DeviceObject传递IRP,从而实现直接删除文件的目的。注意到在调用IofCallDriver之前驱动对该FileObject.SectionObjectPointer这个数组的ImageSectionObject和DataSectionObject成员均清0,从而使文件系统设备认为这个文件已经没有存在未解除的映像,而在收到IRP后直接删除文件,从而达到强删文件的目的。

更详细的见idb。

用户系统信息:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; aff-kingsoft-ciba; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MAXTHON 2.0)

附件: 样本1的idb.rar
轩辕小聪 - 2010-3-29 18:08:00
第2个样本
软件环境:动态调试时使用VMWare虚拟机,虚拟机系统版本XP SP3,使用反汇编工具:OllyICE,IDA 5.0

2.exe是一个修改浏览器主页,下载并利用QQ聊天窗口的文件传送功能传播病毒,以及试图利用MS08-067漏洞开启后门的病毒程序。

2.exe原始文件的主要行为:
1. 尝试以CREATE_NEW的参数创建%systemroot%\system32\taskmgr.exe即任务管理器程序,如果创建成功(说明系统之前缺少这个文件),程序认为没有执行的环境,直接退出。如果创建失败,说明此组件是存在的,则继续下面的行为。
2. 查找自身文件名中是否有"ont",第一次运行结果是没有,尝试创建文件夹C:\sa.exe,第一次成功了,设置其属性为只读和隐藏。
3. 提SeDebugPrivilege,运行"cmd /c taskkill /im alg.exe /f",停掉系统正在运行的alg.exe进程(包括真正的系统进程alg.exe)
4. 将自身文件copy到%systemroot%\Fonts\alg.exe,并运行,之后调用"cmd /c del 自身文件名",并退出。

之后%systemroot%\Fonts\alg.exe运行,则原来的第2步比较现在变成文件名中有"ont",则将http://dxu.xorg.pl/a.jpg下载到%systemroot%\Fonts/bp.ini,结果因为这个链接失败了,下载失败,程序直接结束了。所以以下部分都是强制改变程序流程,推测如果bp.ini创建成功后程序会做什么。

如果成功下载,则创建几个线程:
线程1:
读取bp.ini中的index字段的"homepage"配置,如读取不到,则默认为"www.07129.com",之后访问注册表以下键值
[HKEY_CLASSES_ROOT\CLSID\{871C5380-42A0-1069-A2EA-08002B30309D}\shell\OpenHomePage\Command]
检查是否有money字样,如果没有,则设定其键值为
"C:\Program Files\Internet Explorer\iexplore.exe" www.07129.com

线程2:
读取bp.ini中的index字段的"homepage"配置,如读取不到,则默认为"www.07129.com",之后访问注册表以下路径
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main]
将Start Page键值改为www.07129.com

线程3:
读取bp.ini中的file字段的"send"配置(如读取不到则默认为"0"),一旦找到,经过解密后,检查是否有"ht",有则认为是有效地址,调用URLDownloadToFileA将它下载到%systemroot%\Fonts\SA.PIF
如果下载成功,则释放并运行%systemroot%\Fonts\tenclent.exe。

线程4:
1. 读取bp.ini中的buffer字段的addr配置(如读取不到则默认为"0"),读不到就退出。一旦读到,经过解密后,检查是否有"ht",有则认为是有效,从程序自身内容中释放%systemroot%\Tasks\explorer.exe。
2. 读取系统主机连接到的DHCP服务器地址,尝试连接其445端口,如果成功,则调用ShellExecute运行%systemroot%\Tasks\explorer.exe,把DHCP服务器IP地址作为参数传入,这个过程连续循环256次。

创建完了这几个线程后,主线程在注册表创建如下路径
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\policies\explorer\run]
在其中创建名为360safe的键值,指向%systemroot%\Fonts\alg.exe,从而实现以后随系统启动。

至此主文件%systemroot%\Fonts\alg.exe退出。

%systemroot%\Fonts\tenclent.exe文件行为:
该文件为UPX加壳,直接OD手脱,脱后可以看出是Delphi所写的Win32程序,由于Delphi特殊的函数调用规范的关系,阅读起来要比较费心,不过幸好该程序很简单,这个程序实际达到的效果是自动向QQ聊天窗口拖放包含病毒文件的压缩包,从而发起文件传送来欺骗好友下载,来达到传播病毒的目的。
具体来说,tenclent.exe初始化后创建消息循环长驻内存,设置一个定时器,超时时间为20秒,当定时器被触发时,执行一个EnumWindows操作遍历当时窗口,因此这个遍历窗口的回调函数就是关键。
1. 回调函数判断得到的窗口类是否是Windows提供的最常见的WC_DIALOG,也即类名"#32770"的类,如是,判断其窗口标题中是否有“与”字和“中”字,且“中”字比“与”字位置靠后两字节以上,也即是针对QQ聊天窗口“与XX聊天中”。
2. 为避对同一窗口重复寻找和操作,程序建了一个窗口名称列表,每个之前未找到过的窗口标题被新加入列表中,而对已在列表中的旧窗口则不做操作。
3. 对于新窗口,在将它加入列表后,程序将%systemroot%\Fonts\SA.PIF复制到用户Temp文件夹,命名为"密*码*s*e*x*张*柏*芝*艳*照.rar"(星号是我加的,以防论坛屏蔽)
4. 找该新QQ聊天窗口中的一个类名为"#32770"的子窗口,找到后构造并向其发送WM_DROPFILES消息,即相当于将上面提到的rar文件拖放到该窗口,即会发起文件传送。
5. 如果对方此时不在线,则QQ聊天窗口将会弹出标题为"对方不在线"的子对话框,提示用户是否使用离线传输,对此,程序在第4步之后,马上发起一次EnumWindows的调用,找到这个对话框,进一步找到对话框中文本为"否(&N)"的Button控件,模拟按下这个按钮,从而关闭这个对话框。


%systemroot%\Tasks\explorer.exe是一个Win32控制台程序,外层壳为UPack
Upack比较简单,OD载入单步两下后的eax就是新EP:
00401018 >  BE B0114000    mov    esi, 004011B0
0040101D    AD              lods    dword ptr [esi]
0040101E    50              push    eax                              ; explorer.00404015
于是在00404015处按F4,直接就过了这层壳。内层还有一层解密数据的,单步到这里:
00404057    68 7B404000    push    0040407B
0040405C    64:FF35 0000000>push    dword ptr fs:[0]
00404063    64:8925 0000000>mov    dword ptr fs:[0], esp
0040406A    CD 2D          int    2D
0040406C    C3              retn
这里一个用int 2D来对付调试器的小把戏,直接把EIP改为异常处理程序地址0040407B,下面的就没什么难度了,OEP在00401992处。

脱了壳之后发现,%systemroot%\Tasks\explorer.exe实际上是08年流行一时的MS08-067漏洞利用工具,使用的方法正是把目标服务器IP地址当参数传递,如果目标主机存在漏洞,该工具将能使用RPC使目标主机打开4444端口使得他人可以控制目标主机。

附件: 样本2的idb.rar
轩辕小聪 - 2010-3-29 18:11:00
第3个样本
软件环境:动态调试时使用VMWare虚拟机,虚拟机系统版本XP SP3,使用反汇编工具:OllyICE,IDA 5.0

3.exe是前两年流行过的比较强悍的木马下载器,同样有比较强的KillAV功能,通过修改由svchost.exe加载的服务的ServiceDll文件来实现其dll文件的启动。

3.exe主要动作
1. 抗拒调试的功能,当发现自身被调试或系统中存在OllyDbg.exe、OllyICE.exe、PEditor.exe、LordPE.exe、C32Asm.exe、ImportREC.exe等这些反汇编逆向调试常用工具的进程时,病毒自行ExitProcess退出。后面它产生的dll加载后也多处采用了这个功能。
2. 停止系统的以下服务:

Schedule,AppMgmt,srservice,W32Time,stisvc


3. 将自身102号RES类型资源释放到用户Temp目录命名为dll*.dll,其中*号部分是任意数字。
4. 调用LoadLibrary将创建的dll文件加载。
5. 在用户Temp文件夹生成一个任意数字名的批处理文件,实际在原始文件进程退出之后能够删除原始文件。
6. 直接调用ExitProcess退出。

dll文件的行为:
1. 比较自身是否在svchost.exe进程中,若不是,说明是首次运行在原始文件进程中,这时进行一些对抗安全软件和保护自身的操作,具体调用的函数为方便标为ANTIAV1函数,调用时传入参数0。由于此函数还在其他地方被调用,具体工作后面再说。之后创建一个svchost.exe进程,当系统时间在2008年12月1日之前时,将自身dll文件注入该svchost.exe进程,然后就退出了。
2. 被注入svchost.exe进程的dll实例,DLLMain函数将会创建一个新线程后返回,则核心动作在这个新线程(设为Thread2)中。

Thread2线程动作:
1. 创建一个名为NSDownLoader25Vip20081129的互斥体,如果失败且发现已有旧实例在运行,则判断自身dll文件是否在system32文件夹中,如果不在就ExitProcess结束自身进程,如果在就退出线程。
2. 创建新线程,线程函数仍为ANTIAV1,但这次参数为1。
3. 创建新线程,设为Thread3,功能是对安全软件文件创建IFEO项,具体的列表后面再说。
4. 尝试通过读写\Device\PhysicalMemory的方法隐藏自身进程。
5. 调用CoInitializeEx。
6. 连续创建7个新线程,这里设为Thread4至Thread10,具体功能后面描述。然后Thread2就退出了。


ANTIAV1函数执行保护自身进程或对抗安全软件的功能,具体功能:
1. 利用关闭事件\BaseNamedObjects\6953EA60-8D5F-4529-8710-42F8ED3E8CDA的方法促使卡巴退出(思路完全是按照网上早已有的代表码)
2. 将自身102号RES资源释放为%systemroot%\system32\Nskhelper2.sys,并将其注册为驱动服务,服务名及显示名为NsRk1,启动类型为手动。此驱动的入口函数在创建Device的同时,还对NtOpenProcess和NtTerminateProcess两个函数进行了SSDT HOOK,目的是在之后可以保护病毒的进程不被他人访问和杀掉。
3. 访问驱动生成的设备\\.\NsRk1,通过发起IOCTL为0x22E14B的DeviceIoControl操作来还原SSDT。
4. 当传入的参数设置为1时,也即dll处于svchost.exe的进程中时,发起IOCTL为0x82418的DeviceIoControl操作,将dll所处的svchost.exe进程的ProcessId发给驱动,这样驱动通过PsLookupProcessByProcessId得到其EPROCESS对象指针并保存起来,这样在NtOpenProcess和NtTerminateProcess的SSDT替代函数中可以以此为依据保护该进程不被其他进程干扰或结束。
5. 按照一个安全软件进程列表来遍历检查系统所有进程,当发现列表中的进程时,采用两种方法试图结束其进程,第一种是先与驱动合作,试图还原对内核NtOpenProcess函数头10个字节可能存在的inline hook(方法比较啰嗦,涉及多次DeviceIoControl的通信,第一次IOCTL=0x222400,驱动返回给用户态内核NtOpenProcess函数地址,用户态映像nt内核文件后通过重定位找到这个位置后,copy它的前面10字节代码,然后第二次IOCTL=0x222440把NtOpenProcess地址返回给驱动(我认为这一步多余),第三次IOCTL=0x222454传入将要修改的字节数即10,第四次IOCTL=0x222414传入保存10字节原始代码的内存指针,这时驱动会用这10字节原始代码覆盖掉内核原来的内容),然后采用创建名为NsDnldrKillProcess的Job对象,再把目标进程和它关联后删除Job对象的方法来尝试结束进程。当第一种方法不凑效,则选择使用IOCTL=0x82420的DeviceIoControl调用将目标进程句柄传入驱动,驱动调用之前从SSDT表获得的原始的NtTerminateProcess函数来结束进程。这里被ANTI的安全软件名称指针列表太长,就不列了,在idb里标为ANTITarget,在偏移0x8130位置开始。

Thread3功能:
为ANTITarget列表中的安全软件文件名创建IFEO项,debugger键值指向svchost.exe。

Thread4功能:
将本机MAC地址和操作系统版本发送出去做感染统计,目标地址形如
http://count.realuu.com/10/count.asp?mac=XX-XX-XX-XX-XX-8A&os=WinXP&ver=2.5.1129&temp=YYYY&key=ZZZZ
若连接不成功,则每过1分钟再重试一次。

Thread5功能:
下载器线程,把http://txt.50nb.com/update/count.txt下载到用户Temp文件夹,如成功,对其中的每行URL地址把病毒下载下来,然后尝试提SeDebugPrivilege并获得explorer.exe进程的权限令牌以explorer.exe进程的用户权限运行下载的病毒。这里这个下载列表链接当然早已失效。

Thread6功能:
在系统当前除A和B外的所有可移动或固定介质盘符根目录放入autorun.inf和为自身dll文件复本的system.dll,system.dll设置隐藏和系统属性,autorun.inf内容为:

[autorun]
shell\open\command=rundll32 system.dll,explorer
shell\explorer\command=rundll32 system.dll,explorer


Thread7功能:
将自身的105号RES类型资源释放到%systemroot%\system32\appwinproc.dll,并进入一个死循环,不停地试图将这个dll注入explorer.exe。
appwinproc.dll注入explorer.exe后,将注册一个全局的消息钩子,这样它将被大部分用户进程加载,在其钩子函数中,当碰到按下或弹起鼠标左键的消息或是按下回车键的消息时,它会获取消息所在窗口(也是这时它的实例所在的进程的窗口)的最顶层窗口的标题,当发现其中包含一些安全软件的字眼时,它会直接调用TerminateProcess终止自身进程(也即目标进程)这样不但有这些标题栏的安全软件窗口进程会被关闭,当浏览器标题栏出现这些字眼时也会被关闭。
被它列入的字眼有:

超级巡警,360安全卫士,奇虎,江民,杀毒,木马,专杀,下载者,瑞星卡卡,NOD32,卡巴斯基,瑞星,金山毒霸


Thread8功能:
修改hosts列表,将安全软件厂商的网站域名指向127.0.0.1,以达到屏蔽网站的目的。被屏蔽的网站有:

www.360.cn
www.360safe.cn
www.360safe.com
www.chinakv.com
www.rising.com.cn
rising.com.cn
dl.jiangmin.com
jiangmin.com
www.jiangmin.com
www.duba.net
www.eset.com.cn
www.nod32.com
shadu.duba.net
union.kingsoft.com
www.kaspersky.com.cn
kaspersky.com.cn
virustotal.com
www.kaspersky.com
www.cnnod32.cn
www.lanniao.org
www.nod32club.com
www.dswlab.com
bbs.sucop.com
www.virustotal.com
tool.ikaka.com
360.qihoo.com


Thread9功能:
1. 访问注册表服务项
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Browser]
如果这两个服务被禁用,则将启动类型改为手动,然后启动Browser服务。注意之所以要把lanmanserver(也即Server服务)也解禁,是因为Browser服务是依赖于它的。
2. 在用户Temp文件夹生成随机数字文件名的txt文件,将自身文件的每一字节变换为16进制表示的字符连着写入其中。
3. 创建新线程,该线程将自身104号RES资源也释放到用户Temp文件夹,并再创建一个新线程,新线程LoadLibrary将刚释放的文件加载并调用其Ms0867函数,对系统主机所在网段的DHCP服务器进行MS08-067漏洞攻击,一旦攻击成功,目标服务器将打开4444端口,这时本地方通过telnet连线并将几行telnet命令传送出去,这些命令将使远程主机将变成16进制表示的文件内容重新组装起来,并调用rundll32.exe加载之,从而实现通过网络传播的目的。

Thread10功能:
选择以下列表

schedsvc.dll
appmgmts.dll
srsvc.dll
w32time.dll
wiaservc.dll


中不与自身dll文件名重复的一个,作为覆盖的目标,从而实现通过已存在的服务加载的目的。覆盖文件方法是将自身103号RES类资源释放到系统文件夹,名称为NsPass*.sys,带星号的是数字,与选中的文件名在上面列表中的排序一致,该驱动是机器狗常用的驱动,即通过底层文件操作绕过系统对文件的保护,从而病毒通过它实现了覆盖ServiceDll。

Nskhelper2.sys的功能已在ANTIAV1函数中说到了,因此不再赘述。

附件: 样本3的idb.rar
轩辕小聪 - 2010-3-29 18:13:00
第4个样本
软件环境:动态调试时使用VMWare虚拟机,虚拟机系统版本XP SP3,使用反汇编工具:OllyICE,IDA 5.0

4.exe是一个释放dll文件利用系统输入法和Winsock2服务供应者实现dll文件加载的,有一定的KillAV功能的木马下载器。


4.exe主文件行为:
1. 释放自身102号的BIN类资源到%systemroot%\system32文件夹的mswsock32.dll和imedllhost09.ime。实际上认真观察会发现,这时写入的两个文件头部不是MZ,而是NZ,因为资源里本身就是这样,所以这里变成了DOS文件标志。
2. 将imedllhost09.ime头部的1字节改为M,终于成了正常的PE,然后将imedllhost09.ime复制到mswsock32.dll。
3. 将imedllhost09.ime注册为输入法,名为"中文(中国)-美国键盘"。
4. 加载mswsock32.dll,调用其aaa函数。
5. 如果第4步的调用返回0,则尝试获取系统的所有的输入法键盘布局,找其中为"中文(中国)-美国键盘"且文件名是imedllhost09.ime的那个,如果找不到,再尝试一次,两次都找不到就退出。
6. 如果第3步成功,将新加入的病毒输入法设置为系统默认输入法。
7. 如果前面成功,特殊对付360,此函数设为ANTI360,功能后面提到。
8.上面2到7步循环进行10次
9. 写入%systemroot%\system32\del09.bat并运行实现删除自身,之后原样本就返回。

ANTI360函数原理:
1. 以360窗口类"Q360SafeMonClass"为依据找360窗口,如果找到,向其发送WM_INPUTLANGCHANGEREQUEST消息强制将其输入法转化为病毒输入法,以实现病毒在其中加载。如果主窗口不一定能行,它会也遍历其子窗口发消息,因为360总不可能把所有子窗口的处理例程都做手脚。
2. 如果在找窗口的过程中找到了某个窗口,那么把自身文件104号IDR_SYS1类资源释放到%system%\system32\KillIS.sys,运行命令行"rundll32.exe %systemroot%\system32\imedllhost09.ime,bbb 目标进程ID"来ANTI它。从这个sys名字看,是对付IceSword?但是我发现3.exe其实没有这个资源,因此驱动实际上不会创建和加载。


mswsock32.dll将被指定为系统Winsock2服务供应者(默认的Winsock2服务供应者是mswsock.dll),从而实现自启动。
而imedllhost09.ime则被注册为系统默认输入法从而实现自启动。
mswsock32.dll和imedllhost09.ime是相同的内容,为实现核心功能的组件。其主要的输出函数有DllMain(入口点)函数、WSPStartup函数、aaa函数和bbb函数。

DllMain函数的行为是当自身不位于svchost.exe或alg.exe进程中时,启动一个新线程,线程函数我标记为CenterThreadProc,是核心功能函数,其功能下面会有详解。当位于svchost.exe或alg.exe进程中时DllMain函数则不启动CenterThreadProc。

WSPStartup函数在做完例行的初始化后也同样启动新线程执行了CenterThreadProc函数。


CenterThreadProc函数动作:
1. 程序中生成两个需要对抗的安全软件进程名称列表。
列表1包括自我防护功能和权限较高的软件进程:
[code][/code]
列表2包括其他进程
2. 当dll处于列表1的某个进程中时,它会尝试搜索并直接使用TerminateProcess来结束360tray.exe进程。如果自身是avp.exe,还会尝试关闭\BaseNamedObjects\6953EA60-8D5F-4529-8710-42F8ED3E8CDA来造成卡巴退出。然后它将为自身进程文件创建IFEO项,其Debugger键值指向rundll32.exe,之后结束自身进程。当dll不处于列表1中的某个进程时,才会去往下一步。
3. 尝试直接用OpenProcess和TerminateProcess结束列表2中的所有进程。
4. 尝试以PROCESS_ALL_ACCESS权限得到360tray.exe进程的句柄,一旦成功,则会访问注册表[SOFTWARE\Microsoft\Windows\CurrentVersion\Run]中的360Safetray键值,依此找到360的安装文件夹并运行360Safe.exe进程。
5. 当它自身不位于explorer.exe或svchost.exe或iexplore.exe进程时,则退出,如果位于这几个进程之一才会执行下面的内容。
6. 创建名为__ssav的互斥量,然后创建新线程循环执行aaa函数。
7. 获取本地主机的网络信息,并使用统计列表http://lllooff.8866.org/01/install.asp?ver=1.0。
8. 进入死循环,每隔一个小时,就从http://aacc0.xicp.cn/l/1.txt?rand=*(*号内容是随机的)下载一个病毒URL列表,将列表中的所有病毒下载到本机Temp文件夹Tempfilename*.tmp(*号内容是随机的)并运行。


aaa函数的行为
1. 尝试把自身dll文件复制到%systemroot%\system32\mswsock32.dll
2. 读取注册表
[HKEY_LOCAL_MACHINE\SYSTEM\Setup\AllowStart\SPI_Pause]
的PathName键值,这是程序自己设定的新键值标记
3. 第1步如成功,尝试读取注册表
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\Protocol_Catalog9\Catalog_Entries\000000000001]
的PackedCatalogItem键值,比较其前面部分是否与mswsock32.dll相同。如果相同,说明mswsock32.dll已经被设定为Winsock2服务的供应者,动作已经完成,则函数返回。
3. 如果以上两步有差错,说明注册表修改还未完成,则程序调用一个函数,设为ReNewWinsock2Provider函数,将mswsock32.dll设定为系统Winsock2服务供应者,并将最终的Winsock2供应者文件路径(如果不是第一次运行,可能对ReNewWinsock2Provider函数调用过后这个路径已不是mswsock32.dll)写入注册表项目
[HKEY_LOCAL_MACHINE\SYSTEM\Setup\AllowStart\SPI_Pause]
的PathName键值。
干完了这些aaa函数返回。

ReNewWinsock2Provider函数设定系统Winsock2供应者具体的做法是
1. 读取注册表路径
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\Protocol_Catalog9\Catalog_Entries]
下的所有子项的PackedCatalogItem键值
2. 对第1步得到的注册表键中,那些有意义的(可能是可以启动的,具体结构标志的定义不清楚),找寻注册表
[HKEY_LOCAL_MACHINE\SYSTEM\Setup\AllowStart\SPI_Pause]
路径下相对应的项目,如果找到,比较后者键值是否与mswsock32.dll相同
3. 第2步的比较如果成功获取SPI_Pause路径下的键且键值与mswsock32.dll不同,则把原来的内容代替mswsock32.dll写入第1步的PackedCatalogItem键值开头;如果获取的键值与mswsock32.dll相同,则把mswsock32.dll文件路径写入PackedCatalogItem键值开头;如果获取键值不成功,同样把mswsock32.dll文件路径写入PackedCatalogItem键值开头,并向SPI_Pause路径下创建新的键值。


bbb函数(由rundll32.dll调用imedllhost09.ime启动)行为:
1. 将%system%\system32\KillIS.sys注册为服务名为KILLIS,显示名为KILLIS Driver的驱动服务,并启动,然后尝试读取其创建的设备\\.\KILLPRC。
2. 如第1步成功,则调用DeviceIoControl对其进行操作,IOCTL为0x420C007,将目标进程的ID传给驱动设备。
3. 删除驱动服务和文件。
由于原始样本不带驱动资源,实际运行过程中这个函数是不能正常完成功能的。

附件: 样本4的idb.rar
轩辕小聪 - 2010-3-29 18:18:00
第5个样本
软件环境:动态调试时使用VMWare虚拟机,虚拟机系统版本XP SP3,使用反汇编工具:OllyICE,IDA 5.0,WINDBG6.11

5.exe是一个被感染型病毒感染的样本。5.exe入口点的病毒代码在用户Temp文件夹释放了Track.exe并运行,然后就跳到了被感染前文件的原入口点执行了。

Track.exe即为病毒主文件,UPX加壳,直接用OD手脱修复后即可分析。这是一个有感染型病毒特征的,利用添加由svchost.exe加载的服务项来实现其相应dll启动并实现下载和感染功能的病毒。

Track.exe主要行为(先讲第一次运行时,再讲多实例运行时):
1. 当文件自身处于可移动介质中时,会调用explorer.exe打开所在的盘符根目录。尝试访问\\.\pipe\96DBA249-E88E-4c47-98DC-E18E6E3E3E5A并与之关换数据,注意是访问而不是创建,由于第一次运行时该命名管道尚不存在,所以没有实际动作,其作用要在后面才体现出来。
2. 第一次运行时,会取消对BITS服务的ServiceDll即%systemroot%\system32\qmgr.dll的系统文件保护之后,将自身资源中FILE类型的102号资源覆盖qmgr.dll,并启动BITS服务,并在临时目录释放FoxLoad.bat并执行,在Track.exe退出后该批处理便将原始的Track.exe复制到%systemroot%\system32\dllcache\lsasvc.dll,并删除原始文件。
3. 如果不是第一次运行,这里动作会有很大的不同。由于这是一个感染型病毒,第一次运行感染系统后,有可能被感染的文件再度被运行(以及下面将提到的dll文件执行时可能将自己复制多份再在360进程中运行等原因),系统中很可能出现两个以上的该病毒实例在运行。这个时候,后面将说到前一个实例的dll在执行过程中将会创建并写入\\.\pipe\96DBA249-E88E-4c47-98DC-E18E6E3E3E5A,并把其自身相对文件名(即未带文件夹路径,但有后缀名)写入其中,这样后一个实例的exe文件在启动后将通过这个命名管道读取到前一个实例的dll文件名,使得后一个实例将选择与前一个实例写入不一样的文件并启动不一样的服务,从而使得多个实例同时在系统中长驻。为了做到这一点,首先程序exe和dll中内置一个可选的系统的ServiceDll名称列表,,一共有18个ServiceDll名称,以及对应的服务项名称列表。ServiceDll名称依次为(为篇幅考虑,仍然用逗号分隔)

qmgr.dll,shsvcs.dll,mspmsnsv.dll,xmlprov.dll,es.dll,ntmssvc.dll,upnphost.dll,ssdpsrv.dll,netman.dll,mswsock.dll,tapisrv.dll,browser.dll,shsvcs.dll,cryptsvc.dll,pchsvc.dll,regsvc.dll,schedsvc.dll,appmgmts.dll


对应的服务项名称依次为(仍然用逗号分隔)

BITS,FastUserSwitchingCompatibility,WmdmPmSN,xmlprov,EventSystem,Ntmssvc,upnphost,SSDPSRV,Netman,Nla,Tapisrv,Browser,Themes,CryptSvc,helpsvc,RemoteRegistry,Schedule,AppMgmt


这样,exe启动时首先选择以上18项服务中已存在的可用的,又与前一个实例不同的服务名和ServiceDll名,来作为覆盖系统文件和启动服务的目标。
如果以上服务皆不满足要求,exe还会读取注册表
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost]
的netsvcs键的值,这是一个多字符串数组,它表示了所有依靠svchost.exe -k netsvcs启动的服务名,病毒将会在其中选择一个服务名,作为其释放的dll文件的文件名依靠启动的服务,然后尝试创建服务,并将其ServiceDll设置为相应的dll。这种情况下的服务启动类型都是自动,特点是服务名、显示名和ServiceDll文件名一致。

qmgr.dll(不是第一次运行会叫其他名字)的行为:

DllMain函数行为:
1. 判断自身所在进程是否是360tray.exe,如是则尝试向设备\\.\360SpShadow0发送IOCTL为0x222048的DeviceIoControl请求,从而试图使360检测失效。
2. 创建一个新线程,这里为方便表示为Thread2,然后就返回了。

Thread2运行后行为:
1. 查找当前进程中有无avp.exe或bdagent.exe,如果有,则申请一块0x4000000字节大的内存,前面全用nop指令填充,最后五字节搞一个跳转指令,然后代码故意跳进这块内存中执行,到最后再跳回原代码中。这一步对执行没有什么影响,如果是针对avp.exe和bdagent.exe的,可能是故意考验这两款软件的防堆栈数据执行的功能,尚不知真碰到会有何后果。
2. 查找当前进程中有无360tray.exe,如有,则将自身文件复制到同一目录下(这里是system32)的1l1.dll,并使用CREATE_SUSPENDED参数启动一个新的360tray.exe进程,将其入口点代码改成调用LoadLibraryA加载1l1.dll,这个进程被唤醒之后就将加载1l1.dll,这时1l1.dll的DllMain函数将使用前面提到的方式访问\\.\360SpShadow0试图达到使360的检测失效。
3. 将内存中的一段字符串解密出来,是下载病毒的远程服务器域名列表。
4. 创建一个新线程,这里为方便表示为Thread3,Thread2循环每500ms检测一次Thread3线程结束的标志,这里为方便把它称为bThread3Finish标志,直到Thread3将bThread3Finish置位,Thread2才继续。Thread3线程行为见下文。
5. 再创建三个线程,分别为Thread4,Thread5,Thread6,行为见下文。
6. 等待一段时间(具体没有看是多久)后,才开始写hosts代表,只是把hosts代表覆盖为只剩一行,即
127.0.0.1      localhost
7. 获得%systemroot%\system32\dllcache\lsasvc.dll(即病毒原主文件的副本)的文件大小(访问不成功,将循环100次重试),将其映像到内存,然后再启动两个线程,设为Thread7和Thread8。
8. 等待Thread6Func完成,之后再创建新线程,设为Thread9。
9. 最后搞个死循环长驻内容但不再干活。

各个Thread的行为都比较多,这里只拿出个别详细说明过程,比如Thread3线程是KillAV部分,所以重点说明,其他的只简要说明干了什么。必须说明的是,这个病毒有BUG,其中有一些功能所需要的字符串居然是乱码,我原来以为是我漏掉了什么解密函数,但是后来运行的结果确实功能缺失,所以我只能尽力依照原来的代码流程说明它想要干什么。

Thread3线程行为:
1. 找出自身所在的服务项,根据前面的服务项生成方法,先从内置的18个中找到与自己文件名匹配的那一个的对应服务项名,如果18个中找不到,则显然是依靠系统注册表里的列表生成的服务,则服务项名必与文件名(无后缀)是相同的,将自身服务项启动类型设置为自动。
2. 删除安全模式注册表项
[\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SafeBoot\Minimal]
[\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SafeBoot\Network]
3. 尝试访问设备\\.\LiTdi,如不成功则说明驱动未加载,向用户Temp文件夹中释放LiTdi.sys,并创建和启动驱动服务,服务名和显示名均为LiTdi。驱动服务启动后马上将LiTdi.sys文件和相应注册表服务项删除。然后再将尝试访问设备\\.\LiTdi,这次如果还不成功,就将bThread3Finish置位之后直接返回了。
4. 使用NtQuerySystemInformation获取系统内核的文件名和加载基址,然后调用LoadLibraryExA将内核文件加载后,找到MmGetSystemRoutineAddress,经重定位得到在内核的真实地址,然后使用DeviceIoControl与设备交互,IOCTL为0x222193,将这个真实地址传给驱动,以使驱动能够获得一些操作所需的重要的内核函数的地址,同时驱动将内核SSDT那张表的表头地址(调试符号是KiServiceTable)返回给用户层。这样的目的是使用户层能够通过重定位从内核文件中找到原始的表,并得到所有原始SSDT的内容,再传递给驱动还原之。然而由于用户层程序中的一个标志位没有设置(即为0),程序并没有进行还原SSDT的操作,而是直接跳到后面把之前LoadLibraryEx加载的内核文件映像又FreeLibrary卸掉了。
5. DeviceIoControl再次与驱动交互,IOCTL为0x2220C4,传入参数是自身的服务项注册表路径,驱动程序使用Hook其内核注册表HHIVE结构的GetCellRoutine函数(系统原本的GetCellRoutine函数是HvpGetCellMapped)的方法,达到隐藏自身服务项的目的。
6. 通过IOCTL为0x22225C的DeviceIoControl,让驱动创建注册表IFEO项目。但是这里存在BUG,传入的字符串是一长串类似加密后的乱码,但是根本没有解密函数,运行的结果证实了没有IFEO项。
7. 通过IOCTL为0x222114的DeviceIoControl,让驱动Tcpip设备的IRP_MJ_INTERNAL_DEVICE_CONTROL处理例程进行HOOK,似乎是过滤杀毒软件网站,但是这里又是BUG,传入的依然是乱码。
8. 找寻相应杀毒软件的ProcessId,通过IOCTL为0x222264的DeviceIoControl,让驱动结束其进程。这里同样有BUG,因为杀毒软件文件名列表和上面IFEO项用的是一样的,都是乱码。
9. 最后将bThread3Finish置位返回。

Thread4线程行为:
1. 创建命名管道\\.\pipe\96DBA249-E88E-4c47-98DC-E18E6E3E3E5A并把自身dll文件名写入其中,然后又不停循环。直到有更新的实例出现,该线程才执行下面的扫尾操作。
2. 这里开始是扫尾操作,向驱动设备发IOCTL为0x222164的DeviceIoControl请求使其还原对注册表服务项HIVE的GetCellRoutine和Tcpip.sys的IRP处理例程的HOOK
3. 修改自己原来占据的服务启动类型为手动
4. 解除对lsasvc.dll的文件映像并将该文件删除
5. 结束自身进程的其他线程后自行退出。

Thread5线程行为:试图启动一个IE进程访问某个网址,30秒后结束该IE进程。我之所以说某个,是因为这里又是一串乱码……

Thread6线程行为:
1. 当explorer.exe进程存在时,试图获得其Token
2. 通过尝试获取www.baidu.com网页的IP等信息来检查连网状态,直到成功,这时利用一个网站列表:

bbnn7.114central.com
bbnn7a.114central.com
bbnn7ba.114central.com
bbnn7bc.114central.com
bbnn7bd.114central.com
bbnn7jc.114central.com
bbnn7jey.114central.com
bbnn7jy.114central.com
bbnn7jyhr.114central.com
bbnn7jyr.114central.com


选择其中可以连接上而且其服务器IP地址等信息与www.490a-B8B5-9B8C1E870B0C.com这个域名不同的(我原来以为是要相同的,但看了好久,似乎是要不同的)一个域名。
3. 根据程序中保存的一个文件夹路径,以及一个文件名列表,与第2步取得的域名合在一起,将多个文件下载到用户Temp文件夹中,在确认下载下来的文件是PE文件后,试图以explorer.exe进程的用户权限运行它们。很遗憾的,这里相应的文件名列表和远程文件夹路径也是乱码。

Thread7线程行为:感染文件,感染除A、B及光盘盘符以及的所有逻辑盘符,排除以下目录

WINDOWS
WinNT
Documents and Settings
System Volume Information
RECYCLER
Common Files
ComPlus Applications
InstallShield Installation Information
Internet Explorer
Messager
microsoft frontpage
Movie Maker
MSN Gaming Zone
NetMeeting
Outlook Express
Windows Media Player
Windows NT
WindowsUpdate
WinRAR


对于exe文件,先检验其数字签名证书,通过验证的则不感染。不通过验证的exe,确定是正常的PE文件后,在其尾部加一个大小为0x7000字节的区段,将病毒代码和lsasvc.dll的映像内容写在其中,并修改程序入口点指向病毒代码开头。
后缀为htm、html、asp、aspx,文件名为index或Default的网页文件,之前未被同一个样本感染过的,则在后面加上一段文本。可惜这里这段文本又是乱码。
对大小为10KB到10MB的rar文件,先调用WINRAR.exe程序将其解压到用户Temp目录的同名文件夹中,然后对其中的文件进行感染,最后再调用WINRAR.exe把它打包回来。

Thread8线程行为:在当前系统的移动介质盘符根目录创建autorun.inf和recycle.{645FF040-5081-101B-9F08-00AA002F954E}\Ghost.exe,后者为lsasvc.dll的副本,autorun.inf的内容为

[autorun]
OPEN=recycle.{645FF040-5081-101B-9F08-00AA002F954E}\Ghost.exe
shell\open=打开(&O)
shell\open\Command=recycle.{645FF040-5081-101B-9F08-00AA002F954E}\Ghost.exe Bak
shell\open\Default=1
shell\explore=资源管理器(&X)
shell\explore\Command=recycle.{645FF040-5081-101B-9F08-00AA002F954E}\Ghost.exe Bak


autorun.inf和recycle.{645FF040-5081-101B-9F08-00AA002F954E}文件夹和Ghost.exe都设置系统、隐藏、只读属性。

Thread9线程行为:获取系统主机的外网IP地址,如果成功则有尝试扫描本机所在的网段进行通信的动作,这里我因为是内网,没有什么实际动作。

最后说一下驱动LiTdi.sys,功能前面基本有提过:
创建驱动设备\Device\LiTdi,符号连接\??\LiTdi,响应用户态程序的DeviceIoControl请求,可用的IOCTL和功能如下:
IOCTL=0x2220C4时,通过用户态程序传入注册表项,驱动程序使用Hook其内核注册表HHIVE结构的GetCellRoutine函数(系统原本的GetCellRoutine函数是HvpGetCellMapped)的方法,达到隐藏注册表项的目的。
IOCTL=0x222114时,通过对Tcpip设备的IRP_MJ_INTERNAL_DEVICE_CONTROL处理例程进行HOOK,达到过滤某些网站的目的。
IOCTL=0x222164时,还原前面两个IOCTL时所做的HOOK。
IOCTL=0x222193时,返回内核SSDT表表头KiServiceTable的位置。
IOCTL=0x22221F时,接收用户态传来的信息,还原SSDT
IOCTL=0x222264时,接收用户态传来的目标进程ID信息,进行强行结束进程。
IOCTL=0x22225C时,接收用户态传来的注册表项信息,写入注册表,这里用来写IFEO项。

其中对注册表的HOOK,用WINDBG观察,驱动加载于0xF9F16000基址,则驱动此调用后0xF9F16F5C处保存服务项的_HHIVE地址,0xF9F16F64处保存其中GetCellRoutine的位置,0xF9F16F60处保存原始函数即HvpGetCellMapped的地址,可以看到驱动调用后GetCellRoutine的位置已经被LiTdi.sys的函数给代替了。
lkd> dd f9f16f5c
f9f16f5c  e101ba58 806364ac e101ba5c d50a373c
f9f16f6c  00000000 00000000 00000000 00000000
f9f16f7c  00000000 805d2974 00000000 00000000
f9f16f8c  00000000 00000000 00000000 00000000
f9f16f9c  00000000 00000fc8 00000000 00000000
f9f16fac  000011f0 00000d20 00000000 00000000
f9f16fbc  00000000 00000000 00000000 f9f17028
f9f16fcc  f9f17032 f9f1704a f9f1705e f9f17076
lkd> dt e101ba58 _HHIVE
nt!_HHIVE
  +0x000 Signature        : 0xbee0bee0
  +0x004 GetCellRoutine  : 0xf9f167dc    _CELL_DATA* *** ERROR: Module load completed but symbols could not be loaded for \??\C:\DOCUME~1\YICONG~1\LOCALS~1\Temp\LiTdi.sys
LiTdi+7dc
  +0x008 ReleaseCellRoutine : 0x80636438    void  nt!HvpReleaseCellMapped+0
  +0x00c Allocate        : 0x8063afa0    void*  nt!CmpAllocate+0
  +0x010 Free            : 0x8063afec    void  nt!CmpFree+0
  +0x014 FileSetSize      : 0x8063aa08    unsigned char  nt!CmpFileSetSize+0
  +0x018 FileWrite        : 0x8063b550    unsigned char  nt!CmpFileWrite+0
  +0x01c FileRead        : 0x8063b428    unsigned char  nt!CmpFileRead+0
  +0x020 FileFlush        : 0x8063b2e6    unsigned char  nt!CmpFileFlush+0
  +0x024 BaseBlock        : 0xe101d000 _HBASE_BLOCK
  +0x028 DirtyVector      : _RTL_BITMAP
  +0x030 DirtyCount      : 0
  +0x034 DirtyAlloc      : 0x268
  +0x038 RealWrites      : 0x1 ''
  +0x03c Cluster          : 1
  +0x040 Flat            : 0 ''
  +0x041 ReadOnly        : 0 ''
  +0x042 Log              : 0x1 ''
  +0x044 HiveFlags        : 0
  +0x048 LogSize          : 0x400
  +0x04c RefreshCount    : 0
  +0x050 StorageTypeCount : 2
  +0x054 Version          : 5
  +0x058 Storage          : [2] _DUAL
lkd> ln 806364ac
(806364ac)  nt!HvpGetCellMapped  |  (8063664c)  nt!HvpGetCellPaged
Exact matches:
    nt!HvpGetCellMapped = <no type information>
替代函数实现隐藏_CM_KEY_NODE结构的功能,先调用原始HvpGetCellMapped,当发现获取到的KeyNode是需要隐藏的KeyNode时,将返回其ParentNode的最后一个SubKeyNode,如果需要隐藏的就是最后一个,则直接返回获取失败。据说这个招是MJ0011公开提出(见http://www.debugman.com/read.php?tid=497),后来就有代码放出来了。

以上就是五号样本分析的内容,由于该样本的配置数据自身有问题,很多行为在实际测试中都不能完整体现,只能根据其代码来判断其本来应该达到的效果。

全部5个样本的分析到此结束。

附件: 样本5的idb.rar
networkedition - 2010-3-30 13:27:00
无法学习只能膜拜:kaka8:
newcenturymoon - 2010-3-31 19:16:00
分析的比较详细 满分
轩辕小聪 - 2010-3-31 19:57:00
满分应该是250吧:kaka12:
最硬的石头 - 2010-3-31 20:30:00
:kaka18: 膜拜下小聪的答案
是昔流芳 - 2010-4-5 20:25:00
特来膜拜、围观
辛达星郁 - 2010-4-5 20:31:00
哈哈 ,小聪的大作啊
辛达星郁 - 2010-4-5 20:35:00
我想说句实话

:kaka6: 我真看不懂
西藏耗牛 - 2010-4-5 22:06:00
膜拜,看看能不能看明白:kaka18:
念初 - 2010-4-5 22:29:00
我来了哈哈,学习
念初 - 2010-4-5 22:42:00
看这些字都累。。。。
菜菜万岁 - 2010-4-5 22:46:00
:kaka4: 来膜拜大作
sasm - 2010-4-5 23:05:00
看来只能慢慢来学习
zzzkkkmmm - 2010-4-5 23:40:00
我在网盘上下载了样本调试结果好多文件给感染了
jks_风 - 2010-4-6 10:22:00
感觉小聪是个很神奇的人,好像和UpK的fly的风格很像~
云中飞燕333 - 2010-4-8 17:26:00
膜拜下小聪的答案
1
查看完整版本: [Simple Lions]第五关闯关