如何得到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的地址