4、文件与内存转换相关

4、文件与内存转换相关

FileBufferToImageBuffer

也是一样的长话短说。这里涉及了一点,就是内存对齐

PE头与节区之间 节区与节区时间会发生内存对齐。在文件中有一个文件对齐

image

在可选PE头中有这两个进行标识,之前也写过这个内存对齐的博客,这里就不多说了

下面贴几个代码

模拟内存拉伸的代码

PCHAR FileBufferToImageBuff(PCHAR pFileBuffer)
{PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)pFileBuffer;PIMAGE_NT_HEADERS pNt = (PIMAGE_NT_HEADERS)((PCHAR)pDos + pDos->e_lfanew);PIMAGE_FILE_HEADER pFile = (PIMAGE_FILE_HEADER)((PCHAR)pNt + 4);PIMAGE_OPTIONAL_HEADER pOpt = (PIMAGE_OPTIONAL_HEADER)((PCHAR)pFile + IMAGE_SIZEOF_FILE_HEADER);PIMAGE_SECTION_HEADER pSec = (PIMAGE_SECTION_HEADER)((PCHAR)pOpt + pFile->SizeOfOptionalHeader);// 分配ImageBuffer对应的内存空间DWORD dwImageSize = pOpt->SizeOfImage;PCHAR pImageBuffer = (PCHAR)malloc(dwImageSize);if (!pImageBuffer) {log_error("分配ImageBuffer对应的内存空间  error");return NULL;}memset(pImageBuffer, 0, dwImageSize);// 把FileBuff 拉伸到 ImageBuff// 拷贝PE头memcpy(pImageBuffer, pFileBuffer, pOpt->SizeOfHeaders);// 拷贝节区数据for (size_t i = 0; i < pFile->NumberOfSections; i++){memcpy(pImageBuffer + pSec[i].VirtualAddress, pFileBuffer + pSec[i].PointerToRawData,pSec[i].SizeOfRawData);}return pImageBuffer;
}

拉伸还原的代码

PCHAR ImageBuffToFileBuff(PCHAR ImageBuffer,PDWORD fileSize)
{// 定位结构PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)ImageBuffer;PIMAGE_NT_HEADERS pNt = (PIMAGE_NT_HEADERS)(ImageBuffer + pDos->e_lfanew);PIMAGE_FILE_HEADER pFil = (PIMAGE_FILE_HEADER)((PCHAR)pNt + 4);PIMAGE_OPTIONAL_HEADER pOpt = (PIMAGE_OPTIONAL_HEADER)((PCHAR)pFil + IMAGE_SIZEOF_FILE_HEADER);// 定位节表结构PIMAGE_SECTION_HEADER pSec = (PIMAGE_SECTION_HEADER)((PCHAR)pOpt + pFil->SizeOfOptionalHeader);// 计算一下FileBufferDWORD dwFileSize = pOpt->SizeOfHeaders;for (size_t i = 0; i < pFil->NumberOfSections; i++){dwFileSize += pSec[i].SizeOfRawData;// 文件大小}PCHAR pFileBuffer = (PCHAR)malloc(dwFileSize);if (!pFileBuffer){log_error("malloc falild");return NULL;}memset(pFileBuffer, 0, dwFileSize);// 拷贝头memcpy(pFileBuffer, ImageBuffer, pOpt->SizeOfHeaders);for (size_t i = 0; i < pFil->NumberOfSections; i++){memcpy(pFileBuffer + pSec[i].PointerToRawData,ImageBuffer + pSec[i].VirtualAddress,pSec[i].SizeOfRawData);}return pFileBuffer;
}

保存文件的代码、

BOOL SaveFile(PCHAR FileBuffer, DWORD filesize)
{if (FileBuffer == NULL){return FALSE;}FILE* pFile = fopen(OUT_PATH, "wb");fwrite(FileBuffer, filesize, 1, pFile);fclose(pFile);return FALSE;
}

