阅读:8608回复:25
原创--Win32 PE病毒初级入门教程
Win32 PE病毒初级入门教程
by Koms Bomb 免责声明: 如果有人因为看了本文而写出任何恶性病毒进而对社会造成任何危害,一切后果与本人无关。本人只是讨论一些理论知识而已。如果你对病毒不感兴趣甚至讨厌病毒,请立刻离开这里,也不要妄加评论。 写本文的目的: 1,像普及性知识那样普及病毒知识,即使是老处男(说我呢?郁闷中)老处女也要懂性知识,所以爱好编程的也最好懂一些病毒的编写原理。 (为何总拿性知识做比喻?因为中国人对性知识都很有兴趣,但对之讳莫如深,不敢或者不好意思明说,而程序员一般也对病毒知识很有兴趣,也不敢或者不好意思明说。所以从社会的角度讲,性知识和病毒知识很相似) 2,发扬中国的病毒事业。为什么要发扬?去看我的其它文章。(但不要猜测我是AVer,我只是一个做苦力的普通编码程序员。) 本文面向的读者: 1,熟悉Win32汇编。不懂汇编只懂VB?没错,VB也可以写出“病毒”,但那是不是太惨了点? 2,熟悉PE结构。faint!如果连PE文件结构都不知道,还去感染谁啊。 3,对病毒有“严重”的热爱,至少也不要讨厌。由于本文含有可能招致PC用户不满的成分,所以如果你不喜欢病毒,请快快离去。 4,如果你是个病毒高手,不要笑本文的肤浅,这本来就是入门文章,希望籍此能出现一大批中国人写的病毒。 5,这是最基本的病毒编写入门技术,如果你真的是高手(你真的是高手?你怎么会真的是高手???:)),可以不用看了。 本文是我的另一篇文章《Win32 PE病毒入门教程》的姊妹作,那篇文章出来以后,大家普遍认为不够入门,难以把握,所以就有了这篇更入门的文章。 第一篇:工欲善其事,必先利其器--工具篇 因为本文只讨论用汇编语言编写病毒,所以只介绍一些汇编的编程和调试工具。 一,TASM 5.0 一般病毒作者都比较喜欢用TASM(也是我的最爱),用MASM和NASM的很少,主要是因为TASM可以更灵活,让人更加自由地发挥。这里所指的,是全套的TASM,包括TASM32,TLINK32,TD32,BRC等等。 这些都是命令行工具,需要在DOS窗下运行。 具体命令行参数可以看帮助,要注意在tasm32中加上/m7和/ml开关,前者让tasm多趟扫描,可以产生更优化的代码,后者是大小写敏感开关,是Win32汇编需要的。而tlink32则用/Tpe产生PE格式的文件,/aa产生windows程序。 我的习惯,是把tasm32和tlink32放在一个批处理里,这样不必总敲繁琐的命令行。 二,VC 你可能会奇怪,写汇编干嘛要用VC?呵呵,这里是把VC当作一个调试器来用。在调试Win32程序的时候,VC要比TD好用些。你可以试试,对于一般的Win32程序(包括病毒),甚至不用SoftIce都可以顺利地很容易地调试。 三,SoftIce 调试利器,在写某些类型的病毒的时候离开它真的不行。尤其是写和Windows核心相关的病毒,ring3调试器根本不行了,即使你的病毒还是运行在ring3上。 四,PE格式查看工具 这是写PE病毒必须的,你需要经常查看PE文件的格式。 我新写了个PEViewer,BCB写的,好大,但好有用,还在改进中。 TASM里有一个tdump,命令行的,也不错,不过用起来比较麻烦。 五,UltraEdit 你可以用任何文本编辑器(notepad,word)来编辑汇编代码,但我的最爱是UltraEdit。 以上这些工具,缺少哪个都会让我不爽。用这些工具,足可以写出任何病毒了。你认为呢? 第二篇:开始病毒地狱之旅--编码入门篇 一,定位 一个病毒不知道自己会感染host程序什么地方,所以也就不知道自己的地址,也就不能去引用内存变领。所以一般一个病毒一上来就是给自己定位。 call GetVirAddr GetVirAddr: pop ebp 现在ebp指向GetVirAddr了,要想把变量Var1送入eax,则 mov eax,[ebp+Var1-GetVirAddr] 就可以了。 很多病毒(如Funlove),把上面的定位写成一个单独的sub routine,然后通过减法使ebp总是指向某一个固定位置。这种方式写起来容易,不必总要定位,但不利于优化代码。 二,获取Kernel32的API 这也是Win32病毒必须做的,因为它要用到API,没有API地址它什么都做不了。 但病毒不能有import table,所以一般的方法是暴力搜索内存空间。 这在我的另外一篇文章《Win32 PE病毒入门教程》里讲得很详细了,故摘抄过来,但改了一点小错误。 注意,这种方法需要你对PE格式非常熟悉。 ”病毒无import table,而且现在已经不时髦去攫取host程序的import table了。 现在通用的技术是从4G的地址空间中暴力搜索Kernel32的基地址,然后从Kernel32的export table中找到所需要的API的地址。一旦有了Kernel32的API,想导入其它DLL的API也就容易了,至少可以用LoadLibraryA和GetProcAddress(呵呵,好基本的方法)。 首先要确定Kernel32的基地址。 这个地址在98,2K,XP下都不同。注意,一个好的病毒不能过分依赖某个OS的特性,所以我们不能在病毒体内写个死的77E80000。所以我们要搜出来。一般一个程序执行时,Kernel32都被映射到它的地址空间了,这就是我们为什么可以搜索它的地址的原因。 看看三个OS的基地址,98为BFF70000,2K为77E80000,XP为77E60000,Ok,都在70000000以上,我们可以就从这里开始。当然如果一个一个字节搜索,那么也太慢了,一般DLL定位都在1M边界,所以我们可以以10000为跨度。 还有一个问题,4G空间不全是可读的,搜到某个地方就会出现GPE错误。怎么办?hmmmmmmmmmmmm,M$已经想到了这点,在Win32里提供了一种叫做SEH的技术,可以让你掐死出现的错误,使你的程序继续执行而不崩溃。具体SEH在汇编中的写法,只要几条指令,大家可以自己去找些病毒看一下就知道了。 注意到PE文件和内存中的映像很相似,所以我们就可以按下面这个方式来搜索Kernel32 ebx->current address,now is 70000000h Set SEH frame #1 ebx = ebx + 10000h if ebx == 0 then 郁闷中。没找到Kernel32???是崩溃还是返回host随你了,我无话可说。 word ptr [ebx] == \'ZM\' ?no,goto #1 eax = [ebx + 3ch] ;另外一篇文章中的这两行写的特别别扭,很像C语言,现在改得更”汇编“些 eax = ebx + eax word ptr [eax] ==\'EP\' ?no,goto #1 ;另外一篇文章中的这行有错误,把eax写成了ebx,现在改过来了,看来”狂饮啤酒“和”没喝啤酒“效果真的不一样*^__^* now we are sure this is a PE image,let\'s look up whether it\'s a dll,if not,goto #1 then check the export dll name ,if it\'s not \'KERNEL32.DLL\',goto #1 Now go into it\'s export table,get the APIs address which we use to start our smart work,hahahaha. Remove SEH frame ...... SEH handler: resume to #1 具体细节问题,大家自己去研究。目前大多数Win32病毒都是这个过程,当然具体实现方法会有不同。“ 找到Kernel32的API以后,就可以导入其它dll中要用到的API了。 注意,把API地址存在一个数组里,然后用下面方法调用(过分初级了:() push large param_n ...... push large param_1 call [ebp+Func-GetVirAddr] 注意,所有的Win32 API都是从右至左压栈的。 三,返回host程序 做完初始化的工作后,要尽快返回host程序,否则容易被发现。 但病毒还要继续运行,所以一般都是分配一块内存(VirtualAlloc),把自己copy进去,用CreateThread在那里启动一个线程,然后就可以返回host了。 push large hostentry ;here will be filled when infecting retn 或者 mov eax,hostentry jmp eax 等等,等等。 hostentry存放的是感染时原程序的entry point。 四,感染 感染是一个病毒的生存的根本,没有感染就没有生存,感染是病毒的面包。 一般Win32病毒,难以hook系统API(有一些变通的方法,但不属于入门了),所以只能靠反复搜索硬盘文件的方式来进行感染。FindFirstFile,FindNextFile,FindClose,这三个API就可以完成所有的搜索任务。但搜索要掌握好时间,太快会让硬盘无故狂转,容易被用户发现,太慢又实在无法大量感染文件,所以要掌握火候,这就凭经验了。 找到一个文件后,感染之,大家应该学会用File mapping API,这样可以快速地对文件进行操作。具体感染方法,各种各样,具体可自行研究或参考其它病毒。 第三篇:咬文嚼字--名词解释篇 1,VXer--Virus maker,病毒作者,很多人羡慕并想加入的群体。 2,AVer--Anti-virus maker(或者叫Anti-viruser?),反病毒者。他们和VXer既是敌人又是朋友,没有VXer他们也就没了饭碗。AVer是阳光下的VXer,VXer是地下活动的AVer。 3,PE--Portable Executable,Win32可执行文件的标准格式。 4,Encryption--加密,病毒变形的基础技术。 5,Polymorphism--变形,有一个变化的解密头,但病毒主体解密以后还是固定的 6,Metamorphism--不知道中文是什么。和变形相对,我翻译成”变态“。因为它能把整个病毒体都给变化了,一个普通的metamorphism引擎也要好几十K,其中包括很完整的反汇编引擎,真够变态的了。”变态“不是贬义,是佩服写这些引擎的人的耐心。 第四篇:苦口婆心,老生常谈--建议篇 一,怎样学习Win32汇编? 有的毒友看了我的文章后,开始钻研起Iczelion的很经典的Win32汇编教程。我明确告诉他们,那是浪费时间。那个教程之所以不适合用来学习写病毒,是因为,1,Iczelion是MASM的支持者,代码中大量用.IF .WHILE之类的伪汇编,结果和C语言差不多,但还不如直接用C,而且也无法控制汇编器产生什么样的代码,这也是我不喜欢MASM的主要原因之一。依靠工具产生的代码,肯定没有自己手写的好。2,他讲的主要是一般的Windows程序设计,和C语言设计Windows程序没什么区别,一个病毒一般并不需要窗口和消息。 要想学好Win32汇编,首先要学好32位汇编,然后了解Windows的底层机制。 二,哪个病毒是最好的范例? Funlove,最好的入门级示范代码。它是我所见过的病毒中写的最工整,最”模块化“也最容易读懂和理解的PE病毒(也正因为这样,它的代码才显得比较大)。去看看它的源代码吧,欣赏研究一下,一定会大有收获。不过建议初学者把它的NT patch部分跳过去,那部分涉及NT的安全机制,不太适合初学者。还应注意一点就是它的代码很像标准的汇编写的应用程序,这不太符合病毒的代码优化精神。另外它不是用暴力搜索Kernel32的,而是用了几个固定的Kernel32 base address,只支持9X/2K/NT,估计它不能在XP下运行,但我没试验过。它对ntoskrnl.exe进行patch的部分很简单,只要反汇编一下ntoskrnl.exe就可以看出来,但它patch ntldr的部分则比较高明,尤其是在1999年那样古老的年代。有谁对ntldr有研究,可以切磋一下。 不过病毒技术千变万化,每个病毒都有自己的特色,单独研究一个病毒是不能窥全貌的。 三,学病毒应该看哪些书? 没有任何印刷品可以看。全仗你平时的积累,对汇编的,对Win32底层的积累。 四,这篇文章还不够入门耶 病毒编写是技术活,你不能够指望任何人能教你写出真正的病毒。病毒是要靠自己的努力钻研,天下没有白吃的馅饼。我这篇文章只是给大家一个入门的思路和方向,具体很多技术细节,还要靠自己去发掘。但病毒编写不是天才的专利,任何人只要努力都可以写出病毒。 五,学习病毒编写应该具备哪些基本知识? 我这些文章不能真的传授你所有的病毒编写知识,还要靠你自己的修行。 大概要掌握一下基本知识。 1,Win32汇编,必备知识。 2,熟悉病毒常用的API调用,如文件API,注册表API,内存API等等。 3,熟悉系统底层的机理,如线程,内存管理,进程等等。 4,掌握PE格式。不必全掌握,但一定要熟悉它的header和section table及import table和export table部分。 5,做人的道理,这样才不会贻害四方。这是最重要的。如果你连这点都没有,奉劝你不要玩病毒! 六,问:我写出来病毒应该如何处理 答:把源代码发给我,切磋切磋^_^。 第五篇:我们要做大好人--社会责任篇 我写这些病毒教学文章,真的很希望多出些好的我们中国人自己写的病毒。但,写病毒和传播病毒甚至用病毒进行破坏不同。写病毒玩的是技术,利用病毒进行破坏则是在玩社会。虽然社会被玩了可能还不知道是被谁玩的,但大家要对得起自己的良心,不要拿病毒去害人。而且目前的流行的病毒大都呈良性发展趋势,如Funlove,SirCam,Nimda和号称史上最流行的Klez.h(Klez以前的版本比较恶毒,但不是很流行)都没有刻意的破坏性。破坏显示不出你的功力,任何人都可以很容易写出覆盖所有文件的代码。我们玩病毒,是玩一些好玩或者新的或者高明的技术,而不是既低级又让人讨厌的技术。 2002年6月6日晚9时,Koms Bomb,没喝啤酒,痛苦中 欢迎转载,请保留“by Koms Bomb” 我的联系方式和感言: 一般我很少在网上留我的mail地址,倒不是我害怕病毒,而是实在讨厌spammer。 如果大家要和我联系,请去我新开的个人BBS(http://komsbomb.myforum.net/)给我留言,我一定会看到的。或者请去我在驱动开发论坛主持的病毒版(http://www.driverdevelop.com/forum/html_forum_50.html?1022586707)找我,我不是在做广告,而是只有在那里才会比较容易地找到我。 欢迎大家来和我切磋病毒技术。 如果大家想在病毒和反病毒方面与我有合作,请和我联系。 若有人愿意创建顶级域名(最好独立主机)的病毒方面的网站,我们可以合作。 我在持续郁闷中,不知道自己应该做什么工作,也不知道自己应该向什么方向发展。我不想做professional VXer,没人会给VXer发工资。因为郁闷,很多时候,我都变得麻木,无法安心研究技术。这大概是中国程序员的悲哀,在研究技术的时候还要为生计奔波。也因为郁闷,所以才有了这些文章的诞生。 [编辑 - 6/7/02 by Koms Bomb] [编辑 - 6/7/02 by Koms Bomb] |
|
最新喜欢:root60...
|
沙发#
发布于:2002-06-07 11:47
除了Win32ASM,其余知识都具备了。
PE格式最近两天刚学的,已经有几分理解了。 看来还得下个TASM。昨天下了个MASM6.0, 感觉就象C,如斑竹所言。 还有 斑竹的PEView放在本网站上了吗? |
|
|
板凳#
发布于:2002-06-07 11:51
等着看深入病毒编程。 |
|
地板#
发布于:2002-06-07 11:58
fracker最适合编病毒,
大家看看他的头像。 |
|
|
地下室#
发布于:2002-06-07 12:03
除了Win32ASM,其余知识都具备了。 没有,你可以用tdump |
|
|
5楼#
发布于:2002-06-22 19:33
哪儿有tasm下载??
|
|
6楼#
发布于:2002-06-22 20:10
哪儿有tasm下载?? asm.yeah.net有。 |
|
|
7楼#
发布于:2002-06-22 20:15
下个毛去买张D版啥都有了!!!
|
|
|
8楼#
发布于:2002-07-05 15:15
写得不错! :D :D :D
|
|
|
9楼#
发布于:2003-05-05 12:53
很好,佩服
|
|
10楼#
发布于:2003-07-09 13:12
好文,要顶!
|
|
11楼#
发布于:2003-08-11 16:24
顶
|
|
12楼#
发布于:2003-09-15 14:11
还搜索什么API地址,直接在感染的时候从host的import table找一个Kernel32模块的函数,然后将其它函数通过 add eax, xxxx的形式表示出来,直接call就可以了.
|
|
|
13楼#
发布于:2003-10-08 11:18
强烈支持!希望继续写下去 :)
|
|
14楼#
发布于:2003-10-17 17:50
Good!!#$#@@
|
|
15楼#
发布于:2003-10-29 13:11
好文啊,看来要学的东西真是多啊
|
|
|
16楼#
发布于:2003-11-07 09:50
Very goog
|
|
17楼#
发布于:2003-12-04 22:52
写的不错,看来我要学的东东还多着呢。
呵呵 |
|
|
18楼#
发布于:2003-12-06 13:03
Good!
|
|
19楼#
发布于:2004-02-12 09:17
asm.yeah.net上的tasm是5.0的,borland出新的版本了吗?
我同意斑竹的masm5像c的说法啊,简直就是c啊! |
|
上一页
下一页