VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1375|回复: 2

[讨论] 关于PE文件内存加载的错误

[复制链接]
16_avatar_middle
最佳答案
0 
在线会员 发表于 2020-10-27 15:25:56 | 显示全部楼层 |阅读模式
1)、把一个PE文件读入内存缓冲区File->FileBuffer
2)、PE文件的拉伸,FileBuffer->ImageBuffer
3)、PE文件的还原,开辟另一块空间,把ImageBuffer重新还原成文件刚加载进内存时的样子
4)、PE文件的转存,把3得到的结果转存为文件,看看是否可以运行
滴水逆向2015-03-16期课后做业
编译器提示好像是 memcpy错误
如有大佬解决,有偿一包烟钱~~ 可以加我Q 2070002026

  1. #include "stdafx.h"
  2. #include<windows.h>
  3. #include<winnt.h>
  4. #include<stdlib.h>
  5. #define IMAGE_SIZEOF_SHORT_NAME        8
  6. LPVOID ReadPEFile(IN LPSTR lpszFile){
  7.         FILE* Pfile = NULL;
  8.         LPVOID pFileBuffer = NULL;
  9.         Pfile = fopen(lpszFile,"rb");
  10.         if(!Pfile){
  11.                 printf("无法打开exe程序");
  12.                 return NULL;
  13.         }
  14.         fseek(Pfile,0,SEEK_END);
  15.         DWORD fileSize = ftell(Pfile);//文件大小
  16.         fseek(Pfile,0,SEEK_SET);
  17.         pFileBuffer=(char*)malloc(fileSize);//分配文件大小
  18.         //将文件数据读入缓冲区
  19.         size_t n = fread(pFileBuffer,fileSize,1,Pfile);
  20.         if(!n){
  21.                 printf("读取数据失败\n");
  22.                 free(pFileBuffer);
  23.                 fclose(Pfile);
  24.                 return NULL;
  25.         }
  26.         fclose(Pfile);
  27.         return pFileBuffer;

  28. }
  29. LPVOID CopyFileBufferToImageBuffer(){
  30.         LPVOID pFileBuffer = NULL;
  31.         LPVOID pimageBuffer = NULL;
  32.         PIMAGE_DOS_HEADER pdosheader = NULL;
  33.         PIMAGE_NT_HEADERS pntheader= NULL;
  34.         PIMAGE_FILE_HEADER pheader= NULL;
  35.         PIMAGE_OPTIONAL_HEADER poptionheader = NULL;
  36.         PIMAGE_SECTION_HEADER psection = NULL;
  37.         pFileBuffer = ReadPEFile("C:\\Windows\\SysWOW64\\notepad.exe");//读文件到缓冲区
  38.         if(!pFileBuffer){
  39.                 printf("读文件失败");
  40.                 return NULL;
  41.         }
  42.         pdosheader = (PIMAGE_DOS_HEADER)pFileBuffer;
  43.         DWORD pe = pdosheader->e_lfanew+0x4;//pe标识
  44.         pheader = (PIMAGE_FILE_HEADER)(DWORD)pFileBuffer+pe;
  45.         DWORD pebz = sizeof(IMAGE_FILE_HEADER);
  46.         poptionheader =  (PIMAGE_OPTIONAL_HEADER)(DWORD)pheader+pebz;
  47.         pimageBuffer = malloc(poptionheader->SizeOfImage);
  48.         //memset(pimageBuffer,0,poptionheader->SizeOfImage);
  49.         memcpy(pimageBuffer,pFileBuffer,((size_t)poptionheader->SizeOfImage));//copy的整体的大小
  50.         psection = (PIMAGE_SECTION_HEADER)((DWORD)poptionheader+poptionheader->SizeOfImage);//节表
  51.         for(int i=0;i<pheader->NumberOfSections;i++,psection++){
  52.                 memcpy((void*)((DWORD)pimageBuffer+psection->VirtualAddress),(void*)((DWORD)pheader+psection->PointerToRawData),((size_t)psection->SizeOfRawData));//拷贝到pimageBuffer



  53.         }
  54.         return pimageBuffer;
  55. }
  56. LPVOID CopyImageBufferToNewBuffer(LPSTR lpszFile){
  57.         LPVOID pnewbuffer = NULL;
  58.         LPVOID pimageBuffer = NULL;
  59.         PIMAGE_DOS_HEADER pdosheader = NULL;
  60.         PIMAGE_NT_HEADERS pntheader= NULL;
  61.         PIMAGE_FILE_HEADER pheader= NULL;
  62.         PIMAGE_OPTIONAL_HEADER poptionheader = NULL;
  63.         PIMAGE_SECTION_HEADER psection = NULL;
  64.         FILE* f = NULL;
  65.         char* FilePath = "D:\\zuoye\\Notpead1.exe";
  66.         pimageBuffer=CopyFileBufferToImageBuffer();//缓冲区内存
  67. //        pnewbuffer = malloc(fileSize);
  68.         FILE* pfile = fopen(lpszFile,"rb");
  69.         fseek(pfile,0,SEEK_END);
  70.         DWORD fileSize = ftell(pfile);
  71.         pnewbuffer = malloc(fileSize);
  72.         memset(pnewbuffer,0,fileSize);
  73.         pdosheader = (PIMAGE_DOS_HEADER)pimageBuffer;
  74.         pntheader = (PIMAGE_NT_HEADERS)((DWORD)pimageBuffer+pdosheader->e_lfanew);
  75.         pheader = (PIMAGE_FILE_HEADER)((DWORD)pntheader+4);
  76.         poptionheader = (PIMAGE_OPTIONAL_HEADER)((DWORD)pheader+IMAGE_SIZEOF_FILE_HEADER);//PE标准头
  77.         memcpy(pnewbuffer,pimageBuffer,poptionheader->SizeOfHeaders);//复制到pnewbuffer
  78.         psection =(PIMAGE_SECTION_HEADER)((DWORD)poptionheader+ pheader->SizeOfOptionalHeader);
  79.         for(int i=0;i<pheader->NumberOfSections;i++,psection++){
  80.                 memcpy((void*)((DWORD)pnewbuffer+psection->PointerToRawData),(void*)((DWORD)pimageBuffer+psection->VirtualAddress),(size_t)(psection->SizeOfRawData));
  81.                 }
  82.         f = fopen(FilePath,"wb");
  83.         fwrite(pnewbuffer,fileSize,1,f);
  84.         fclose(f);
  85.         return 0;
  86. }
  87. int main(int argc, char* argv[])
  88. {
  89.    CopyImageBufferToNewBuffer("C:\\Windows\\SysWOW64\\notepad.exe");
  90.   

  91.          
  92.          return 0;
  93. }
复制代码




上一篇:定时软件
下一篇:VC6 MFC工程怎么升级到 64位工程
15_avatar_middle
最佳答案
6 
online_vip 发表于 2020-10-28 21:20:50 | 显示全部楼层
关于PE文件内存加载的错误
大小计算错误
04_avatar_middle
最佳答案
22 
online_vip 发表于 2020-10-27 18:48:12 | 显示全部楼层
这代码,连个注释都没有,大量的变量都不知道是啥意思,谁有耐心去看
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

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

关闭

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

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

GMT+8, 2023-6-2 02:47

Powered by CcTry.CoM

© 2009-2021 cctry.com

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