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

[ 2006-02-19 21:30:14 | 作者: neeao ] 收藏到[365Key] [del.icio.us]
字体大小: 大 | 中 | 小

本文假定你对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 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

Win32下病毒设计入门详细解说相关推荐

  1. Win32 PE病毒入门教程

    Win32 PE病毒入门教程 by Koms Bomb 免责声明: 如果有人因为看了本文而写出任何恶性病毒进而对社会造成任何伤害,与本人无关.本人只是讨论一些理论知识而已. 写本文的目的: 1,像普及 ...

  2. 《需求设计:构建用户想要和需要的产品》——第1章 情境驱动设计入门1.1 对需求进行设计...

    本节书摘来自华章计算机<需求设计:构建用户想要和需要的产品>一书中的第1章,第1.1节,作者:[英] 克里斯·布里顿(Chris Britton) 更多章节内容可以访问云栖社区" ...

  3. figma设计_如何在Figma中构建设计入门套件(第二部分)

    figma设计 Figma教程 (Figma Tutorial) With this short, but informative Tutorial Series I aim to show you ...

  4. figma设计_如何在Figma中构建设计入门套件(第1部分)

    figma设计 Figma教程 (Figma Tutorial) Do you like staring at a blank canvas every time you start a new pr ...

  5. figma设计_Figma与Adobe XD:我们如何选择下一个设计工具

    figma设计 The time came for changes and our design team started raising the topic again about how we s ...

  6. 《HTML5+CSS3网页设计入门必读》——2.8 转变(CH-CH变化)

    本节书摘来自异步社区<HTML5+CSS3网页设计入门必读>一书中的第2章,第2.8节,作者: [英]Jeremy Keith , [美]Dan Cederholm 更多章节内容可以访问云 ...

  7. 使用WxPython进行Win32下Python编程

    最近在研究wxpython,需要在win32下编程. 1 另一种可供Python使用的GUI工具包叫做wxPython.目前这个工具对于Python环境来说还是陌生的,但正在Python开发者中间快速 ...

  8. 《HTML5+CSS3网页设计入门必读》——1.13 测验

    本节书摘来自异步社区<HTML5+CSS3网页设计入门必读>一书中的第1章,第1.13节,作者: [美]Julie Meloni更多章节内容可以访问云栖社区"异步社区" ...

  9. Python+django网页设计入门(20):使用WebSocket创建多人在线聊天室

    2019年3月8日-10日公众号送书活动:中小学生Python课应该学什么 ================ 前导课程: Python+django网页设计入门(19):创建新模型扩展自带用户表的字段 ...

最新文章

  1. 获取可视区域高度赋值给div(解决document.body.clientHeight的返回值为0的问题)
  2. 如何在保留订单的同时从列表中删除重复项?
  3. si24r1程序_简要分析SI24R1替代兼容NRF24L01P
  4. 利用nvm管理Node的版本
  5. win08跟linux,Win 8 PK Linux!八大优势助微软完胜
  6. android 对java 支持_Android在未来对 Java 8 特性的支持
  7. 2021普通高考重庆成绩查询平台,2021年重庆高考成绩查询时间及查分方式
  8. 巧用DBGrid控件的Sort属性实现“点击标题栏自动排序功能”。(改进版本)
  9. 优雅的避免字体侵权——微软雅黑并不免费
  10. 一个女留学生在美国的七年
  11. 微信小程序的AppID在哪?
  12. 《文明之光》吴军 著,读书笔记
  13. Git从远程仓库取代码
  14. 【windows——高效工作】写作篇
  15. 全国计算机四级网络工程师教程,全国计算机等级考试立体化应试教程——四级网络工程师...
  16. ffmpeg/ffplay 添加实时的时间水印
  17. tmdb电影票房_TMDb Vue.js应用程序:电影数据库应用程序
  18. 基于ECS构建微信公众号管理系统
  19. (6.1)各种USB接口简介
  20. 系统CPU负载过高、CPU使用率不高的问题

热门文章

  1. Unity3d截图两种方式
  2. DNS服务器详解--------基础篇
  3. [原创]FineUI秘密花园(二十四) — 树控件之数据绑定
  4. SQL Server 负载均衡方案集锦
  5. XML Web Service 安全性
  6. HD 1525 Euclid's Game
  7. NYOJ 1053 Alice and Bob (N)
  8. ASP无法上传大文件的解决方法
  9. C# PrintDocument 打印表格
  10. 44)PHP,多个数据库查询(我没试)