RvaToFoa and FoaToRva

这里主要也是一样的,目的是为了把文件加载到内存的数据,在WinHex中进行定位,

首先我们知道PE头一样的。不一样的是各个页表,他们之间会被内存对齐,导致不一样的。 但是页表中有页的大小和起始地址数据。 所以这个问题也就有了解决方法,下面直接贴代码

DWORD RvaToFoa(PCHAR pBuffer, DWORD dwRva)
{if (pBuffer == NULL) return -1;PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)pBuffer;PIMAGE_NT_HEADERS pNth = (PIMAGE_NT_HEADERS)(pBuffer + pDos->e_lfanew);PIMAGE_FILE_HEADER pFil = (PIMAGE_FILE_HEADER)((PCHAR)pNth + 4);PIMAGE_OPTIONAL_HEADER pOpt = (PIMAGE_OPTIONAL_HEADER)((CHAR)pFil + IMAGE_SIZEOF_FILE_HEADER);PIMAGE_SECTION_HEADER pSec = (PIMAGE_SECTION_HEADER)((PCHAR)pOpt + pFil->SizeOfOptionalHeader);if (dwRva <= pOpt->SizeOfHeaders)	return dwRva;for (size_t i = 0; i < pFil->NumberOfSections; i++){if (dwRva >= pSec[i].VirtualAddress && (dwRva <= (pSec[i].VirtualAddress + pSec[i].Misc.VirtualSize))){return dwRva - pSec[i].VirtualAddress + pSec[i].PointerToRawData;}}return -1;
}

FoaToRva代码如下:

DWORD FoaToRva(PCHAR pBuffer, DWORD dwFoa)
{if (pBuffer == NULL) return -1;PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)pBuffer;PIMAGE_NT_HEADERS pNth = (PIMAGE_NT_HEADERS)(pBuffer + pDos->e_lfanew);PIMAGE_FILE_HEADER pFil = (PIMAGE_FILE_HEADER)((PCHAR)pNth + 4);PIMAGE_OPTIONAL_HEADER pOpt = (PIMAGE_OPTIONAL_HEADER)((CHAR)pFil + IMAGE_SIZEOF_FILE_HEADER);PIMAGE_SECTION_HEADER pSec = (PIMAGE_SECTION_HEADER)((PCHAR)pOpt + pFil->SizeOfOptionalHeader);if (dwFoa <= pOpt->SizeOfHeaders)	return dwFoa;for (size_t i = 0; i < pFil->NumberOfSections; i++){if (dwFoa >= pSec[i].PointerToRawData && (dwFoa <= (pSec[i].PointerToLinenumbers + pSec[i].SizeOfRawData))){return dwFoa - pSec[i].PointerToLinenumbers + pSec[i].VirtualAddress;}}return -1;return 0;
}

这里再复习一下。页表中含有的数据有什么。

typedef struct _IMAGE_SECTION_HEADER {BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];union {DWORD   PhysicalAddress;DWORD   VirtualSize;  内存中的大小} Misc;DWORD   VirtualAddress;      虚拟地址 RVADWORD   SizeOfRawData;       文件中占的大小DWORD   PointerToRawData;	 文件起始位置DWORD   PointerToRelocations;DWORD   PointerToLinenumbers;WORD    NumberOfRelocations;WORD    NumberOfLinenumbers;DWORD   Characteristics;     页表属性
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

页表属性,其实就是表述该页表有那些属性,使用VS 直接进去里面有解释的。这里就不多说了

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

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

相关文章

1、PE 初识

1、PE 初识 概论 首先 PE头部分主要是学习PE结构的前半部分,每一个是做什么的,以及重点是什么,每一个是做什么用的。并使用Cpp代码来解析该PE头 注意这里用了一个Windows.h的头文件,后面再说。 PE是Windows系统 PE结构(Portable Executable),即可移植可执行文件格式,是…

交换空间swap

