VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4097回复:19

原创――Win32 PE病毒入门教程

楼主#
更多 发布于:2002-06-04 10:03
Win32 PE病毒入门教程
by Koms Bomb

免责声明:
如果有人因为看了本文而写出任何恶性病毒进而对社会造成任何伤害,与本人无关。本人只是讨论一些理论知识而已。

写本文的目的:
1,像普及性知识那样普及病毒知识,即使是老处男(说我呢?郁闷中)老处女也要懂性知识,所以爱好编程的也最好懂一些病毒的编写原理。
2,发扬中国的病毒事业。为什么要发扬?去看我的其它文章。

本文面向的读者:
1,熟悉Win32汇编。不懂汇编只懂VB?没错,VB也可以写出“病毒”,但那是不是太惨了点?
2,熟悉PE结构。faint!如果连PE文件结构都不知道,还去感染谁啊。
3,对病毒有“严重”的热爱,至少也不要讨厌。由于本文含有可能招致PC用户不满的成分,所以如果你不喜欢病毒,请快快离去。
4,如果你是个病毒高手,不要笑本文的肤浅,这本来就是入门文章,希望籍此能出现一大批中国人写的病毒。
5,这是最基本的病毒编写入门技术,如果你真的是高手(你真的是高手?你怎么会真的是高手???:)),可以不用看了。

一,怎样获取Kernel32 API的地址?
病毒无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
eax = ebx + [eax]
word ptr [ebx] ==\'EP\' ?no,goto #1
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病毒都是这个过程,当然具体实现方法会有不同。

二,然后干什么?
记住一个病毒编写的真理:越快返回host程序越好,否则一个明显的延迟会引起一个哪怕是美女用户(?美女通常不是很懂计算机,(画外音:我见过的女程序员都是美女)^_^)的怀疑。所以我们应该立刻分配一块内存,把自己拷贝进去,在那里创建一个病毒线程,然后立刻返回host程序。好了,现在host程序正常运行,而我们的病毒也开始正式启动了,hoho,开始我们的恶魔之旅。

三,感染再感染,尽可能快速尽可能多的感染!
感染是一个病毒赖以长期存活的根本,所以我们要大规模的搜索,感染感染再感染!
FindFirstFile,FindNextFile,FindClose,除非你hook了某些系统API(参考Win32.Kriz),否则这三个API是Win32病毒必备的、搜索再搜索,感染再感染。具体怎么搜索就不用我说了吧:)。

四,以什么方式感染?
目前Win32病毒分为两个主流,一类最常见,覆盖host程序最后一个section的relocation,或者干脆直接缀在最后一个section后面,把它扩大一些。这种技术很简单,例子可参见Funlove,有着复杂的polymorphism引擎体积比较大的病毒一般也都用这种技术。
第二类就是像Elkern那样把自己尽可能地插进host体内,尽可能地插,对于VC编译出来的PE文件,它的file alignment是4K,所以section之间的空隙加起来很可能有4,5K,足可以容下一个Win32病毒。这种技术比较麻烦一些,调试也复杂,主要流行的有Elkern。(CIH的方法也类似,但那是Win95病毒,不在本教程之内)。

