Win32 下病毒设计入门详细说明

网络安全 2025-04-24 23:26www.168986.cn网络安全知识

深入了解Windows环境下的病毒:PE文件结构与驻留型病毒的内存管理策略

让我们明确一点:病毒的存在需要一个宿主。对于Windows环境下的PE文件病毒来说,它们通常会将自己嵌入到PE文件的某个未使用空间中。PE文件结构包括了MZ Header、DOS Stub Code、PE Header等部分,而在这之间有许多未使用的空间,可以被设计精良的病毒所利用。像CIH病毒,它就巧妙地利用了这些空闲空间来隐藏自身代码。

那么,如何将病毒代码嵌入到PE文件中呢?这就需要理解PE文件的典型结构。PE文件的代码映像被分为多个SECTION,这些SECTION在文件中对齐到页边界(每个页面大小为4K)。文件会被加载到虚拟内存地址000h开始的空间,而第一个SECTION通常开始于401000h,入口地址也是这里。由高级语言编写的程序,每个SECTION的长度可能并不是4K的倍数,这就留下了未使用的空间,可以被病毒利用。

对于驻留型病毒来说,分配驻留所需内存是关键的步骤。在DOS环境下,所有的应用程序都映射在相同的线性地址空间里,使用一般的内存分配调用就足够了。但在Win32环境下,每个应用程序都有自己的线性地址空间,这就需要使用特殊的函数来分配2GB以上的系统地址。例如,VxD服务_PageAllocate和kernel32的VxDCALL _PageReserve就是常用的函数。

驻留型病毒通过截留FILE I/O操作来激活。它们可以通过使用VXD服务的IFSMgr_Install-FileSystemAPIHook(如CIH)或截留VxDCall中的DOS Services callback(如HPS)来实现。在Win32环境下编写病毒需要注意一些事项,比如Win32下的系统功能调用不是通过中断实现,而是由DLL中导出(直接使用VxD服务除外)。直接在病毒中得到API入口并不容易。但可以通过在同版本Windows下,同一个核心函数的入口总是固定的特性来间接获取。然后在初始化代码中获取要使用的函数入口并将其填入病毒中,病毒运行时就可以直接使用了。

最近,有一台运行Windows 2000 Server的笔记本电脑被病毒感染。报告指出病毒名为Hacktool,文件名为c:\winnt\system32tservice.exe。由于该文件正在运行,直接删除是不可能的。可以使用Windows任务管理器尝试结束该进程,但可能会遭遇“无法中止进程,拒绝访问”的情况。这时,我们可以借助Windows的控制台模式来解决问题。

控制台是Windows的一种简易运行模式,可以在命令行状态下有限制地访问FAT和NTFS分区,并对系统进行一些设置和操作。通过控制台,我们可以采取多种措施,包括更换系统文件、关闭或禁用某个系统服务、修复引导扇区等。对于Windows 2000和XP用户,可以使用光盘启动电脑,然后按照相应的步骤进入控制台模式来解决问题。

理解和熟悉PE文件结构以及驻留型病毒的内存管理策略对于防范和应对Windows环境下的病毒至关重要。掌握控制台的使用技巧也能在面临一些系统问题时提供有效的解决方案。将控制台选项添加到启动菜单的方法十分便捷。当你将光盘放入光驱后,只需要在运行中输入特定的命令,如“d:\i386\winnt32/cmdcons”,并经过简单确认,控制台选项就会被添加到高级启动菜单中。这样,你就可以直接从硬盘启动进入控制台,适用于Windows 2000和Windows XP系统。

在控制台命令提示符下,为保障安全,我们对ntservice.exe进行了备份。随后,只需执行“del c:\winnt\system32tservice.exe”即可。

接下来,让我们如何在Windows环境下截留文件I/O操作。这主要通过两种方式实现,而在病毒编写中主要使用以下两种策略:

1. 利用VxDCallIFSMgr_InstallFileSystemHook。

2. 截留Kernel32.dll中的第一个函数VxDCall对DOS INT 21的呼叫。具体地,当EAX=2A0010时,便进入了截留操作。

VxDCall的核心代码如下:只要将地址指针改为自己的过程入口,就能捕获所有的VxDCall。进入这个过程时,寄存器中的值提供了调用时的服务号码、以及其他所需的值。此后,编写过程与在DOS环境下编写病毒类似。

在Windows环境下编写病毒时,获取API的入口是一个挑战。大部分API都位于DLL中,而VXDCALL需要在RING0层级才能使用,DOS的INT 21服务也无法直接调用。获取DLL中的API入口有两种方法:

1. 在加载时获取,通过建立IMPORT TABLE来定位API的入口地址。但这是常规应用程序的做法,对病毒而言并不适用。

2. 在运行时获取,使用GetModuleHandle和GetProcAddress来获取API的入口。但在病毒环境中,这种方法并不实际。我们需要从Windows的内存映射中寻找Krnl32.dll的位置。Windows程序都对齐在64k的边界上,我们可以通过PE HEADER中的EXPORT TABLE来找到DLL的名称和API的入口。值得注意的是,在这2GB的内存空间中并非所有地址都是有效的。在忽略访问无效地址导致的异常时,我们可以利用Windows的Exception Chain结构来避免GP Error,从而访问任何地址。详细的实现可以参考相关源码和PE FORMAT。

以上内容详细介绍了如何在Windows环境下将控制台选项添加到启动菜单、截留文件I/O操作以及在病毒编写中如何获取API的入口。这些知识和技巧对于理解和操作Windows系统、以及病毒编写都具有重要的参考价值。在Windows操作系统中,DLL文件的加载与映射机制十分关键。当我们在不同的进程中载入同一个DLL时,它们会被映射到同一个地址。这是Windows系统为了确保不同进程间共享资源而设计的一种机制。

DLL中的导出函数在export table中有其相对DLL Image Base的偏移记录。如果我们改变这个偏移,通过GetProcAddress获取的函数地址也会随之改变。想象一下,如果我们能将CreateProcess函数的地址指向自己的DLL中的函数,或者截获GetDlgItemText来记录密码,这将为我们提供极大的操作空间。

Kernel32.DLL的结构有其特殊之处。它的Section Table在0x300以前就结束了,真正的代码从0x1000处开始,其间有3K的未用空间,这为我们的代码提供了存放的空间。我们可以通过GetModuleHandleA来获取Kernel32.DLL的Image Base地址。

在所有版本的Windows中,有三个基本的DLL总是被加载:Kernel32.DLL、Use.DLL和GDI32.DLL。对于同一版本的Windows,它们的Image Base和导出函数的地址是固定的。我们可以直接使用这些地址来进行一些特定的操作,比如在病毒编程中。

接下来是一段关于此主题的汇编代码示例:

让我们深入理解一下这段代码的运作方式。它首先声明了一些外部函数和变量,包括GetModuleHandleA等函数以及相关的字符串常量。然后它使用szKernel调用GetModuleHandleA来获取Kernel32.DLL的Image Base地址,并将其存储在hKernel变量中。这个过程是初始化代码的开始部分。

Windows的DLL机制为我们提供了丰富的资源操作空间。通过理解并操作这些机制,我们可以实现很多强大的功能。从病毒编程的角度来看,理解和掌握这些机制是极其重要的。不过需要注意的是,任何技术都应当在合法和道德的框架内使用,不应被用于非法和不道德的目的。

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by