前言,新款的灰鸽子总给人无处不在的感觉, 自己就曾在朋友主机中碰到多次,每次只能手工判断并清除.在看到此款检测器时,作了少许测试。效果很不错, 就产生了想了解她是如何工作的!^_^
先来看看系统未感染 灰鸽子 时的执行情况=>>>
00459E2B 68 10A24500 push 超强灰鸽.0045A210 ; ASCII "GPigeon5_Shared" 00459E30 6A 00 push 0 00459E32 6A 04 push 4 00459E34 E8 E3C3FAFF call <jmp.&kernel32.OpenFileMappingA> 00459E39 A3 ACDC4500 mov dword ptr ds:[45DCAC],eax ; Eax=0 表示无可操作句柄 00459E3E 833D ACDC4500 0>cmp dword ptr ds:[45DCAC],0 00459E45 0F84 70030000 je 超强灰鸽.0045A1BB ; jump
OpenFileMappingA()函数执行后的堆栈情况:
0012F5E4 00000004 |Access = FILE_MAP_READ 0012F5E8 00000000 |InheritHandle = FALSE 0012F5EC 0045A210 \MappingName = "GPigeon5_Shared"
0045A1BB 8B83 FC020000 mov eax,dword ptr ds:[ebx+2FC] ;跳到此处 0045A1C1 8B80 20020000 mov eax,dword ptr ds:[eax+220] 0045A1C7 BA C8A34500 mov edx,超强灰鸽.0045A3C8 ; 没有检测到 灰鸽子 Vip 2005 服务端 0045A1CC 8B08 mov ecx,dword ptr ds:[eax] ; ecx=0x427c4c ASCII "4AA" 0045A1CE FF51 38 call dword ptr ds:[ecx+38] ; Retn eax=0 0045A1D1 833D ACDC4500 0>cmp dword ptr ds:[45DCAC],0 0045A1D8 74 0B je short 超强灰鸽.0045A1E5 ; Jump 0045A1DA A1 ACDC4500 mov eax,dword ptr ds:[45DCAC] 0045A1DF 50 push eax 0045A1E0 E8 F7BDFAFF call <jmp.&kernel32.CloseHandle> 0045A1E5 33C0 xor eax,eax 0045A1E7 5A pop edx 0045A1E8 59 pop ecx 0045A1E9 59 pop ecx 0045A1EA 64:8910 mov dword ptr fs:[eax],edx 0045A1ED 68 07A24500 push 超强灰鸽.0045A207 0045A1F2 8D45 B8 lea eax,dword ptr ss:[ebp-48] 0045A1F5 BA 12000000 mov edx,12 0045A1FA E8 F99CFAFF call 超强灰鸽.00403EF8 0045A1FF C3 retn ;retn to 0x45a207
剩下的是一些返回后的处理...
这里可以看到,检测系统是否存在 "灰鸽子 Vip 2005 服务端" 是通过 OpenFileMappingA()打开一个现成的文件映射对象,如存在则返回成功打开的句柄,否则退出往下的检测清除程序段,用C简单可描述成:
hMap = OpenFileMapping(FILE_MAP_READ,FALSE,"GPigeon5_Shared");
if (hMap == NULL) { "没有检测到 灰鸽子 Vip 2005 服务端!" }
此时, 程序编辑中出来提示信息:"没有检测到 灰鸽子 Vip 2005 服务端!"
接着进入 灰鸽子 感染系统后 的检测及清除代码的分析...
同样地, 程序照常中断在此处=>>
00459E2B 68 10A24500 push 超强灰鸽.0045A210 ; ASCII "GPigeon5_Shared" 00459E30 6A 00 push 0 00459E32 6A 04 push 4 00459E34 E8 E3C3FAFF call <jmp.&kernel32.OpenFileMappingA> 00459E39 A3 ACDC4500 mov dword ptr ds:[45DCAC],eax ; 如果检测到:eax=0xcc 0xb4 0xd8 句柄值,如无:eax=0 00459E3E 833D ACDC4500 00 cmp dword ptr ds:[45DCAC],0 00459E45 0F84 70030000 je 超强灰鸽.0045A1BB ; not jump 00459E4B 8B83 FC020000 mov eax,dword ptr ds:[ebx+2FC] ; eax=01023f24 00459E51 8B80 20020000 mov eax,dword ptr ds:[eax+220] ; eax=01024208 00459E57 BA 28A24500 mov edx,超强灰鸽.0045A228 ; edx=0x45a228 => 检测到 灰鸽子 Vip 2005 0105 服务端存在 00459E5C 8B08 mov ecx,dword ptr ds:[eax] ; ecx=0x427c4c ; ASCII "4AA" 00459E5E FF51 38 call dword ptr ds:[ecx+38] ; 编辑框中显示检测到的字符 00459E61 6A 00 push 0 00459E63 6A 00 push 0 00459E65 6A 00 push 0 00459E67 6A 04 push 4 00459E69 A1 ACDC4500 mov eax,dword ptr ds:[45DCAC] ; eax=0xcc \\0xb4 \\0xd8,句柄值 00459E6E 50 push eax ; 将此句柄值压入堆栈,供下一函数用 00459E6F E8 98C3FAFF call <jmp.&kernel32.MapViewOfFile> ;映射文件名 ; Retn EAX=01330000=》ASCII "一大串数字" 00459E74 8BF0 mov esi,eax
堆栈值:
eax=01310000, (ASCII ") esi=00429028 (超强灰鸽.00429028)
??? 不知道是什么数据来的 ??? 检验码?
00459E76 85F6 test esi,esi 00459E78 74 62 je short 超强灰鸽.00459EDC ; NoT jUMP 00459E7A 8D45 F4 lea eax,dword ptr ss:[ebp-C] ; EAX=0X12F640 00459E7D 8BD6 mov edx,esi ; 将那串字符串传入EDX中 00459E7F E8 48A2FAFF call 超强灰鸽.004040CC ; ECX=00,EDX=00 00459E84 B2 01 mov dl,1 ; edx=0x1 00459E86 A1 70954500 mov eax,dword ptr ds:[459570] 00459E8B E8 48F7FFFF call 超强灰鸽.004595D8 00459E90 8BF0 mov esi,eax 00459E92 8B45 F4 mov eax,dword ptr ss:[ebp-C] ; 将那串字符串再入传入 00459E95 E8 FAA4FAFF call 超强灰鸽.00404394 00459E9A 8BD0 mov edx,eax 00459E9C 8D45 EC lea eax,dword ptr ss:[ebp-14] 00459E9F E8 28A2FAFF call 超强灰鸽.004040CC 00459EA4 8B45 EC mov eax,dword ptr ss:[ebp-14] ; EAX=01024398,ASCII"特征串" 00459EA7 8D4D F0 lea ecx,dword ptr ss:[ebp-10] 00459EAA BA 5CA24500 mov edx,超强灰鸽.0045A25C ; edx=0x45a25c ASCII "20050101" 00459EAF E8 A0F5FFFF call 超强灰鸽.00459454 00459EB4 8B55 F0 mov edx,dword ptr ss:[ebp-10] 00459EB7 8BC6 mov eax,esi 00459EB9 E8 FEF7FFFF call 超强灰鸽.004596BC 00459EBE 8D4D F8 lea ecx,dword ptr ss:[ebp-8] 00459EC1 33D2 xor edx,edx 00459EC3 8BC6 mov eax,esi 00459EC5 E8 9AF8FFFF call 超强灰鸽.00459764 00459ECA 8BC6 mov eax,esi 00459ECC E8 0792FAFF call 超强灰鸽.004030D8 00459ED1 A1 ACDC4500 mov eax,dword ptr ds:[45DCAC] 00459ED6 50 push eax ; EAX=0XCC,句柄 00459ED7 E8 00C1FAFF call <jmp.&kernel32.CloseHandle> ; 关闭操作的句柄 00459EDC 8D45 E8 lea eax,dword ptr ss:[ebp-18] 00459EDF 8B4D F8 mov ecx,dword ptr ss:[ebp-8] ; ECX=010252F0=ASCII "83034" ,VIP 用户名 00459EE2 BA 70A24500 mov edx,超强灰鸽.0045A270 00459EE7 E8 F4A2FAFF call 超强灰鸽.004041E0 00459EEC 8B55 E8 mov edx,dword ptr ss:[ebp-18] ; 传入编辑框中=》Vip用户名:83034 00459EEF 8B83 FC020000 mov eax,dword ptr ds:[ebx+2FC] 00459EF5 8B80 20020000 mov eax,dword ptr ds:[eax+220] 00459EFB 8B08 mov ecx,dword ptr ds:[eax] 00459EFD FF51 38 call dword ptr ds:[ecx+38] 00459F00 E8 37FCFFFF call 超强灰鸽.00459B3C ; 该函数检测是否存在隐藏模块,返回eax=0x1 表示检测到隐藏模块 00459F05 84C0 test al,al 00459F07 0F84 96020000 je 超强灰鸽.0045A1A3 ; not jump 00459F0D E8 E6FAFFFF call 超强灰鸽.004599F8 ; 打开令牌环,设置系统调试权限 00459F12 E8 61FCFFFF call 超强灰鸽.00459B78 ; 检测隐藏模块,映射出具体的文件名 00459F17 8B83 FC020000 mov eax,dword ptr ds:[ebx+2FC] 00459F1D 8B80 20020000 mov eax,dword ptr ds:[eax+220] 00459F23 BA 84A24500 mov edx,超强灰鸽.0045A284 00459F28 8B08 mov ecx,dword ptr ds:[eax] 00459F2A FF51 38 call dword ptr ds:[ecx+38] ; 该函数处理一些消息 00459F2D A1 C8DC4500 mov eax,dword ptr ds:[45DCC8] 00459F32 33D2 xor edx,edx 00459F34 52 push edx 00459F35 50 push eax 00459F36 8D45 E0 lea eax,dword ptr ss:[ebp-20] 00459F39 E8 EAE1FAFF call 超强灰鸽.00408128 ; 获取隐藏进程ID ? 00459F3E 8B4D E0 mov ecx,dword ptr ss:[ebp-20] ; ecx=00ee546c ascii "916"\\1804 00459F41 8D45 E4 lea eax,dword ptr ss:[ebp-1C] 00459F44 BA B4A24500 mov edx,超强灰鸽.0045A2B4 00459F49 E8 92A2FAFF call 超强灰鸽.004041E0 00459F4E 8B55 E4 mov edx,dword ptr ss:[ebp-1C] 00459F51 8B83 FC020000 mov eax,dword ptr ds:[ebx+2FC] 00459F57 8B80 20020000 mov eax,dword ptr ds:[eax+220] 00459F5D 8B08 mov ecx,dword ptr ds:[eax] 00459F5F FF51 38 call dword ptr ds:[ecx+38] ; 隐藏的进程ID:1804 00459F62 8D45 DC lea eax,dword ptr ss:[ebp-24] 00459F65 8B0D B8DC4500 mov ecx,dword ptr ds:[45DCB8] 00459F6B BA CCA24500 mov edx,超强灰鸽.0045A2CC 00459F70 E8 6BA2FAFF call 超强灰鸽.004041E0 00459F75 8B55 DC mov edx,dword ptr ss:[ebp-24] 00459F78 8B83 FC020000 mov eax,dword ptr ds:[ebx+2FC] 00459F7E 8B80 20020000 mov eax,dword ptr ds:[eax+220] 00459F84 8B08 mov ecx,dword ptr ds:[eax] 00459F86 FF51 38 call dword ptr ds:[ecx+38] ; 安装文件名: LWVVKL_ 00459F89 8D45 D8 lea eax,dword ptr ss:[ebp-28] 00459F8C 8B0D BCDC4500 mov ecx,dword ptr ds:[45DCBC] 00459F92 BA E4A24500 mov edx,超强灰鸽.0045A2E4 00459F97 E8 44A2FAFF call 超强灰鸽.004041E0 00459F9C 8B55 D8 mov edx,dword ptr ss:[ebp-28] 00459F9F 8B83 FC020000 mov eax,dword ptr ds:[ebx+2FC] 00459FA5 8B80 20020000 mov eax,dword ptr ds:[eax+220] 00459FAB 8B08 mov ecx,dword ptr ds:[eax] 00459FAD FF51 38 call dword ptr ds:[ecx+38] ; 主DLL文件名: 3WVVK+3 00459FB0 8D45 D4 lea eax,dword ptr ss:[ebp-2C] 00459FB3 E8 94FDFFFF call 超强灰鸽.00459D4C ; GetWindowsDirectoryA() 00459FB8 FF75 D4 push dword ptr ss:[ebp-2C] ; SS:[0012F620]=00EE54E4 ASCII "D:\WINDOWS\" 00459FBB 8D45 D0 lea eax,dword ptr ss:[ebp-30] 00459FBE 50 push eax 00459FBF A1 B8DC4500 mov eax,dword ptr ds:[45DCB8] 00459FC4 E8 CBA1FAFF call 超强灰鸽.00404194 00459FC9 8BC8 mov ecx,eax 00459FCB 83E9 04 sub ecx,4 00459FCE BA 01000000 mov edx,1 00459FD3 A1 B8DC4500 mov eax,dword ptr ds:[45DCB8] ; LWVVKL_ 00459FD8 E8 17A4FAFF call 超强灰鸽.004043F4 00459FDD FF75 D0 push dword ptr ss:[ebp-30] ; ASCII "LWVV" 00459FE0 68 FCA24500 push 超强灰鸽.0045A2FC ; ASCII "_Hook.DLL" 00459FE5 8D45 FC lea eax,dword ptr ss:[ebp-4] 00459FE8 BA 03000000 mov edx,3 ; 3个字符串连接数 00459FED E8 62A2FAFF call 超强灰鸽.00404254 ; 将三个字符串连接起来ASCII "D:\WINDOWS\LWVV_Hook.DLL" 00459FF2 8B45 FC mov eax,dword ptr ss:[ebp-4] ; EAX=00459FF2 SS:[0012F648]=00EE5510,ASCII "D:\WINDOWS\LWVV_Hook.DLL" 00459FF5 E8 9AA1FAFF call 超强灰鸽.00404194 ; EAX=0X18=24 => ASCII "D:\WINDOWS\LWVV_Hook.DLL" 字符长度数 00459FFA 8BD0 mov edx,eax 00459FFC 85D2 test edx,edx 00459FFE 7E 18 jle short 超强灰鸽.0045A018 0045A000 BE 01000000 mov esi,1 0045A005 B8 CCDC4500 mov eax,超强灰鸽.0045DCCC ; ASCII "D:\WINDOWS\LWVV_Hook.DLL" 0045A00A 8B4D FC mov ecx,dword ptr ss:[ebp-4] 0045A00D 8A4C31 FF mov cl,byte ptr ds:[ecx+esi-1] 0045A011 8808 mov byte ptr ds:[eax],cl 0045A013 46 inc esi 0045A014 40 inc eax 0045A015 4A dec edx 0045A016 ^ 75 F2 jnz short 超强灰鸽.0045A00A 0045A018 E8 47C1FAFF call <jmp.&kernel32.GetVersion> 0045A01D A9 00000080 test eax,80000000 0045A022 74 13 je short 超强灰鸽.0045A037 ; JUMP 0045A024 68 581B0000 push 1B58 0045A029 68 CCDC4500 push 超强灰鸽.0045DCCC ; ASCII "D:\WINDOWS\LWVV_Hook.DLL" 0045A02E 6A FD push -3 0045A030 E8 97E6FFFF call 超强灰鸽.004586CC 0045A035 EB 2B jmp short 超强灰鸽.0045A062 0045A037 8B45 FC mov eax,dword ptr ss:[ebp-4] 0045A03A E8 55A1FAFF call 超强灰鸽.00404194 0045A03F 8BC8 mov ecx,eax 0045A041 03C9 add ecx,ecx 0045A043 41 inc ecx 0045A044 BA D4DD4500 mov edx,超强灰鸽.0045DDD4 ; UNICODE "D:\WINDOWS\LWVV_Hook.DLL" 0045A049 8B45 FC mov eax,dword ptr ss:[ebp-4] 0045A04C E8 1FACFAFF call 超强灰鸽.00404C70 ; MultiByteToWideChar() 0045A051 68 581B0000 push 1B58 0045A056 68 D4DD4500 push 超强灰鸽.0045DDD4 ; UNICODE "D:\WINDOWS\LWVV_Hook.DLL" 0045A05B 6A FD push -3 0045A05D E8 96E6FFFF call 超强灰鸽.004586F8 0045A062 8B83 FC020000 mov eax,dword ptr ds:[ebx+2FC] 0045A068 8B80 20020000 mov eax,dword ptr ds:[eax+220] 0045A06E BA 10A34500 mov edx,超强灰鸽.0045A310 0045A073 8B08 mov ecx,dword ptr ds:[eax] 0045A075 FF51 38 call dword ptr ds:[ecx+38] 0045A078 6A 00 push 0 0045A07A 68 30A34500 push 超强灰鸽.0045A330 ; ASCII "TGVIP_MainForm" 0045A07F E8 78C5FAFF call <jmp.&user32.FindWindowA> ;查找隐藏进程窗口 0045A084 8BF0 mov esi,eax 0045A086 85F6 test esi,esi 0045A088 74 61 je short 超强灰鸽.0045A0EB 0045A08A 8B83 FC020000 mov eax,dword ptr ds:[ebx+2FC] 0045A090 8B80 20020000 mov eax,dword ptr ds:[eax+220] 0045A096 BA 48A34500 mov edx,超强灰鸽.0045A348 0045A09B 8B08 mov ecx,dword ptr ds:[eax] 0045A09D FF51 38 call dword ptr ds:[ecx+38] 0045A0A0 6A 64 push 64 0045A0A2 E8 8128FBFF call <jmp.&kernel32.Sleep> 0045A0A7 6A 00 push 0 0045A0A9 6A 00 push 0 0045A0AB 68 00340000 push 3400 0045A0B0 56 push esi 0045A0B1 E8 86C7FAFF call <jmp.&user32.PostMessageA> 0045A0B6 6A 64 push 64 0045A0B8 E8 6B28FBFF call <jmp.&kernel32.Sleep> 0045A0BD 6A 00 push 0 0045A0BF 6A 00 push 0 0045A0C1 68 00340000 push 3400 0045A0C6 56 push esi 0045A0C7 E8 70C7FAFF call <jmp.&user32.PostMessageA> 0045A0CC 6A 64 push 64 0045A0CE E8 5528FBFF call <jmp.&kernel32.Sleep> 0045A0D3 6A 00 push 0 0045A0D5 6A 00 push 0 0045A0D7 68 00340000 push 3400 0045A0DC 56 push esi 0045A0DD E8 5AC7FAFF call <jmp.&user32.PostMessageA> 0045A0E2 6A 64 push 64 0045A0E4 E8 3F28FBFF call <jmp.&kernel32.Sleep> 0045A0E9 EB 16 jmp short 超强灰鸽.0045A101 0045A0EB 8B83 FC020000 mov eax,dword ptr ds:[ebx+2FC] 0045A0F1 8B80 20020000 mov eax,dword ptr ds:[eax+220] 0045A0F7 BA 7CA34500 mov edx,超强灰鸽.0045A37C 0045A0FC 8B08 mov ecx,dword ptr ds:[eax] 0045A0FE FF51 38 call dword ptr ds:[ecx+38] 0045A101 8D45 CC lea eax,dword ptr ss:[ebp-34] 0045A104 E8 43FCFFFF call 超强灰鸽.00459D4C 0045A109 8D45 CC lea eax,dword ptr ss:[ebp-34] 0045A10C 8B15 B8DC4500 mov edx,dword ptr ds:[45DCB8] 0045A112 E8 85A0FAFF call 超强灰鸽.0040419C 0045A117 8B45 CC mov eax,dword ptr ss:[ebp-34] 0045A11A 33D2 xor edx,edx 0045A11C E8 9BE3FAFF call 超强灰鸽.004084BC 0045A121 8D45 C4 lea eax,dword ptr ss:[ebp-3C] 0045A124 E8 23FCFFFF call 超强灰鸽.00459D4C ; 取消所要处理文件的属性 0045A129 8D45 C4 lea eax,dword ptr ss:[ebp-3C] 0045A12C 8B15 B8DC4500 mov edx,dword ptr ds:[45DCB8] 0045A132 E8 65A0FAFF call 超强灰鸽.0040419C 0045A137 8B45 C4 mov eax,dword ptr ss:[ebp-3C] 0045A13A E8 55A2FAFF call 超强灰鸽.00404394 0045A13F 8BD0 mov edx,eax 0045A141 8D45 C8 lea eax,dword ptr ss:[ebp-38] 0045A144 E8 839FFAFF call 超强灰鸽.004040CC 0045A149 8B45 C8 mov eax,dword ptr ss:[ebp-38] 0045A14C E8 93E3FAFF call 超强灰鸽.004084E4 ; 删除病毒文件 0045A151 8D45 C0 lea eax,dword ptr ss:[ebp-40] 0045A154 E8 F3FBFFFF call 超强灰鸽.00459D4C ; 获取WINDOWS目录 0045A159 8D45 C0 lea eax,dword ptr ss:[ebp-40] 0045A15C 8B15 BCDC4500 mov edx,dword ptr ds:[45DCBC] 0045A162 E8 35A0FAFF call 超强灰鸽.0040419C 0045A167 8B45 C0 mov eax,dword ptr ss:[ebp-40] 0045A16A 33D2 xor edx,edx 0045A16C E8 4BE3FAFF call 超强灰鸽.004084BC ; 取消文件的属性 0045A171 8D45 B8 lea eax,dword ptr ss:[ebp-48] 0045A174 E8 D3FBFFFF call 超强灰鸽.00459D4C 0045A179 8D45 B8 lea eax,dword ptr ss:[ebp-48] 0045A17C 8B15 BCDC4500 mov edx,dword ptr ds:[45DCBC] 0045A182 E8 15A0FAFF call 超强灰鸽.0040419C 0045A187 8B45 B8 mov eax,dword ptr ss:[ebp-48] 0045A18A E8 05A2FAFF call 超强灰鸽.00404394 0045A18F 8BD0 mov edx,eax 0045A191 8D45 BC lea eax,dword ptr ss:[ebp-44] 0045A194 E8 339FFAFF call 超强灰鸽.004040CC 0045A199 8B45 BC mov eax,dword ptr ss:[ebp-44] 0045A19C E8 43E3FAFF call 超强灰鸽.004084E4 ; 删除病毒体 0045A1A1 EB 42 jmp short 超强灰鸽.0045A1E5 0045A1A3 8B83 FC020000 mov eax,dword ptr ds:[ebx+2FC] 0045A1A9 8B80 20020000 mov eax,dword ptr ds:[eax+220] 0045A1AF BA A4A34500 mov edx,超强灰鸽.0045A3A4 0045A1B4 8B08 mov ecx,dword ptr ds:[eax] 0045A1B6 FF51 38 call dword ptr ds:[ecx+38] 0045A1B9 EB 2A jmp short 超强灰鸽.0045A1E5
处理完毕啦。。。。
0045A1E5 33C0 xor eax,eax 0045A1E7 5A pop edx 0045A1E8 59 pop ecx 0045A1E9 59 pop ecx 0045A1EA 64:8910 mov dword ptr fs:[eax],edx 0045A1ED 68 07A24500 push 超强灰鸽.0045A207 0045A1F2 8D45 B8 lea eax,dword ptr ss:[ebp-48] 0045A1F5 BA 12000000 mov edx,12 0045A1FA E8 F99CFAFF call 超强灰鸽.00403EF8 0045A1FF C3 retn
总结: 该检测器通过OpenFileMappingA()函数检测指定的映射对象是否存在作判断,如存在,获取VIP用户名,继续检测隐藏的进程模块,获取其进程ID,映像出具体文件名(继而作相应的文件完整路径的组合),进行权限提升(打开令牌环,设置系统调试权限),PostMessageA()发送消息关闭隐藏进程主窗口,处理服务进程,取消病毒文件的所有属性(系统,隐藏,只读),最后删除病毒体!!!
检测器代码采用Borland Delphi编写,看这些反汇编代码总会碰到层层调用这一现象,在这些主要CALL的注释中,其实其内部的调用还有很多较详细的代码调用,限于篇幅,就不一一列举了.
此外, 由于本人能力的有限,错误及遗漏在所难免! 或许检测器原理并没有这么简单,还请检测器程序的编写作者或其他高手作出指点. 万分感谢! |