病毒编写教程

您所在的位置:网站首页 win32是什么病毒 病毒编写教程

病毒编写教程

2022-03-27 16:52| 来源: 网络整理| 查看: 265

【译者声明】

~~~~~~~~~~~

    这是一篇关于病毒基础知识的教程,作者Billy Belceb,西班牙人,在16岁时写的这篇教程,曾创建了病毒组织DDT。翻译这篇教程的目的是想揭开病毒的神秘面纱,从编写病毒的角度来学习病毒,希望对大家有用。由于原文为西班牙人写的英文,译者翻译教程也不多,英语只是凑合,错误之处还请大家原谅,如果大家发现翻译有什么不当之处,欢迎改正,大家也可对照原文学习。(原文在29A#4中)。大家都知道,我们脱一个壳经常见到某某壳用了某某病毒技术,到底病毒技术是那些呢?比较经典而全面的Win32病毒教程就是Billy Belceb写的本教程,可惜一直没有人翻译成中文,我作为一个大傻鸟,就决定翻译了。谨以此翻译献给所有的Cracker和所有对Win32汇编感兴趣的人。下面为原文译文,祝你好运!

 

【声明】

~~~~~~~

    作者对因对此文档使用不当而造成的任何损失概不负责。这篇教程的目的是教会人们编写病毒和防护一些破坏力大的病毒的破坏。这篇教程仅作为教学目的。所以,如果有人利用这篇文章编写了破坏力很大的病毒,我可不负责任。如果通过这篇文章你看到我鼓励人们破坏数据的字眼,先去买副眼镜再说。

 

【介绍】

~~~~~~~

    亲爱的同志们,大家好,你还记得Billy Belceb的病毒编写教程吗?那是一篇关于过时的MS-DOS病毒的教程。在那篇教程中,我一步一步地介绍了很多有名的DOS病毒技术的知识,而且它是为初学者写的,使他们尽快地入门。现在,我又写了一篇很酷(我希望是)的教程,但是这一次我将介绍现在计算机的新威胁,Win32病毒,毫无疑问,所有的东西都是和那个有关了。我发现现在一个完整的教程很缺,所以我曾问自己...为什么我不写一篇关于这个的教程?所以我又写出来了:)真正的在Win32病毒的先驱是VLAD组织,而用这种方式来写教程的作者是Lord Julus。但是我不会忘记那些写了很多有趣教程的人,和在Lord Julus的教程之前的所有相关东西,当然我在说JHB啦。有趣的技术是由Murkry研究的,后来Jacky Qwerty...我希望我没有忘记在Win32病毒编写(很短)史上的重要的人。注意我从来没有忘本。象在我的病毒编写教程系列里一样,我要谢谢一些音乐组织,如Blind Guardian,HammerFall,Stratovarius,Rhapsody,Marilyn Manson,Iron Maiden,Metallica,Iced Earth,RAMMS+EIN,Mago De Oz,Avalanch,Fear Factory,Korn,Hamlet 和Def Con Dos。所有这些东西营造了写一篇巨大的教程和代码的完美的氛围。

    嗨,我的教程的结构已经有了很大的改变,现在我给出一个索引,几乎所有给出的代码都是我编写的,或者基于其他人的但是被我改编了的,或者有一点删改的;)但是,嗨,我已经努力的解决在我的现在已经绝种了的MS-DOS(RIP)版VWG中遇到的所有问题。

    我必须向Super/29A问好,是他帮助了这篇教程的一些方面的东西,他是我的beta测试人之一,而且他已经对这篇教程贡献了一些东西。

 

说明:英语不是我的母语(西班牙语才是)【译者注:所以这篇西班牙式的病毒教程很难翻译,不当之处还请原谅】,所以原谅我的许多拼写错误,请告知我,我会修正的。我已经引用了已经在一些独立的病毒杂志里发表了的文章,但是它们仍然值得一读因为我已经修改了,进行了语法检查,并加入了一些额外的信息。记住:这篇文章并不完美,所以原谅在这篇教程中的错误。

 

----------跟我联系

 -E-mail        [email protected]                [email protected]

 -ICQ #           22290500

个人主页                  http://members.xoom.com/billy_bel&n...sp;    http://www.cryogen.com/billy_belcebu

组织主页                  http://sourceofkaos.com/homes/ddt

IRC [Billy_Bel]            Undernet #vir, Irc-Hispano #virus

祝玩得快乐!

Billy Belceb

 

    美梦从这里开始...

 

(c) 1999 Billy Belcebu/iKX

 

【索引】

~~~~~~~

    有人(Hi Qozah!)已经告诉我,当他读这篇教程的beta版本时,它有一点混乱,因为容易迷失在各章之间。无论如何,我已经对这个重新组织了,我仍然很混乱,而且我的教程也是:)

 

01.声明

02.介绍

03.索引

04.病毒编写中的有用的东西

05.简单介绍

06.PE 文件头

07.Ring-3,用户级编码

08.Ring-0,系统级编码

09.Per-Process residency

10.Win32优化

11.Win32反调试

12.Win32多态

