首页 > 其他分享 >FileBuffer-ImageBuffer代码实现

FileBuffer-ImageBuffer代码实现

时间:2023-04-26 21:49:06浏览次数:41  
标签:return 代码 printf LPVOID HEADER PIMAGE DWORD FileBuffer ImageBuffer

#include "stdafx.h"
#include<stdio.h>
#include<windows.h>
#include<malloc.h>
//
//FileBuffer函数
DWORD ReadPEFile(LPVOID* ppFileBuffer)
{
    FILE* pFile=NULL;
    DWORD SizeFileBuffer=0;
    pFile=fopen("C://WINDOWS//system32//notepad.exe","rb");
    if(!pFile)
    {
        printf("打开notepad失败\n");
        return 0;
    }
    //获取文件大小
    fseek(pFile,0,SEEK_END);
    SizeFileBuffer=ftell(pFile);
    fseek(pFile,0,SEEK_SET);
    if(!SizeFileBuffer)
    {
        printf("读取文件大小失败\n");
        return 0;
    }
    //开辟空间
    *ppFileBuffer=malloc(SizeFileBuffer);
    if(!*ppFileBuffer)
    {
        printf("开辟空间失败\n");
        fclose(pFile);
        return 0;
    }
    //复制数据
    size_t n=fread(*ppFileBuffer,SizeFileBuffer,1,pFile);
    if(!n)
    {
        printf("复制数据失败\n");
        free(*ppFileBuffer);
        fclose(pFile);
        return 0;
    }
    fclose(pFile);
    return SizeFileBuffer;
}
 
 
 
