首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

怎么得到PE文件的节(段)的个数

2012-03-25 
如何得到PE文件的节(段)的个数?以下C+代码为我想得一个PE文件的节(段)的个数,在VC中的MFC调试,可最后测试

如何得到PE文件的节(段)的个数?
以下C+代码为我想得一个PE文件的节(段)的个数,在VC中的MFC调试,可最后测试居然为0,肯定不对。不知错在哪了?代码我都加了注解。
最好用原码教我,谢
DWORD   cbRead;
char   szFileName[MAX_PATH];
GetModuleFileName(NULL,szFileName,MAX_PATH);/得到程序自我位置
HANDLE   hFile;
hFile=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,0);/打开文件
IMAGE_DOS_HEADER   dos_head;
ReadFile(hFile,&dos_head,sizeof(IMAGE_DOS_HEADER),&cbRead,NULL);
int   fileheadPos=dos_head.e_lfanew   -20;
/因为IMAGE_FILE_HEADER结构占20字节,dos_head.e_lfanew为IMAGE_OPTIONL_HEADER位置,所以用该位置减20即为IMAGE_FILE_HEADER的偏移量
SetFilePointer(hFile,fileheadPos,NULL,FILE_BEGIN);/定位在pe   head处
IMAGE_FILE_HEADER   file_head;
ReadFile(hFile,&file_head,sizeof(IMAGE_FILE_HEADER),&cbRead,NULL);/填充一个IMAGE_FILE_HEADER对像,以读取其成员NumberOfSections,即节的个数.这一行经测试,应无误,cbRead的值为20,正是一个IMAGE_FILE_HEADER长度
int   numberofsections=file_head.NumberOfSections   ;/得到节的个数;
CString   str;
str.Format   ( "%d ",numberofsections);
/就是以上这行测试numberofsections值为0。真怪了。PE文件至少有资源节等,怎么节的个数会是0?哪儿不对?
AfxMessageBox(str);
CloseHandle(hFile);/关闭文件


[解决办法]
你把dos_head.e_lfanew的含义理解错了,它表示IMAGE_NT_HEADERS32结构体的位置,因此应该是dos_head.e_lfanew+6才是NumberOfSections的地址

热点排行