有,
是双壳,
也不是太难脱,
这个是没脱壳的.
没密码.
请小心!!!!!!!!!!!!!!!!!!!
再有这个病毒挺强的,只要它用过的目录,你一打开就会被关闭,
winrar也在其中,
cmd被修改了,attrib ,dir一些命令参数不好使了,
(就想看看它是如何在这里动的手脚的,哎,太菜,不知各位前辈有什么好办法让俺找到这里学习一下)
这是病毒的第一个call 00404558,
0040F328 >/$ 55 push ebp ;脱完壳后的oep
0040F329 |. 8BEC mov ebp, esp
0040F32B |. B9 32000000 mov ecx, 32
0040F330 |> 6A 00 /push 0
0040F332 |. 6A 00 |push 0 ; 12ffbc-12fe30
0040F334 |. 49 |dec ecx
0040F335 |.^ 75 F9 \jnz short 0040F330
0040F337 |. 51 push ecx
0040F338 |. 53 push ebx
0040F339 |. 56 push esi
0040F33A |. 57 push edi
0040F33B |. B8 C0F24000 mov eax, 0040F2C0
0040F340 |. E8 1352FFFF call 00404558 ; 第一个call
00404558 /$ 53 push ebx
00404559 |. 8BD8 mov ebx, eax
0040455B |. 33C0 xor eax, eax
0040455D |. A3 B0104100 mov dword ptr ds:[4110B0], eax
00404562 |. 6A 00 push 0 ; /pModule = NULL
00404564 |. E8 2BFFFFFF call <jmp.&kernel32.GetModuleHandleA> ; \GetModuleHandleA
00404569 |. A3 50264100 mov dword ptr ds:[412650], eax ;返回一个句柄 ASCII "MZP"
0040456E |. A1 50264100 mov eax, dword ptr ds:[412650]
00404573 |. A3 B8104100 mov dword ptr ds:[4110B8], eax ;[4110B8]=bindu.00400000 "MZP"
00404578 |. 33C0 xor eax, eax
0040457A |. A3 BC104100 mov dword ptr ds:[4110BC], eax ;[4110BC]=0
0040457F |. 33C0 xor eax, eax
00404581 |. A3 C0104100 mov dword ptr ds:[4110C0], eax ;[4110C0]=0
00404586 |. E8 C1FFFFFF call 0040454C ;[4110B4]存放是[411028]里的值,就是4110b4
0040458B |. BA B4104100 mov edx, 004110B4 ;4110b4里放的是
00404590 |. 8BC3 mov eax, ebx ;4110b4=0040F2C0 (bindu.0040F2C0)
00404592 |. E8 35F3FFFF call 004038CC ;得到一些用到的信息,
00404597 |. 5B pop ebx
00404598 \. C3 retn
==============call 0040454C
0040454C /$ B8 B4104100 mov eax, 004110B4
00404551 |. E8 0AFDFFFF call 00404260
00404556 \. C3 retn
00404260 /$ 8B15 28104100 mov edx, dword ptr ds:[411028] ;
00404266 |. 8910 mov dword ptr ds:[eax], edx ;
00404268 |. A3 28104100 mov dword ptr ds:[411028], eax ;
0040426D \. C3 retn
==============call 004038CC
004038CC /$ C705 10204100>mov dword ptr ds:[412010], <jmp.&kernel32.RaiseException> ;异常
004038D6 |. C705 14204100>mov dword ptr ds:[412014], <jmp.&kernel32.RtlUnwind> ;定义类型
004038E0 |. A3 28264100 mov dword ptr ds:[412628], eax ;[412628]=040F2C0 (bindu.0040F2C0) ×
004038E5 |. 33C0 xor eax, eax
004038E7 |. A3 2C264100 mov dword ptr ds:[41262C], eax ;[41262c]=0
004038EC |. 8915 30264100 mov dword ptr ds:[412630], edx ;[412630]=4110b4
004038F2 |. 8B42 04 mov eax, dword ptr ds:[edx+4] ;4110b8=MZP
004038F5 |. A3 1C204100 mov dword ptr ds:[41201C], eax ;[41201C]=00400000 MZP
004038FA |. E8 C5FEFFFF call 004037C4 ;
004038FF |. C605 24204100>mov byte ptr ds:[412024], 0 ;把412024置零
00403906 |. E8 61FFFFFF call 0040386C ;得到一些信息
0040390B \. C3 retn ;
===============================call 004037C4
004037C4 /$ 31D2 xor edx, edx ; bindu.004110B4
004037C6 |. 8D45 F4 lea eax, dword ptr ss:[ebp-C] ; 申请好的空间地址
004037C9 |. 64:8B0A mov ecx, dword ptr fs:[edx] ; fs[0] seh链尾
004037CC |. 64:8902 mov dword ptr fs:[edx], eax ; FS[0]得到空间地址
004037CF |. 8908 mov dword ptr ds:[eax], ecx ; 把SEH写入空间头
004037D1 |. C740 04 24374>mov dword ptr ds:[eax+4], 00403724 ; 接着写入403724
004037D8 |. 8968 08 mov dword ptr ds:[eax+8], ebp ; 再EBP放入ebp=0012FFC0下个地址
004037DB |. A3 24264100 mov dword ptr ds:[412624], eax ; 把头地址放入412624
004037E0 \. C3 retn
堆栈数据变为
0012FFB4 0012FFE0 指向下一个 SEH 记录的指针
0012FFB8 00403724 SE处理程序
0012FFBC 0012FFC0
0012FFC0 0012FFF0
================================call 0040386C
0040386C $ 55 push ebp ; 保存EBP
0040386D . 8BEC mov ebp, esp ; 保存栈顶
0040386F . 53 push ebx ; 压入数据ebx=0040F2C0 (bindu.0040F2C0)
00403870 . 56 push esi ; ESI=0
00403871 . 57 push edi ; EDI=0
00403872 . A1 28264100 mov eax, dword ptr ds:[412628] ; 把数据放入EAX
00403877 . 85C0 test eax, eax ; 是否为空 ;F2C0
00403879 . 74 4B je short 004038C6
0040387B . 8B30 mov esi, dword ptr ds:[eax] ; 取数据 ESI=C
0040387D . 33DB xor ebx, ebx
0040387F . 8B78 04 mov edi, dword ptr ds:[eax+4] ; 取下一个ds:[0040F2C4]=0040F2C8 (bindu.0040F2C8)
00403882 . 33D2 xor edx, edx
00403884 . 55 push ebp ; 保存EBP
00403885 . 68 B2384000 push 004038B2 ; 压入4038B2
0040388A . 64:FF32 push dword ptr fs:[edx] ; 压入FS[0]=12FFB4
0040388D . 64:8922 mov dword ptr fs:[edx], esp ; FS[0]保存栈顶
00403890 . 3BF3 cmp esi, ebx ; 比较
00403892 . 7E 14 jle short 004038A8
00403894 > 8B04DF mov eax, dword ptr ds:[edi+ebx*8] ; ds:[0040F2C8]=004045CC (bindu.004045CC)
00403897 . 43 inc ebx
00403898 . 891D 2C264100 mov dword ptr ds:[41262C], ebx ; 保存数值
0040389E . 85C0 test eax, eax
004038A0 . 74 02 je short 004038A4
004038A2 . FFD0 call near eax ; sub dword ptr ds:[412654], 1;键盘,系统,线程
004038A4 > 3BF3 cmp esi, ebx ;
004038A6 .^ 7F EC jg short 00403894 ; 循环,call near eax进入不同的bindu段,
004038A8 > 33C0 xor eax, eax
004038AA . 5A pop edx
004038AB . 59 pop ecx
004038AC . 59 pop ecx
004038AD . 64:8910 mov dword ptr fs:[eax], edx ; FS[0]=12FDF4=12FFB4
004038B0 . EB 14 jmp short 004038C6
004038B2 .^ E9 CDFBFFFF jmp 00403484
004038B7 . E8 50FFFFFF call 0040380C
004038BC . E8 27FDFFFF call 004035E8
004038C1 . E8 76FDFFFF call 0040363C
004038C6 > 5F pop edi
004038C7 . 5E pop esi
004038C8 . 5B pop ebx
004038C9 . 5D pop ebp
004038CA . C3 retn
=====================================call near eax进入不同的bindu段
俺的汇编太差,只能知其毛皮,说不出为什么要这样来取得信息?不知有没有大侠赐教一下!!!!!!
===================edx=1
004045CC . 832D 54264100>sub dword ptr ds:[412654], 1 ;ds:[00412654]=FFFFFFFF
004045D3 . C3 retn
===================edx=2
004043C0 . 832D A4254100>sub dword ptr ds:[4125A4], 1 ; [4125A4]-1
004043C7 . 0F83 C5000000 jnb 00404492
004043CD . C605 0C104100>mov byte ptr ds:[41100C], 2 ; [41100C]=2
004043D4 . C705 10204100>mov dword ptr ds:[412010], <jmp.&kerne>
004043DE . C705 14204100>mov dword ptr ds:[412014], <jmp.&kerne>
004043E8 . C605 36204100>mov byte ptr ds:[412036], 2 ; [412036]=2
004043EF . C705 00204100>mov dword ptr ds:[412000], 004041C0 ; [412000]=4041C0
004043F9 . E8 8AEEFFFF call 00403288 ; 的到键盘属性
004043FE . 84C0 test al, al ; 是否得到
00404400 . 74 05 je short 00404407
00404402 . E8 B1EEFFFF call 004032B8 ;
00404407 > E8 70EFFFFF call 0040337C ;初始化FPU,从ds:[411014]装入FPU的控制字
0040440C . 66:C705 3C204>mov word ptr ds:[41203C], 0D7B0
00404415 . 66:C705 08224>mov word ptr ds:[412208], 0D7B0
0040441E . 66:C705 D4234>mov word ptr ds:[4123D4], 0D7B0
00404427 . E8 60CCFFFF call <jmp.&kernel32.GetCommandLineA> ; [GetCommandLineA
0040442C . A3 2C204100 mov dword ptr ds:[41202C], eax ; 返回当前路径
00404431 . E8 C6CCFFFF call 004010FC ; 检索要创建进程的信息
00404436 . A3 28204100 mov dword ptr ds:[412028], eax
0040443B . E8 A4CCFFFF call <jmp.&kernel32.GetVersion> ; 得到系统版本
00404440 . 25 00000080 and eax, 80000000 ; 与,的零
00404445 . 3D 00000080 cmp eax, 80000000
0040444A . 74 2D je short 00404479
0040444C . E8 93CCFFFF call <jmp.&kernel32.GetVersion>
00404451 . 25 FF000000 and eax, 0FF ; 取后两位
00404456 . 66:83F8 04 cmp ax, 4 ; 是98吗
0040445A . 76 0C jbe short 00404468 ; 不高于跳
0040445C . C705 A8254100>mov dword ptr ds:[4125A8], 3 ; [4125A8]=3
00404466 . EB 20 jmp short 00404488
00404468 > E8 47CCFFFF call <jmp.&kernel32.GetThreadLocale> ; [GetThreadLocale
0040446D . E8 86FEFFFF call 004042F8
00404472 . A3 A8254100 mov dword ptr ds:[4125A8], eax
00404477 . EB 0F jmp short 00404488
00404479 > E8 36CCFFFF call <jmp.&kernel32.GetThreadLocale> ; [GetThreadLocale
0040447E . E8 75FEFFFF call 004042F8
00404483 . A3 A8254100 mov dword ptr ds:[4125A8], eax
00404488 > E8 4FCCFFFF call <jmp.&kernel32.GetCurrentThreadId> ; [GetCurrentThreadId
0040448D . A3 20204100 mov dword ptr ds:[412020], eax ; 返回线程ID
00404492 > C3 retn
=========call 0040337C
0040337C /$ DBE3 finit ; 初始化FPU
0040337E |. 9B wait
0040337F |. D92D 14104100 fldcw word ptr ds:[411014] ; 从ds:[411014]装入FPU的控制字
00403385 \. C3 retn
=========call 004010FC
004010FC /$ 53 push ebx ; 保存EBX
用来检索要创建的进程结构,
堆栈数据变为:
0012FDA4 00000044
0012FDA8 00143BC8
0012FDAC 00143BE8 ASCII "WinSta0\Default"
0012FDB0 00143DF8 ASCII "D:\bindu.exe"
\\\\\\\\\\\\\\\\\省略3到C,因为什么也没做和1一样
这个子程序就是完成了一些病毒发作前的准备工作,
做到知自知彼,
申请空间,得到系统信息,保存用得到的信息到指定的地址,
如[41202C]放的是当前路径 [412020]是线程ID
有些只是自己瞎猜的,只是说说而己,有不对的地方请多多指正。
让小菜多多学习一下。