///
//FileBuffer--->ImgaeBuffer
DWORD FileBufferToImageBuffer(LPVOID pFileBuffer,LPVOID* ppImageBuffer)
{
    PIMAGE_DOS_HEADER pDosHeader=NULL;
    PIMAGE_NT_HEADERS pNTHeader=NULL;
    PIMAGE_FILE_HEADER pFileHeader=NULL;
    PIMAGE_OPTIONAL_HEADER pOptionalHeader=NULL;
    PIMAGE_SECTION_HEADER pSectionHeader=NULL;
 
    if(!pFileBuffer)
    {
        printf("FileBuffer函数调用失败\n");
        return 0;
    }
    printf("%x\n",pFileBuffer);
//判断是否是PE文件
    pDosHeader=(PIMAGE_DOS_HEADER)pFileBuffer;
    if(pDosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
    {
        printf("不是有效的MZ标志\n");
        return 0;
    }
 
    pNTHeader=(PIMAGE_NT_HEADERS)((DWORD)pFileBuffer+pDosHeader->e_lfanew);
    if(pNTHeader->Signature!=IMAGE_NT_SIGNATURE)
    {
        printf("不是有效的PE标志\n");
        return 0;
    }
 
    pFileHeader=(PIMAGE_FILE_HEADER)(((DWORD)pNTHeader)+4);
    
    pOptionalHeader=(PIMAGE_OPTIONAL_HEADER)((DWORD)pFileHeader+20);
 
 
    //开辟ImageBuffer空间
    *ppImageBuffer=malloc(pOptionalHeader->SizeOfImage);
    if(!*ppImageBuffer)
    {
        printf("开辟ImageBuffer空间失败");
        return 0;
    }
    printf("SizeOfImage%x\n",pOptionalHeader->SizeOfImage);
    //malloc清零
    memset(*ppImageBuffer,0,pOptionalHeader->SizeOfImage);
 
    //复制Headers
    printf("SizeOfHeader%x\n",pOptionalHeader->SizeOfHeaders);
    memcpy(*ppImageBuffer,pDosHeader,pOptionalHeader->SizeOfHeaders);
 
    //循环复制节表
    pSectionHeader=(PIMAGE_SECTION_HEADER)((DWORD)pOptionalHeader+pFileHeader->SizeOfOptionalHeader);
    for(int i=1;i<=pFileHeader->NumberOfSections;i++,pSectionHeader++)
    {
        memcpy((LPVOID)((DWORD)*ppImageBuffer+pSectionHeader->VirtualAddress),(LPVOID)((DWORD)pFileBuffer+pSectionHeader->PointerToRawData),pSectionHeader->SizeOfRawData);
        printf("%d\n",i);
    }
    printf("拷贝完成\n");
    return pOptionalHeader->SizeOfImage;
}
 
 
 
//ImageBufferToFileBuffer
DWORD ImageBufferToFileBuffer(LPVOID pImageBuffer,LPVOID* ppBuffer)
{
    PIMAGE_DOS_HEADER pDosHeader=NULL;
    PIMAGE_NT_HEADERS pNTHeader=NULL;
    PIMAGE_FILE_HEADER pFileHeader=NULL;
    PIMAGE_OPTIONAL_HEADER pOptionalHeader=NULL;
    PIMAGE_SECTION_HEADER pSectionHeader=NULL;
 
    if(!pImageBuffer)
    {
        printf("error");
        return 0;
    }
 
    pDosHeader=(PIMAGE_DOS_HEADER)pImageBuffer;
    pNTHeader=(PIMAGE_NT_HEADERS)((DWORD)pImageBuffer+pDosHeader->e_lfanew);
    pFileHeader=(PIMAGE_FILE_HEADER)((DWORD)pNTHeader+4);
    pOptionalHeader = (PIMAGE_OPTIONAL_HEADER)((DWORD)pFileHeader + 20);
    pSectionHeader=(PIMAGE_SECTION_HEADER)((DWORD)pOptionalHeader+pFileHeader->SizeOfOptionalHeader);
 
    //得到FileBuffer的大小
    for(int i=1;i<pFileHeader->NumberOfSections;i++,pSectionHeader++)
    {
        printf("%d\n",i);
    }
    
    //循环到最后一个节表
    DWORD SizeOfBuffer=pSectionHeader->PointerToRawData+pSectionHeader->SizeOfRawData;
 
    //开辟空间
    *ppBuffer=malloc(SizeOfBuffer);
    if(!*ppBuffer)
    {
        printf("开辟Buffer空间失败\n");
        return 0;
    }
    printf("SizeOfBuffer%x\n",SizeOfBuffer);
    memset(*ppBuffer,0,SizeOfBuffer);
 
    //复制头
    memcpy(*ppBuffer,pImageBuffer,pOptionalHeader->SizeOfHeaders);
    //复制节表
    pSectionHeader=(PIMAGE_SECTION_HEADER)((DWORD)pOptionalHeader+pFileHeader->SizeOfOptionalHeader);
    for(int j=1;j<=pFileHeader->NumberOfSections;j++,pSectionHeader++)
    {
        printf("%d\n",j);
        memcpy((LPVOID)((DWORD)*ppBuffer+pSectionHeader->PointerToRawData),(LPVOID)((DWORD)pImageBuffer+pSectionHeader->VirtualAddress),pSectionHeader->SizeOfRawData);
    }
    printf("拷贝完成\n");
    return SizeOfBuffer;
 
 
}
 
 
 
 
//存贮到新的exe
BOOL MemeryToFile(LPVOID pBuffer,DWORD SizeOfBuffer)
{
    FILE* fpw=fopen("C://WINDOWS//system32//creakme.exe","wb");
    if(!fpw)
    {
        printf("fpw error");
        return false;
    }
    if (fwrite(pBuffer, 1, SizeOfBuffer, fpw) == 0)
    {
        printf("fpw fwrite fail");
        return false;
    }
    fclose(fpw);            
    fpw = NULL;
    printf("success\n");
    return true;
 
}
 
 
 
 
 
 
 
 
int main()
{
    LPVOID pFileBuffer=NULL;
    LPVOID* ppFileBuffer=&pFileBuffer;    //定义二级指针
    LPVOID pImageBuffer=NULL;
    LPVOID* ppImageBuffer=&pImageBuffer;  //定义二级指针
    DWORD SizeOfFileBuffer=0;
    DWORD SizeOfImageBuffer=0;
    DWORD SizeOfBuffer=0;
 
    LPVOID pBuffer=NULL;
    LPVOID* ppBuffer=&pBuffer;
 
 
    //调用filebuffer函数
    SizeOfFileBuffer=ReadPEFile(ppFileBuffer);
    if(!SizeOfFileBuffer)
    {
        printf("FileBuffer函数调用失败 \n");
        return 0;
    }
    pFileBuffer=*ppFileBuffer;
 
 
 
    //调用FileBufferToImageBuffer函数
    SizeOfBuffer=FileBufferToImageBuffer(pFileBuffer,ppImageBuffer);
 
    if(!SizeOfBuffer)
    {
        printf("调用FileBufferToImageBuffer函数失败");
        return 0;
    }
 
    //调用ImageBufferToBuffer
    SizeOfBuffer=ImageBufferToFileBuffer(pImageBuffer,ppBuffer);
    pBuffer=*ppBuffer;
    if(!SizeOfBuffer)
    {
        printf("SizeOfBuffer error");
        return 0;
    }
 
    //调用MemeryToFile
    if(MemeryToFile(pBuffer,SizeOfBuffer)==false)
    {
        printf("end");
        return 0;
    }
 
 
 
 
 
}
 

 



标签:return,代码,printf,LPVOID,HEADER,PIMAGE,DWORD,FileBuffer,ImageBuffer
From: https://www.cnblogs.com/cspecialr/p/17357426.html

相关文章

  • P44代码节空白区添加代码
    1.我们添加的代码不是c,不是汇编,而是二进制,因为exe都是二进制组成的,我们要知道一些汇编的硬编码,call的硬编码是E8,jmp的硬编码是E92.知道了call的硬编码,那么后面的地址是直接用编译器打开的地址吗?不是的,地址是经过转换得到的,公式:真正要跳转的地址=E8下一条指令的地址+X,X就是call后......
  • P43FileBuffer-ImageBuffer
    MISC可能比SizeOfRawData大可能含有一些数据未初始化RVA:相对偏移地址FOA:文件偏移地址PE加载的过程: 1、根据SizeOfImage的大小,开辟一块缓冲区(ImageBuffer). 2、根据SizeOfHeader的大小,将头信息从FileBuffer拷贝到ImageBuffer 3、根据节表中的信息......
  • POT超阈值模型和极值理论EVT分析|附代码数据
    全文链接:http://tecdat.cn/?p=16845最近我们被客户要求撰写关于极值理论的研究报告,包括一些图形和统计输出。本文依靠EVT对任何连续分布的尾部建模。尾部建模,尤其是POT建模,对于许多金融和环境应用至关重要POT模型其主要动机是为高洪水流量的概率模型提供实用工具。但是,EVT的优......
  • 多元时间序列滚动预测:ARIMA、回归、ARIMAX模型分析|附代码数据
    原文链接:http://tecdat.cn/?p=22849最近我们被客户要求撰写关于多元时间序列滚动预测的研究报告,包括一些图形和统计输出。当需要为数据选择最合适的预测模型或方法时,预测者通常将可用的样本分成两部分:内样本(又称"训练集")和保留样本(或外样本,或"测试集")。然后,在样本中估计模型,并......
  • R语言Lee-Carter模型对年死亡率建模预测预期寿命|附代码数据
    原文链接:http://tecdat.cn/?p=17347最近我们被客户要求撰写关于Lee-Carter模型的研究报告,包括一些图形和统计输出。昨天上午,我们获得了分娩产妇的平均年龄两个图表,根据孩子的出生顺序排序,区间是1905-1965年然后是1960-2000年:点击标题查阅往期内容R语言分布滞后非线性模型......
  • 数据分享|逻辑回归、随机森林、SVM支持向量机预测心脏病风险数据和模型诊断可视化|附
    原文链接:http://tecdat.cn/?p=24973最近我们被客户要求撰写关于心脏病的研究报告,包括一些图形和统计输出。世界卫生组织估计全世界每年有1200万人死于心脏病。在美国和其他发达国家,一半的死亡是由于心血管疾病简介心血管疾病的早期预后可以帮助决定改变高危患者的生活方式,从......
  • 低代码应用开发平台,让数据管理更简单!
    在数据管理越来越规范化的今天,低代码应用开发平台也获得了进步和发展的机会和空间。想要将企业内部的数据资源做好系统管理,从而为各个时期的经营决策提供强有力的证据和基础,低代码应用开发平台就是其中备受喜爱的工具。本文主要从它的特点、优势等多个方面让大家了解低代码应用开......
  • Java通过反射给final对象赋值(代码库)
    直接赋值会报错Methodthrew'java.lang.UnsupportedOperationException'exception.给没有set方法的类如下赋值publicstaticvoidsetFieldValue(Objectobj,StringfieldName,Objectval){if(isEmpty(obj)||isEmpty(fieldName))return;ClasssuperClas......
  • 低代码架构设计
    后端设计,领域驱动框架设计。 前端设计界面自动生成 界面示例  ......
  • 426测试代码
    sdf.h:点击查看sdf.h代码#ifndef_SDF_H#define_SDF_H//定义设备信息结构typedefstructDeviceInfo_st{unsignedcharIssuerName[40];//设备生产商名称unsignedcharDeviceName[16];unsignedcharDeviceSerial[16];unsignedintDeviceVersion;unsignedintStan......