为什么一打印PE导出表信息就会报错:0xC0000005

米懵逼琪罗 2017-07-08 09:12:14
代码如下,功能是打印PE导出表的Characteristics,也把RVA转换成FOA了,但就是读取错误,一直报下面这个错误,代码不多。

代码如下:
#include "stdafx.h"
#include "string.h"
#include "windows.h"
#include "stdlib.h"
//函数功能:把RVA转换成FOA
size_t RVAToOffset(size_t stRVA,PVOID lpFileBuf)
{
PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)lpFileBuf;
size_t stPEHeadAddr = (size_t)lpFileBuf + pDos ->e_lfanew;
PIMAGE_NT_HEADERS32 pNT = (PIMAGE_NT_HEADERS32)stPEHeadAddr;
//区段数
DWORD dwSectionCount = pNT->FileHeader.NumberOfSections;
//内存对齐大小
DWORD dwMemoruAil = pNT->OptionalHeader.SectionAlignment;
PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pNT);
//距离命中节的起始虚拟地址的偏移值。
DWORD dwDiffer = 0;
for (DWORD i = 0; i < dwSectionCount; i++)
{
//模拟内存对齐机制
DWORD dwBlockCount = pSection[i].SizeOfRawData/dwMemoruAil;
dwBlockCount += pSection[i].SizeOfRawData%dwMemoruAil? 1 : 0;

DWORD dwBeginVA = pSection[i].VirtualAddress;
DWORD dwEndVA = pSection[i].VirtualAddress + dwBlockCount * dwMemoruAil;
//如果stRVA在某个区段中
if (stRVA >= dwBeginVA && stRVA < dwEndVA)
{
dwDiffer = stRVA - dwBeginVA;
return pSection[i].PointerToRawData + dwDiffer;
}
else if (stRVA < dwBeginVA)//在文件头中直接返回
{
return stRVA;
}
}
return 0;
}

//功能:打印导出表的Characteristics
void printExportDirectory(char path[])
{
FILE* fp = (FILE*)fopen(path,"rb");
if(!fp)
{
printf("文件打开失败!\n");
return;
}
fseek(fp,0,SEEK_END);
int length = ftell(fp);
fseek(fp,0,SEEK_SET);
char* locFB = (char*)malloc(length);
if(!locFB)
{
printf("FileBuffer内存空间申请失败!\n");
fclose(fp);
return;
}
char* initiallocFB = (char*)locFB;
memset(locFB,0,length);
int x = fread(locFB,1,length,fp);
if(x == 0 || x == NULL)
{
printf("文件读取失败!\n");
free(locFB);
fclose(fp);
return;
}
PIMAGE_DOS_HEADER pDOS = (PIMAGE_DOS_HEADER)locFB;
PIMAGE_NT_HEADERS32 pNT = (PIMAGE_NT_HEADERS32)((int)locFB + pDOS->e_lfanew);
locFB = locFB + pDOS->e_lfanew + 24 + pNT->FileHeader.SizeOfOptionalHeader - 128;
if(*((int*)locFB) == 0)
{
printf("该程序没有导出表!\n");
fclose(fp);
free(initiallocFB);
return;
}
PIMAGE_EXPORT_DIRECTORY pDirectory = (PIMAGE_EXPORT_DIRECTORY)RVAToOffset(*((int*)locFB),initiallocFB);
printf("Characteristics:%x\n",pDirectory->Characteristics);
}

int main(int argc, char* argv[])
{
char path[] = "C:\\IEXPLORE.exe";
printExportDirectory(path);
system("pause");
return 0;
}

...全文
265 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
米懵逼琪罗 2017-07-09
  • 打赏
  • 举报
回复
引用 2 楼 战在春秋的回复:
/
//当 RVAToOffset函数返回值pDirectory  = 0时
PIMAGE_EXPORT_DIRECTORY pDirectory = (PIMAGE_EXPORT_DIRECTORY)RVAToOffset(*((int*)locFB),initiallocFB);
//调用下面这行会出现题目中描述的错误 
printf("Characteristics:%x\n",pDirectory->Characteristics);
也就是说,RVAToOffset函数存在返回值为0的情况 。 解决方案: 要么在main函数中对返回值为0的情况进行判断处理 要么跟踪代码,检查逻辑,保证RVAToOffset别返回0
没有我打印过了,返回的那个值不为零,而且是正确的导出表首地址,但就是弹错,好像不让读取的样子,不知道怎么回事。。。
米懵逼琪罗 2017-07-09
  • 打赏
  • 举报
回复
没有我打印过了,返回的那个值不为零,而且是正确的导出表首地址,但就是弹错,好像不让读取的样子,不知道怎么回事。。。
米懵逼琪罗 2017-07-09
  • 打赏
  • 举报
回复
哦,搞明白了,之前错以为FileBuffer的起始地址为0x00000000
战在春秋 2017-07-09
  • 打赏
  • 举报
回复
/
//当 RVAToOffset函数返回值pDirectory  = 0时
PIMAGE_EXPORT_DIRECTORY pDirectory = (PIMAGE_EXPORT_DIRECTORY)RVAToOffset(*((int*)locFB),initiallocFB);
//调用下面这行会出现题目中描述的错误 
printf("Characteristics:%x\n",pDirectory->Characteristics);
也就是说,RVAToOffset函数存在返回值为0的情况 。 解决方案: 要么在main函数中对返回值为0的情况进行判断处理 要么跟踪代码,检查逻辑,保证RVAToOffset别返回0
米懵逼琪罗 2017-07-08
  • 打赏
  • 举报
回复
不只是IE.exe,其它有导出表的程序被读取也是这样子。。。。。啊好绝望,检查了2个多小时都没看出来到底是哪里出问题

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