13.高级Win32技术

14.附录一:病毒发作

15.附录二:关于作者

16.结束语

 

【病毒编写中的有用的东西】

~~~~~~~~~~~~~~~~~~~~~~~~~

    在开始编写病毒之前,你需要一些东西。下面是我给你推荐的程序(如果你没有足够的金钱来买它们...下载!)   :)

   

    Windows 95 或 Window NT 或 Windows 98 或 Windows 3.x + Win32s :)

    TASM 5.0 包(包括TASM32 和 TLINK 32)

    SoftICE 3.23+(或更好) for Win9X,和 for WinNT。

    API 列表(Win32.HLP)

    Windows95 DDK,Windows98 DDK,Windows2000 DDK...即所有的微软DDK和SDK。

    强烈推荐Matt Pietrek关于PE文件头的文章。

    Jacky Qwerty的PEWRSEC工具(在你在'.code'里添加代码时用)。

    一些hash...哦,shit!它是我想要的! :)

    一些电子杂志如29A(#2,#3),Xine(#2,#3,#4),VLAD(#6),DDT(#1)...

    一些Windows病毒,如Win32.Cabanas,Win95.Padania,Win32.Legacy...

    一些Windows病毒查杀工具(强烈推荐NODICE32)->www.eset.sk

    Neuromancer,by William Gibson,它是一本好书。

    毫无疑问,这篇教程!

   

    我希望没有忘掉任何重要的东西。

 

 

【简要介绍】

~~~~~~~~~~~

    好了,开始把你的大脑中的16位MS-DOS编码概念,迷人的16位偏移地址,中断,驻留内存的方法...都清除掉。所有这些我们已经使用了很多年的东西,现在已经再也不用了。是的,它们确实现在用不到了。在这篇教程里面,当我说Win32,我的意思是Windows 95(normal,OSR1,OSR2),Windows 98,Windows NT或Windows 3.x+Win32s。最最明显的变化,至少在我看来是由中断变成了API,在这之前是由16位寄存器和偏移地址变到了32位的。Windows给我们开了使用其它语言代替ASM(和C)的方便之门,但是我仍然对ASM情有独钟:利用它能更好的理解一些东西和更容易的优化(hi Super!)。正如我在上面所说的,你必须使用一种新东西叫做API。你必须知道这些参数必须在堆栈中,而且调用这些API是使用的CALL。

    注:在上面我把上面所有提到的平台叫做Win32,我把Win95(它的所有版本)和Win98叫做Win9x,把Windows 2000叫做Win2k。请注意这一点。

 

%由16位到32位编程的改变%

~~~~~~~~~~~~~~~~~~~~~~~~

     我们现在将会使用双字(DWORD)而不是单字(WORD)了,而这个改变将会给我们一个全新的世界。在已知的CS,DS,ES和SS:FS,GS之外,我们又多了两个段。而且我们有32位寄存器如EAX,EBX,ECX,EDX,ESI,EDI,EBP和ESP。让我们来看看对这些寄存器怎么操作:假如我们要使用EAX的less significant word(简称LSW),我们该怎么做呢?这个部分可以使用AX来访问,即处理LSW。假如EAX=0000000,我们想要在它的LSW放置1234h。我们必须简单地使用一个"mov ax,1234h"就可以了。但是如果我们想要访问EAX的MSW(Most Significant Word),该怎么做呢?为了达到这个目的我们不能使用一个寄存器了:我们必须使用ROL。问题并不是在这里,它是把MSW值移到了LSW。

    当我们得到一个新语言的时候,我们总是要试的一个经典的例子:"Hello world!"  :)

 

%Win32中的Hello World%

~~~~~~~~~~~~~~~~~~~~~~

    它很简单,我们必须使用"MessageBoxA"这个API,所以我们用大家已经知道的"extrn"命令来定义它,把参数压栈然后调用这个API。注意这个字符串必须为ASCIIZ(ASCII,0),记住参数必须以相反的顺序压栈。

 

;-------从这里开始剪切----------------------------------------------------

 

                .386                            ; Processor (386+)

                .model flat                     ; Uses 32 bit registers

 

 extrn          ExitProcess:proc                ; The API it uses

 extrn          MessageBoxA:proc

 

;-

;利用"extrn"我们把在程序中要用到的所有API列出来。ExitProcess是我们用来把

;控制权交给操作系统的API,而MessageBoxA用来显示一个经典的Windows消息框。

;-

 

 .data

 szMessage       db      "Hello World!",0       ; Message for MsgBox

 szTitle         db      "Win32 rocks!",0       ; Title of that MsgBox

 

;------------------------------------------------------------------------------------------------------------------------------

;这里我们不能把真正病毒的数据放这里了,因为这是一个例子,我们不能

;使用它,而且又因为如果我们不在这里放置一些数据,TASM将会拒绝汇编。

;无论如何...在第一次产生你的病毒主体的时候用它放置数据。

;-

 

                .code                           ; Here we go!

 

 HelloWorld:

                push    00000000h               ; Sytle of MessageBox

                push    offset szTitle          ; Title of MessageBox

                push    offset szMessage        ; The message itself

                push    00000000h               ; Handle of owner

 

                call    MessageBoxA             ; The API call itself

 

