Win32 下病毒设计入门具体说明

本文假定你对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导出的函数)。因此可以用以下的要领获得函数进口: 

  在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]挪用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的 进口地点.:< 这是明明也是不行能的.除了将GetModuleHandle和GetProcAddress的代码复制到我们的病毒中,只有利用暴力在 2GB的空间内找出API的进口了。 

  首先说明一下WINDOWS的内存映射,由00000000开始有一段是无效地点(我忘了到底到几多了),用来捕捉应用措施错误的指针。 
随着一直到0x7FFFFFFF为应用措施的空间.0X80000000今后为系统 的空间,DLL和VXD都映射在这里.我们要作的就是从这2GB的空间内找到Krnl32.dll. 一般来说,Windows下的措施都是对齐在64k的界线.首先是MZ 文件头,随着是由MZ HEADER中的信息可以获得PE HEADER的进口. 由这个标志就可以找出所有的DLL.由PE HEADER可以获得DLL的 EXPORT TABLE的进口,个中而NAME PTR TABLE的第一项为DLL的名 称,由此可以找出Krnl32.dll,并从ADDRESS TABLE中获得任何一个 API的进口.。 

  值得留意的是,在这2GB中并不是所有而地点都是有效的,在 一般的措施中可以通过IsXXXXXPtr来判定地点是否有效,但在病毒 中不可.只能Hook Exception,忽略会见无效的地点导致的Exception. Windows中的Exception Chain的布局如下: fs:[0] dword exception产生时esp的新值,该值指向一个如下 的布局 [esp] dword fs:[0]的新值 [esp+4] dword exception handler的进口 [esp+8] dword exception handler利用的数据首地点 [esp+12] dword -1具体的汇编代码可以用C写一段__try...__except的代码,然后 转译成汇编. 只要我们的exception handler直接跳转到病毒中寻找Krnl32.dll 的代码,就可以不引起GP Error而会见任何的地点了。 典型可以参看HPS的源码,PE HEADER,EXPORT TABLE请参看PE FORMAT.。 

  1、在Windows下载入的DLL在差异的process中映射到同一个地点。 

  2、在DLL中导出的函数在export table中记录相对DLL Image Base 的偏移,改变这个偏移利用GetProcAddress获得的地点就会改变。 (想象一下,把CreateProcess地点指向本身的DLL中的函数,可能截获GetDlgItemText来记录Password) 

  3、在Kernel32.DLL中Section Table在0x300以前就竣事了,而真正的代码由0x1000处开始,其间有3K的未用空间,可以用来存放我们的代码。 Kernel32.DLL的Image Base可以由GetModuleHandleA获得。 

  4、在任何版本的Windows中,3个根基的DLL老是被加载(Kernel32.DLL,User32.DLL,GDI32.DLL),并且对付同一个版本的Windows,它们的Image Base,和导出函数的地点老是牢靠的。可以将获得的地点直接用于病毒利用。 

  .386p .model flat,stdcall extrn GetModuleHandleAroc extrn GetProcAddressroc extrn ExitProcessroc .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 

您大概感乐趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/9071.html