五,还要做些什么?
为了生存,我们要尽可能长时间地驻留在内存中,而不是host程序一结束就完蛋了(很多早期的Win32病毒都是那样的:()。这也有两种方法,一是象Funlove那样在系统目录里drop一个文件,并修改注册表或者建立一个系统服务。这种方式很普通,也很普遍,大多数病毒包括蠕虫都这么干。但,呵呵,释放一个文件,太容易让人注意。另一种方式则是感染所有的已运行进程。好方法,在Win2K下很容易实现,CreateRemoteThread,但要想在所有Win32平台下实现,则要比较高的技巧,不在本入门教程范围之内。
当然,如果你能写个工作在所有Win32平台的ring 0病毒,那么I服了you。这不是不可能的,但病毒会比较大,也很没劲,不通用。

六,怎样快速感染
记住两点最基本的
1,在不引起注意的前提下尽可能多地搜索文件,当你写完一个病毒以后,运行它,如果它能在一个小时内搜索15000~20000个文件而你没有听到硬盘狂转的声音,那么恭喜你,你的病毒可以快速感染了。
2,使用File Mapping APIs,不要用ReadFile和WriteFile,后者更慢。

七,Win32病毒最好要多大的size。
答案是越小越好,最好在3K~6K之间(郁闷,底线很像我的月薪:()。现在一些专门研究病毒的年轻人写的病毒越来越大,一个metamorphism病毒最小也要80K,hmmmmmmmmmmmmmm,不行,那样不行,那么大的一个东东,用户太容易发现了。愚以为,polymorphism或者metamorphism都不是最重要的,一般用户根本不会反汇编你的病毒代码,再厉害的metamorphism引擎也要被AVers干掉,所以,适当的polymorphism,骗骗小姑娘就可以了。不信你看看,Funlove没有任何的encryption或者polymorphism,还不是最流行的Win32病毒?如果热衷于metamorphism,建议别写病毒,改行去写disassembler,争取超过IDA pro。

本来想用英文写的,好走向“国际化”,但我的烂英文,外国人可以看懂,可中国人不一定明白,所以先将就用中文写这个我的第一篇病毒教学文章了,以后再翻成英文吧。
看了上面的简单教程,再加上你自己的努力钻研,并去参考一些病毒源代码,相信你也可以比较容易地写出一个Win32病毒。别怕别人笑你的病毒笨,放心地写,写完了别忘记给我看看哦*^__^*。
对于一些我没有提到的细节问题,希望大家自己研究,尽量不要问我。如果是在我的帮助下你写出了病毒,那么你的病毒水平不会超过我。我希望大家的病毒水平都超过我,发扬中国的病毒事业,呵呵。

2002年6月3日晚10时,Koms Bomb,狂饮啤酒中
欢迎转载,请保留“by Koms Bomb”


[编辑 -  6/5/02 by  Koms Bomb]

最新喜欢:

ljmmaryljmmar...
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-04 15:08
znsoft,你改什么了?我没看出来啊 :(
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-04 17:23
我真的不知道PE是什么!
是不是.exe文件格式,缩写是什么?
能否大概讲一讲其格式和执行原理?
谢谢!

[编辑 -  6/4/02 by  Jim_little]
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-04 17:29
我真的不知道PE是什么!
是不是.exe文件格式,缩写是什么?
能否大概讲一讲其格式和执行原理?
谢谢!

555555555555555555
PE就是portable executable,是Win32可执行文件的格式
你去找找,有它的详细格式说明

这里是我写的一个查看PE格式的工具
http://cn.geocities.com/komsbomb/
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-04 17:37
[quote]我真的不知道PE是什么!
是不是.exe文件格式,缩写是什么?
能否大概讲一讲其格式和执行原理?
谢谢!

555555555555555555
PE就是portable executable,是Win32可执行文件的格式
你去找找,有它的详细格式说明

这里是我写的一个查看PE格式的工具
http://cn.geocities.com/komsbomb/
 [/quote]

网站怎么上不去啊?
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-04 17:46

网站怎么上不去啊?


55555555555555555
用代理试试
 :(
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
Nouk
驱动中牛
驱动中牛
  • 注册日期2001-08-22
  • 最后登录2006-10-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-04 19:25
我真的不知道PE是什么!
是不是.exe文件格式,缩写是什么?
能否大概讲一讲其格式和执行原理?
谢谢!

[编辑 -  6/4/02 by  Jim_little]

MSDN has the file format.
The loader can ref the PELDR_xxx in VxdLDR.
Taiwan's Driver Developer
iamaf~1
驱动小牛
驱动小牛
  • 注册日期2001-09-23
  • 最后登录2003-06-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-06 08:34
不错的文章,
看来老兄钻研的不错。
这个论坛不支持长用户名,害得我iamafraid 只好叫iamaf~1了...
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-06-06 08:58
再请问斑竹,按照你说的方法,病毒好象是混合语言编写的啊?
C和asm。不知我的理解对不对?
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-06-06 09:00
再请问斑竹,按照你说的方法,病毒好象是混合语言编写的啊?
C和asm。不知我的理解对不对?

本文哪里提到C了?
PE病毒最好用汇编写。
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-06-06 09:10
我对汇编不是很熟,但一直对病毒很感兴趣,今日能遇到斑竹这样的高手,真是三生有幸。希望多多指教。你文中提到的“FindFirstFile,FindNextFile,FindClose,File Mapping APIs,不要用ReadFile和WriteFile,Getprocaddress”等都是在汇编里实现的?如何实现?希望多指教,谢谢!
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-06-06 09:19
我对汇编不是很熟,但一直对病毒很感兴趣,今日能遇到斑竹这样的高手,真是三生有幸。希望多多指教。你文中提到的“FindFirstFile,FindNextFile,FindClose,File Mapping APIs,不要用ReadFile和WriteFile,Getprocaddress”等都是在汇编里实现的?如何实现?希望多指教,谢谢!
 


对于一般的Win32汇编
是这样的
push paramn
....
push param1
call SomeAPI

55555555555,建议你去学一下Win32汇编 :(

[编辑 -  6/6/02 by  Koms Bomb]
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
Nouk
驱动中牛
驱动中牛
  • 注册日期2001-08-22
  • 最后登录2006-10-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-06-06 09:23
[quote]我对汇编不是很熟,但一直对病毒很感兴趣,今日能遇到斑竹这样的高手,真是三生有幸。希望多多指教。你文中提到的“FindFirstFile,FindNextFile,FindClose,File Mapping APIs,不要用ReadFile和WriteFile,Getprocaddress”等都是在汇编里实现的?如何实现?希望多指教,谢谢!
 


对于一般的Win32汇编
是这样的
push paramn
....
push 1
call SomeAPI

55555555555,建议你去学一下Win32汇编 :( [/quote]
The MASM32 V7 is the Win32 ASM Guide.
Taiwan's Driver Developer
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-06-06 09:26

The MASM32 V7 is the Win32 ASM Guide.

我只用TASM
可惜Borland不出新版本了
 :(
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-06-06 09:36
斑竹,我一直在上层软件工作。对汇编不太熟悉,能否大致讲一下汇编都有那些开发环境,TASM,还有台湾老兄说的MASM V7。从那里可以下载?
有那些好的教程?需要多少时间?

另外,斑竹在病毒方面的研究都是自学的吗?
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-06-06 09:49
1,病毒作者一般都用TASM,比较少用MASM
2,TASM在罗云鬓的主页上有下,去sohu-编程-asm里找
3,要从头学汇编,去书店买书
4,是自己“业余”(55555555555555)研究的
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
roger_ding
驱动牛犊
驱动牛犊
  • 注册日期2002-06-03
  • 最后登录2008-10-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-06-06 09:53
如果 virus 插入到 PE Section 中,再 hook 某些 api,不觉得很象 CIH 吗,但如果用 FindFirstFile,FindNextFile,FindClose,那机器的性能都被你拖慢了。
我个人认为 virus 在除了发作期间可以影响到机器,别的时间应该是不知不觉的,让用户什么都感觉不到,这样才是最佳,如果 virus在传染期间都硬盘狂转,那傻子都知道有病毒了,所以上佳的 virus应该是“随风潜入机,传染细无声”。
另外象这些普通的感染PE文件的 virus,对于杀毒软件而言简直就是小菜一碟,而一些靠 Script 运行的 virus 太无聊,所以只有一些能自我加密和自我防范的 virus 才有出路。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-06-06 11:10
如果 virus 插入到 PE Section 中,再 hook 某些 api,不觉得很象 CIH 吗,但如果用 FindFirstFile,FindNextFile,FindClose,那机器的性能都被你拖慢了。
我个人认为 virus 在除了发作期间可以影响到机器,别的时间应该是不知不觉的,让用户什么都感觉不到,这样才是最佳,如果 virus在传染期间都硬盘狂转,那傻子都知道有病毒了,所以上佳的 virus应该是“随风潜入机,传染细无声”。
另外象这些普通的感染PE文件的 virus,对于杀毒软件而言简直就是小菜一碟,而一些靠 Script 运行的 virus 太无聊,所以只有一些能自我加密和自我防范的 virus 才有出路。


Win32很难hook全局API,hook局部API意义不大。掌握好火候,用FindFirstFile之类的也还隐蔽。
一般的加密没用的,AVer不管你怎么加密,都把你扔进虚拟机里去,然后你就把自己解开了。Funlove简单但很流行的,说明能被杀不等于不能流行。
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
roger_ding
驱动牛犊
驱动牛犊
  • 注册日期2002-06-03
  • 最后登录2008-10-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-06-06 11:47
我说的是hook kernel server,加密是指变换自身的特征码,可见的特征码越短越好,另外象Funlove,我觉得并不好,因为没有多少新意,但凡virus,总是有人被骗的,哪怕这个virus再烂
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-06-06 11:53
我说的是hook kernel server,加密是指变换自身的特征码,可见的特征码越短越好,另外象Funlove,我觉得并不好,因为没有多少新意,但凡virus,总是有人被骗的,哪怕这个virus再烂

总有人被骗,但能骗那么多人,也有两下子了。
一般如果要跨Win32平台的病毒,都在ring3上运行,这样才有通用性。
特征码越短越好,不错,metamophism,没有特征码,但最小要几十K,可怕,不爽 :(
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
游客

返回顶部