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

2023-12-05 0 256

本文假定你对dos下的病毒和386PM有一定的了解。   1、感染任何一个病毒都需要有寄主,把病毒代码加入寄主程序中(伴侣病毒除外)   以下说明如何将病毒代码嵌入PE文件中,有关PE文件的结构请看以前的文章。PE文件的典型结构:MZHeaderDOSSTUBCODEPEHEADEROPTIONALHEADERSECTIONTABLESECTION1SECTION2…IMPORTTABLEEXPORTTABLE和DOS的可执行文件类似,PE的代码映象分为几个SECTION,在文件中会对齐页边界(4K)。一般来说,文件会加载在400000h开始的空间,而第一个SECTION在401000h处,同时入口地址也是401000h。   由高级语言编写的程序,每个SECTIO-N的长度不可能刚好是4K的倍数,因此在SECTION的末尾将会存在一段未用的空间,大小可由Section的PHYSICALSIZE-VIRTUALSIZE得到,在文件中起始位置可由PHYSICALOFFSET得到,这段空间可以用来存放病毒代码。此外一般来说,MZHeader+DOSSTUD+PEHEADER+OPTIONALHEADER+SECTIONTABLE不过1K左右,而SECTION1由4K开始,空出来的地方足够存放一个设计精良的病毒。CIH就是将代码存放在这些空闲空间里。   2、分配驻留所需内存   对于驻留形的病毒,分配驻留所需内存是必需的。在DOS下使用由于所有的应用程序都映射在相同的线性地址空间里,使用一般的内存分配调用就足够了。而在WIN32下,每个应用程序都有自己的线性地址空间,必须使用特殊的函数分配2GB以上的系统地址。典型的如:VXD服务_PageAllocate,和kernel32的VxDCALL_PageReserve。_PageAllocate请参看win98ddk中的说明,VxDCall_PageReserve请参看HPS源码中的注释。   3、截留FILEI/O操作驻留型的病毒通过截留FILEI/O来激活,可以通过使用VXD服务   IFSMgr_Install-FileSystemAPIHook(如CIH)或截留VxDCall中的DOSServicescallback(如HPS)。   在Win32下编写病毒不是一件困难的事。值得注意的有几件事:   一、Win32下的系统功能调用不是通过中断实现,而是由DLL中导出   (直接使用VxD服务除外)。直接在病毒中得到API入口不是一件容易的事,可以通过以下这个变通的方法。   在同一个版本的Windows下,同一个核心函数的入口总是固定的(指由Kernel32,gdi32,user32导出的函数)。因此可以用以下的方法得到函数入口:   在IntializeCode得到要用的函数入口并将它填入病毒中,在病毒运行时可以直接使用了。   本人的一台操作系统为Win2000Server的笔记本电脑最近被感染了病毒,我首先用相关杀毒软件来扫描计算机,扫描报告如下:   病毒名称:Hacktool   文件名:c:\\winnt\\system32\\ntservice.exe   操作:删除失败,隔离失败,访问被拒绝   如何才能彻底删除呢?   因为c:\\winnt\\system32\\ntservice.exe已经在运行了,直接删除显然是不可能的。于是我运行Windows任务管理器,在进程选项卡中选择结束ntservice.exe进程,结果系统显示“无法中止进程,拒绝访问”。   我突然想到在Win2000(XP)的控制台状态下是可以用DOS命令的。   什么是控制台   控制台是Windows的一种简易运行模式,它可以不启动图形界面而在命令行状态下有限制地访问FAT和NTFS分区,并对系统进行一些设置和操作。通过控制台,我们可以更换系统文件、关闭或者禁用某个系统服务、禁用或卸载硬件设备、修复引导扇区、新建分区以及格式化硬盘分区等。   启动控制台   对于Windows2000,我们可以用光盘启动电脑,然后在安装程序的选单中按R键选择“修复Windows2000安装”,再从修复选单中按C键选择“故障恢复控制台修复Windows2000”。对于WindowsXP,同样是用光盘启动电脑,然后按R选择修复,就能直接进入控制台。   直接把控制台的相关选项安装到启动菜单中的方法:把光盘放入光驱,然后直接在运行中输入“d:\\i386\\winnt32/cmdcons”之后回车(这里假设你的光驱是D),再点击“是”,就可以把控制台选项安装到高级启动菜单中,这样以后直接从硬盘就可以进入控制台中。这个方法适用于Windows2000和WindowsXP。   在控制台的命令提示符下,为安全起见,我首先对ntservice.exe进行备份,然后直接运行:delc:\\winnt\\system32\\ntservice.exe就OK了。   二、主要是要截留文件I/O操作   Windows下截留文件I/O操作有几种方法,在病毒中使用的主要有两种。   1、使用VxDCallIFSMgr_InstallFileSystemHook   2、截留Kernel32.dll中导出的第一个函数VxDCall对DOS   INT21的呼叫(EAX=2A0010)。   VxDCall的代码如下:   moveax,dwordptr[esp+04]   popdwordptr[esp]   callfwordptrcs:[xxxxxxxx]   ^^^^^^^^只要将这个地址指向的地址改为自己的过程入口,就捕获了所有的VxDCall。   进入这个过程时:   eax=servicenumber,如果是DOSINT21将是2A0010   esp[2c]调用Int21时eax的值   ~~~~算漏了个pushad,应该是10h   esp[30]调用int21时ecx的值   ~~~~14h   其他寄存器为调用时所需的值。(段寄存器无用)   以后的就和在DOS下写病毒没什么差别了。   在WINDOWS下写病毒,如何得到API的入口是一件麻烦的事.可以直接使用的API都在DLL中,而VXDCALL要在RING0时才能使用,DOS的INT21服务也不能直接调用.得到DLL中的API入口有两种方法:   1.加载时得到,建立一个IMPORTTABLE,在加载时WINDOWS会根据IMPORTTABLE定位API的入口地址.这是一般应用程序的使用的方法,但不大适合病毒。   2.运行时得到,使用GetModuleHandle和GetProcAddress得到API的入口,但前提时要知道GetModuleHandle和GetProcAddress的入口地址.:<这是明显也是不可能的.除了将GetModuleHandle和GetProcAddress的代码复制到我们的病毒中,只有使用暴力在2GB的空间内找出API的入口了。   首先说明一下WINDOWS的内存映射,由00000000开始有一段是无效地址(我忘了到底到多少了),用来捕获应用程序错误的指针。 跟着一直到0x7FFFFFFF为应用程序的空间.0X80000000以后为系统的空间,DLL和VXD都映射在这里.我们要作的就是从这2GB的空间内找到Krnl32.dll.一般来说,Windows下的程序都是对齐在64k的边界.首先是MZ文件头,跟着是由MZHEADER中的信息可以得到PEHEADER的入口.由这个标记就可以找出所有的DLL.由PEHEADER可以得到DLL的EXPORTTABLE的入口,其中而NAMEPTRTABLE的第一项为DLL的名称,由此可以找出Krnl32.dll,并从ADDRESSTABLE中得到任何一个API的入口.。   值得注意的是,在这2GB中并不是所有而地址都是有效的,在一般的程序中可以通过IsXXXXXPtr来判断地址是否有效,但在病毒中不行.只能HookException,忽略访问无效的地址导致的Exception.Windows中的ExceptionChain的结构如下:fs:[0]dwordexception发生时esp的新值,该值指向一个如下的结构[esp]dwordfs:[0]的新值[esp+4]dwordexceptionhandler的入口[esp+8]dwordexceptionhandler使用的数据首地址[esp+12]dword-1详细的汇编代码可以用C写一段__try…__except的代码,然后转译成汇编.只要我们的exceptionhandler直接跳转到病毒中寻找Krnl32.dll的代码,就可以不引起GPError而访问任何的地址了。范例可以参看HPS的源码,PEHEADER,EXPORTTABLE请参看PEFORMAT.。   1、在Windows下载入的DLL在不同的process中映射到同一个地址。   2、在DLL中导出的函数在exporttable中记录相对DLLImageBase的偏移,改变这个偏移使用GetProcAddress得到的地址就会改变。(想象一下,把CreateProcess地址指向自己的DLL中的函数,或者截获GetDlgItemText来记录Password)   3、在Kernel32.DLL中SectionTable在0x300以前就结束了,而真正的代码由0x1000处开始,其间有3K的未用空间,可以用来存放我们的代码。Kernel32.DLL的ImageBase可以由GetModuleHandleA得到。   4、在任何版本的Windows中,3个基本的DLL总是被加载(Kernel32.DLL,User32.DLL,GDI32.DLL),而且对于同一个版本的Windows,它们的ImageBase,和导出函数的地址总是固定的。可以将得到的地址直接用于病毒使用。   .386p.modelflat,stdcallextrnGetModuleHandleArocextrnGetProcAddressrocextrnExitProcessroc.dataszKerneldb\’KERNEL32.DLL\’,0szFindFirstdb\’FindFirstFileA\’,0szFindNextdb\’FindNextFileA\’,0szFindClosedb\’FindClose\’,0szGetCurrentDirdb\’GetCurrentDirectoryA\’,0szGetWinDirdb\’GetWindowsDirectoryA\’,0szGetSysDirdb\’GetSystemDirectoryA\’,0szGetFileAttribdb\’GetFileAttributesA\’,0szSetFileAttribdb\’SetFileAttributesA\’,0szlopendb\’_lopen\’,0szlreaddb\’_lread\’,0szlwritedb\’_lwrite\’,0szlclosedb\’_lclose\’,0szllseekdb\’_llseek\’,0hKerneldd0.code;Initializecodestart:pushszKernelcallGetModuleHandleA

您可能感兴趣的文章:

  • WIN32程序获取父进程ID的方法
  • Win32应用程序(SDK)设计原理详解
  • 终于明白了tc编译的dos程序和vc编译的win32控制台程序的区别
  • tc编译的dos程序和vc编译的win32控制台程序的异同
  • win32下进程间通信(共享内存)实例分析
  • win32 api实现2048游戏示例
  • 一个win32窗口创建示例
  • win32 api实现简单的消息窗口示例
  • win32使用openfilename浏览文件窗口示例
  • 实例分析一个简单的Win32程序

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 编程安全 Win32 下病毒设计入门详细说明 https://www.u-9.cn/biancheng/bcanquan/98070.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务