交换空间: 交换空间是硬盘上的一部分,被用作虚拟内存,当系统的物理内存(RAM)不足时,系统会使用交换空间来存储暂时不用的数据。1.关闭交换空间 1)关闭所有交换空间 swapoff -a2)关闭特定的交换空间 swapoff /dev/sdb12.开启交换空间 1)开启所有交换空间 swapon -a2…

2024 IDEA 2024.3 安装使用教程(附激活至2099年,以及常见问题处理)

IntelliJ IDEA简介 IntelliJ IDEA是一款非常强大的Java集成开发环境(IDE),由JetBrains公司开发。它提供了丰富的功能和工具,帮助开发者更高效地编写、调试和部署代码。 下面这种方式仅供交流学习,如果有能力还请支持正版 下载安装 下载 IDEA 2024.3 版本的安装包 为了方便,也…

第十六次作业

1、通过华为云沃土云创计划免费薅云服务器 打开链接:https://developer.huaweicloud.com/programs/dev-program.html 使能⽅向选择个⼈在这个 计划权益中申请优惠券免费购买成功2、复现windows、linux权限维持技巧 windows权限维持: 隐藏⽂件:利⽤⽂件属性 ⽂件右键属性,勾…

OpenCL 编程步骤 2. 获取设备

clGetDeviceIDs 查询支持OpenCL设备列表: cl_int clGetDeviceIDs(cl_platform_id platform ,cl_device_type device_type ,cl_uint num_entries ,cl_device_id *devices ,cl_uint *num_devices )与clGetPlatformIDs函数类似,第一次调用时,devic…

记录一下:小华半导体HC32F448建立MDK工程

1.先到官网上下载文件 a>下载驱动库:HC32F448_DDL_Rev1.1.0.zip 驱动库中是包括了例程的。 b>下载样例:HC32F448_Template_Rev1.0.1.zip 可以直接复制官方的样例,就不用自己创建工程了。 c>下载芯片支持包:HC32F448_IDE_Rev1.0.1.zip 下载后双击安装即可。否则KEI…

4大应用场景揭秘:AI视频监控在养老院中的智能化管理与安全保障

随着人口老龄化的加剧,养老院的管理面临着越来越多的挑战。传统的人工巡查方式不仅难以做到全天候监控,而且存在响应迟缓、效率低下等问题。为了解决这些问题,思通数科推出的AI视频监控系统,利用人工智能技术提供了一种高效、智能化的解决方案。尤其在养老院的老人体征监控…

考勤管理系统

实现对用户信息的添加,查看,删除 实现对部门信息的添加,查看 实现用户登录功能,修改密码功能。 页面与之前的大相径庭。 还是一样的框架总体感觉换汤不换药,目前就是熟练度问题

浏览器怎么渲染数据的

突然发现自己对于css的样式规则一直都没有完全明白,今天写文好好整明白 浏览器渲染原理 1. 浏览器向服务器请求html文件 2. html文件返回浏览器 3. 浏览器解读html文件<!DOCTYPE html>//告诉浏览器,这是html5文件// html树<html lang="en">//语言<h…

在宝塔里添加反向代理

安装OnlyOffice时,需要配置反向代理; 完成以上操作之后,访问时有可能出现504报错,也可能就可以正常访问了。如果报错可以修改上图反向代理中的目标URL的内容将域名改成127.0.0.1。我当时改成http://127.0.0.1:9633就可以了本文来自博客园,作者:飞龙在生,转载请注明原文链…

2024 Clion安装使用教程(附激活以及常见问题处理)

第一步:下载Clion安装包 访问Clion官网,下载Clion第二步: 安装 Clion下载完成后,进行安装,next,安装完成点击xx 关掉程序! 第三步: 下载补丁 Clion补丁文件 点击获取补丁下载成功后,打开标注的文件文件夹 , 进入到文件夹 /jetbra 注意: 这个文件夹单独copy一份,所属文…