Win32下病毒设计入门

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+PE 
HEADER+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得到要用的函数入口并将它填入病毒中,在病毒运行时可以直接使用了。

二:主要是要截留文件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,和导出函数的地址总是固定的。可以将得到的地址直接用于病毒使用。 ( 在NT也可以写病毒了,又要换系统了8< )

(0)

相关推荐

  • win32 api实现简单的消息窗口示例

    复制代码 代码如下: #include<windows.h> LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow){static TCHAR szAppName[]=TEXT("HelloWin");HWND hwnd;MSG msg;WNDCL

  • win32下进程间通信(共享内存)实例分析

    一.概述 很多情况下在Windows程序中,各个进程之间往往需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换. 进程间通讯(即:同机通讯)和数据交换有多种方式:消息.共享内存.匿名(命名)管道.邮槽.Windows套接字等多种技术."共享内存"(shared memory)可以定义为对一个以上的进程是可见的内存或存在于多个进程的虚拟地址空间.例如:如果两个进程使用相同的DLL,只把DLL的代码

  • win32 api实现2048游戏示例

    自学的win32编程,写了一个win32 API版2048,自己摸索着写的,按上下左右箭头开始游戏 复制代码 代码如下: #include <windows.h>#include <stdlib.h>#include <stdio.h>#include <ctime>LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//全局操作数组int arr[4][4] = { { 0, 0, 0, 0 }, {

  • 一个win32窗口创建示例

    复制代码 代码如下: /*一个简单的win32窗口调用*/#include<Windows.h>#include<tchar.h> //声明窗口函数LRESULT CALLBACK WindowProc(HWND hwnd,       UINT uMsg,       WPARAM wParam,       LPARAM lparam       );int WINAPI WinMain(     HINSTANCE hInstance,     HINSTANCE hPrev

  • win32下的命令行集合

    HIDECMD.rar下载:以隐藏窗口的方式运行批处理. curl.exe 7.12.2 文件传输 593,670 curl是一个利用URL语法在命令行方式下工作的的文件传输工具 E6ED60CDA883B9EC5CFA84354E3C74EA mt.exe 未知 98,117 mt是一个网络管理方面的软件 53440C1D5DB397D79B895B5E9CE8B63D ncftp.exe 3.2.0 ftp客户端 160,303 ncftp是ftp客户端工具,比传统的ftp好的多 9905B

  • win32使用openfilename浏览文件窗口示例

    代码如下: 复制代码 代码如下: OPENFILENAME ofn;WCHAR* szFile = new WCHAR[512];WCHAR* szFileTitle = new WCHAR[512];memset(&ofn, 0, sizeof(ofn));memset(szFile, 0, sizeof(WCHAR)*512);memset(szFileTitle, 0, sizeof(WCHAR)*512); ofn.lStructSize = sizeof(ofn);ofn.hwndOw

  • Win32应用程序(SDK)设计原理详解

    一般来说所谓的Win32应用程序开发,就是在C语言的层面上,直接使用Win32 API(Application Programming Interface:系统开放出来,给程序员使用的接口.)来开发Windows应用程序或者系统程序.虽然现在直接用Win32 API开发应用程序的人已经不多了,但是深入理解Windows系统程序设计原理,仍然是成为Windows开发高手的必经之路. 所谓的Win32,其实是一个API规范,与UNIX系统编程接口标准POSIX是相对应的.下面是进行直接的WIN32

  • WIN32程序获取父进程ID的方法

    学过windows程序设计的人都知道,windows中的进程是可以有父子关系的,拥有父子关系的进程,一旦父进程结束,子进程有会随之退出.但是如果进程之间没有父子关系,我们如何让子进程在父进程退出是也同时跟着退出呢?方法有很多,本文介绍其中的一种利用父进程ID的方案,实现的原理很简单:先获取父进程的ID,然后通过ID来获取父进程Handle,通过监视父进程的Handle来决定子进程是否退出.所以,这里的关键就是如何获取父进程的ID. 为了获取父进程ID,这里需要用到一个微软未公开的API: NTS

  • 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的代码映象分为几个

  • Win32下病毒设计入门

    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的可执

  • MVC+DAO设计模式下的设计流程详解

    DAO设计 : DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置. 在该层主要完成对象-关系映射的建立,通过这个映射,再通过访问业务对象即可实现对数据库的访问,使得开发中不必再用SQL语句编写复杂的

  • Windows下病毒木马基本防御和解决方案

    一.基本防御思想:备份胜于补救.  1.备份,装好机器之后,首先备份c盘(系统盘)windows里面,和C:\WINDOWS\system32下的文件目录.  运行,cmd命令如下:   dir/a C:\WINDOWS\system32 >c:\1.txt  dir/a c:\windows >c:\2.txt  这样就备份了windows和system32下面的文件列表,如果有一天觉得电脑有问题,同样命令列出文件,然后cmd下面,fc命令比较一下,格式为,假如你出问题那一天system32

  • Ruby on Rails下的图像处理入门教程

    图像可以说是任何应用至关重要的一部分.从社交网络到一个简单的Bug追踪器,图像都扮演着重要的角色.然而管理图像并不是一件容易的事情,需要提前耗费大量的时间精力去计划. 本文演示了如何在Rail中实现这一目标.如何处理你的图像以及在后台创建多个版本?如何通过压缩图像又不损图像质量,以此来提高页面性能?这些且听本文一一道来. 入门 本文教程是运行于Rails 4.2,通过MongoDb数据库和HAML呈现视图.不过本文所展示的片段应该兼容任何Rails版本(尽管有些配置差异). 布置舞台 Image

  • ASP下存储过程编写入门全接触第1/5页

    ASP与存储过程(Stored Procedures)的文章不少,但是我怀疑作者们是否真正实践过.我在初学时查阅过大量相关资料,发现其中提供的很多方法实际操作起来并不是那么回事.对于简单的应用,这些资料也许是有帮助的,但仅限于此,因为它们根本就是千篇一律,互相抄袭,稍微复杂点的应用,就全都语焉不详了. 现在,我基本上通过调用存储过程访问SQL Server,以下的文字都是实践的总结,希望对大家能有帮助. 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 定义总是很抽象.存储过程其

  • windows下nginxHTTP服务器入门教程初级篇

    一.介绍Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为"engine X", 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器. 二.Location语法语法:location [=|~|~*|^~] /uri/ { - } 注: 1.~ 为区分大小写匹配 2.~* 为不区分大小写匹配 3.!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 示例一: location / { } 匹配任何查询,因为所有请求都

  • Python Web框架Flask下网站开发入门实例

    一.Flask简介 Flask 是一个 Python 实现的 Web 开发微框架.官网:http://flask.pocoo.org/ 二.Demo 1.代码结构 复制代码 代码如下: . ├── blog.py ├── static │   ├── css │   │   └── index.css │   ├── images │   │   ├── cat.jpg │   │   └── sheying1229.jpg │   └── js └── templates     ├── in

随机推荐