VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 161|回复: 3

[已解决]C语言PE文件filebuffer到imagebuffer的错误

[复制链接]
16_avatar_middle
最佳答案
0 
在线会员 发表于 2020-11-4 10:39:08 | 显示全部楼层 |阅读模式
本帖最后由 Met32 于 2020-11-4 10:42 编辑

代码如下,, FileToImage函数 当执行到for循环遍历copy节表的内容.....就报错了  求各位师傅帮忙看一下问题所在~~
顺便问一下 有没有PE方面的书籍 (PE权威指南看不懂~~ 汇编太水了)
  1. // 代码节空白添加.cpp : Defines the entry point for the console application.
  2. //

  3. #include "stdafx.h"
  4. #include <windows.h>
  5. #include <stdlib.h>
  6. int FileBuffers(PVOID* FileBuffer){//传入的FileBuffer
  7.         LPVOID PtempBuffer;
  8.         FILE* f = fopen("C:\\Users\\Administrator\\Desktop\\PETool 1.0.0.5.exe","rb");
  9.         if(!f)
  10.         {
  11.                 printf("文件打开失败\n");
  12.                 return 0;
  13.         }
  14.         fseek(f,0,SEEK_END);
  15.         int file_size = ftell(f);
  16.         fseek(f,0,SEEK_SET);
  17.         PtempBuffer = malloc(file_size);
  18.         if(!PtempBuffer){
  19.                 printf("malloc分配失败");
  20.                 return 0;
  21.         }
  22.         size_t n = fread(PtempBuffer,file_size,1,f);
  23.         if(!n){
  24.                 printf("内存分配失败");
  25.                 return 0;
  26.         }
  27.         *FileBuffer = PtempBuffer;
  28.         PtempBuffer = NULL;
  29.         fclose(f);
  30.         return file_size;
  31. }
  32. int FileToImage(PVOID Filebuffer,PVOID* Imagebuffer){
  33.         //PE头信息
  34.         PIMAGE_DOS_HEADER pDosHeader = NULL;
  35.         PIMAGE_NT_HEADERS pNTHeader = NULL;
  36.         PIMAGE_FILE_HEADER pPEHeader =NULL;
  37.         PIMAGE_OPTIONAL_HEADER PoptionHeader = NULL;
  38.         PIMAGE_SECTION_HEADER pSectionHeader = NULL;
  39.        
  40.         PVOID pTempImagebuffer = NULL; //临时的imagebuffer

  41.         if(!Filebuffer){
  42.                 printf("读到内存的Filebuffer失效\n");
  43.                 return 0;
  44.         }
  45.         if(*((PWORD)Filebuffer) != IMAGE_DOS_SIGNATURE){
  46.                 printf("不含MZ标志,不是EXE文件\n");
  47.                 return 0;
  48.         }
  49.         pDosHeader = (PIMAGE_DOS_HEADER)Filebuffer; //强制结构体类型转换pDosHeader
  50.         pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)Filebuffer+pDosHeader->e_lfanew);//NT头开始的地方
  51.         if(*((PWORD)((DWORD)Filebuffer+pDosHeader->e_lfanew)) != IMAGE_NT_SIGNATURE){//判断PE标识
  52.                 printf("不是有效的PE标识\n");
  53.         }
  54.         pPEHeader = (PIMAGE_FILE_HEADER)((DWORD)pNTHeader+4);//PE标准头开始
  55.         PoptionHeader = (PIMAGE_OPTIONAL_HEADER)((DWORD)pPEHeader+0X18);//PE可选头开始  IMAGE_SIZEOF_FILE_HEADER
  56.         pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)PoptionHeader+pPEHeader->SizeOfOptionalHeader);//PE节表开始
  57.         //分配动态内存
  58.         pTempImagebuffer = malloc(PoptionHeader->SizeOfImage);
  59.         if(!pTempImagebuffer){
  60.                 printf("pTempImagebuffer为NULL");
  61.                 return 0;
  62.         }
  63.         //为临时的imagebuffer初始化
  64.         memset(pTempImagebuffer,0,PoptionHeader->SizeOfImage);
  65.         //copy头部
  66.         memcpy(pTempImagebuffer,pDosHeader,PoptionHeader->SizeOfHeaders);
  67.         //创建一个临时的PE节表
  68.         PIMAGE_SECTION_HEADER pTempSectionHeader = pSectionHeader;

  69.         for(DWORD i=0;i<pPEHeader->NumberOfSections;i++,pTempSectionHeader++){
  70.                 //copy节从Filebuffer到临时的imagebuffer   
  71.                 //断点到这里有问题  各位师傅求解决
  72.                         memcpy((void*)((DWORD)pTempImagebuffer+pTempSectionHeader->VirtualAddress)
  73.                                 ,(void*)((DWORD)Filebuffer+pTempSectionHeader->PointerToRawData)
  74.                                 ,pTempSectionHeader->SizeOfRawData);

  75.                 }
  76.         *Imagebuffer = pTempImagebuffer;
  77.         pTempImagebuffer = NULL;
  78.         return PoptionHeader->SizeOfImage;
  79. }

  80. int main(int argc, char* argv[])
  81. {
  82.         PVOID FileBuffer;
  83.         PVOID ImageBuffer;
  84.         int  x = FileBuffers(&FileBuffer);
  85.         printf("FileBuffer分配大小为:%d个字节\n",x);
  86.         int y = FileToImage(FileBuffer,&ImageBuffer);
  87.         printf("大小为%d\n",y);
  88.         return 0;
  89. }

复制代码
最佳答案
04_avatar_small
2020-11-4 19:35:20
本帖最后由 xiao14116 于 2020-11-4 19:36 编辑

刚才调试了下,直接原因是因为你申请的内存空间不够,所以出错了
C语言PE文件filebuffer到imagebuffer的错误
memcpy(pTempImagebuffer,pDosHeader,PoptionHeader->SizeOfHeaders);
PoptionHeader->SizeOfHeaders的值远远大于你申请的内存空间




上一篇:CBCGPGridCtrl 控件
下一篇:怎么快速看懂一个项目
04_avatar_middle
最佳答案
9 
online_vip 发表于 2020-11-4 19:35:20 | 显示全部楼层    本楼为最佳答案   
bestAnswer
本帖最后由 xiao14116 于 2020-11-4 19:36 编辑

刚才调试了下,直接原因是因为你申请的内存空间不够,所以出错了
C语言PE文件filebuffer到imagebuffer的错误
memcpy(pTempImagebuffer,pDosHeader,PoptionHeader->SizeOfHeaders);
PoptionHeader->SizeOfHeaders的值远远大于你申请的内存空间
08_avatar_middle
最佳答案
3 
在线会员 发表于 2020-11-4 17:29:08 | 显示全部楼层
好强 根本看不懂
16_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-11-5 08:29:57 | 显示全部楼层
xiao14116 发表于 2020-11-4 19:35
刚才调试了下,直接原因是因为你申请的内存空间不够,所以出错了

memcpy(pTempImagebuffer,pDosHeader,P ...

谢谢表哥,原因是我PE标准头那加的0X18加错了,应该用sizeof算一下的
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-12-2 16:37

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表