;------------------------------------------- ; int MessageBox(                                                       

;   HWND hWnd,          // handle of owner window                      

;   LPCTSTR lpText,     // address of text in message box              

;   LPCTSTR lpCaption,  // address of title of message box           

;   UINT uType          // style of message box                      

;  );                                                                 

;                                                                    

;在调用这个API之前,我们把参数压栈,如果你还记得,堆栈使用那个迷人的

;东西叫做LIFO(后进先出Last In First Out),所以我们要按相反的顺序来

;压参数。让我们看看这个函数的每个参数的简要描述:

;

; hWnd:标志将要被创建的消息框的宿主窗口(owner window)。

;      如果这个参数是NULL,这个消息框没有宿主窗口。

; lpText:指向以空字符结尾的包含将要显示消息的字符串的指针。

; lpCaption:指向一个以空字符结尾的字符串的指针,这个字符串是这个

;        对话框的标题。如果这个参数是一个NULL,缺省的标题Error被使用。

; uType:以一些位标志来确定对话框的样式和行为。这个参数可为一些标志的组合。

;-

 

                push    00000000h

                call    ExitProcess

 

;--------------------------------------------------------------------------------------------------------------------

; VOID ExitProcess(

;   UINT uExitCode      // exit code for all threads

; );

; 这个函数在Win32环境下相当于著名的Int 20h,和Int 21h的00,4C功能等等。

; 它是关闭当前进程的简单方式,即结束程序执行。下面给出唯一的一个参数:

;

; uExitCode:标志进程退出的代码,并作为所有线程终止时的代码。使用

; GetExitCodeProcess函数来刷新这个进程的退出值。使用GetExitCodeThread

; 函数来刷新一个线程的退出值。

;-

 

 end HelloWorld

 

;-----到这里为止剪切-------------------------------------------------------

 

    正如你看到的,编写代码很简单。可能没有16位环境下那么简单,但是如果你考虑到32位所带给我们的优点确实很简单了。现在,既然你已经知道怎么来编写"Hello World",你就有能力来感染整个世界了;)

 

%Rings%

~~~~~~~

    我知道你对下面的东西很害怕,但是,正如我所演示的,它看起来没有那么难。让我们记住你必须清楚的东西:处理器有4个特权级别:Ring-0,Ring-1,Ring-2和Ring-3,越往后就有越多的限制,而病毒要是用第一个特权级别,几乎编码时没有任何限制。只要记住在迷人的DOS下面,我们总是处于Ring-0...现在想到在Win32平台下你还可以做相同的事情...好了,停止幻想了,让我们开始工作。

    Ring-3还表示"用户"级,在这个级别下,我们有很多的限制,那确实不能我们的需要。Microsoft程序员在他们发行Win95的时候犯了个错误,声称它是"无法感染"的,正如在这个操作系统卖出去之前所表明的,利用可怕的Bizatch(后来改名为Boza,但那是另外一段历史了)。他们认为这些API不能被一个病毒访问和使用,但是他们没有想到病毒编写者们的超级智慧,所以...我们可以在用户级下编写病毒,毫无疑问,你只要看看大量近期发布的新的Win32运行期病毒,它们都是Ring-3级下的...它们不差,不要误解了我,Ring-3病毒是现在有可能感染所有Win32环境下文件的病毒。它们是未来...主要是因为即将发布的Windows NT 5.0(或者Windows 2000)。我们不得不寻找能使我们的病毒(由Bizatch生成的病毒传播很差,因为它对API地址"harcoded",并且它们可能会因Windows版本的改变而改变)存活的API,而且我们可以用其它不同的方法来实现,正如我后面解释到的。

    Ring-0是另外一段历史了,和Ring-3有着很大的区别。在这个级别下我们拥有内核编码的级别,"内核(kernel)级别"。是不是很迷人啊?我们可以访问端口,放置我们还没有梦想过的代码...和原先的汇编最接近的东西。我们不使用一些已知的花招是不能直接访问一些东西的,如IDT修改,SoPinKy/29A在29A#3里发表的"Call Gate"技术,或者VMM插入,在Padania或者Fuck Harry病毒里见到的技术。当我们直接利用VxD的服务时,我们不需要API,而且它们的地址在所有Win9x系统中是被假设为相同的,所以我们"hardcode"它们。我将在fully dedicated to Ring-0这一章里面深入讨论。

 

%重要的东西%

~~~~~~~~~~~~

    我想无论如何我应该在这篇教程的开头放上这些,然而我知道知道总比不知道好啊:)好了,让我们来讨论Win32操作系统内部的东西。

    首先,你必须清楚一些概念。让我们从selector开始。什么是一个selector呢?相当简单,它是一个非常大的段,而且它组成了Win32的内存,也叫做平坦内存。我们可以用4G内存(4,294,967,295字节),仅仅通过使用32位地址。那所有这些内存是怎么组织的呢?看看下面的示意图:

 __________________________

|                          |



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3