您的位置: 主页 > 安全攻防 > 黑客技术 > 病毒入门I(天才要学这东西咯)

病毒入门I(天才要学这东西咯)
时间:09-10-21 来源:未知 作者:admin 阅览:

文章作者: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语言,现在改得更”汇编“些


黑客技术相关
关于<< 病毒入门I(天才要学这东西咯) >>的评论 查看所有评论