3,881
社区成员
发帖
与我相关
我的任务
分享
#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;
}
//当 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