pFileBuffer
=
ReadPEFile(VAR);
if
(!pFileBuffer)
{
printf(
"文件读取失败\n"
);
return
;
}
/
/
判断是否是有效的MZ标识
if
(
*
((PWORD)pFileBuffer) !
=
IMAGE_DOS_SIGNATURE)
/
/
判断pFileBuffer指针取值是不是MZ标识(
4D5A
)
{
printf(
"不是有效的MZ标识\n"
);
/
/
若不是有效的MZ标识,若不是则打印失败信息
free(pFileBuffer);
/
/
释放申请的文件映像内存空间
return
;
}
pDosHeader
=
(PIMAGE_DOS_HEADER)pFileBuffer;
/
/
将文件映像指针数据类型强制转换为PIMAGE_DOS_HEADER 既DOS头
/
/
打印DOS头相关信息
printf(
"******************************DOC头*******************************\n"
);
printf(
"MZ标志:%x\n"
, pDosHeader
-
>e_magic);
printf(
"PE偏移:%x\n"
, pDosHeader
-
>e_lfanew);
/
/
判断是否是有效的PE标志
if
(
*
((PWORD)((DWORD)pFileBuffer
+
pDosHeader
-
>e_lfanew)) !
=
IMAGE_NT_SIGNATURE)
{
printf(
"不是有效的PE标志\n"
);
free(pFileBuffer);
return
;
}
pNTHeader
=
(PIMAGE_NT_HEADERS)((DWORD)pFileBuffer
+
pDosHeader
-
>e_lfanew);
/
/
打印NT头相关信息
printf(
"******************************NT头*******************************\n"
);
printf(
"NT:%x\n"
, pNTHeader
-
>Signature);
pPEHeader
=
((PIMAGE_FILE_HEADER)((DWORD)pNTHeader)
+
4
);
/
/
打印PE头相关信息
printf(
"******************************PE头*******************************\n"
);
printf(
"PE:%x\n"
, pPEHeader
-
>Machine);
printf(
"节的数量:%x\n"
, pPEHeader
-
>NumberOfSections);
printf(
"可选PE头大小%x\n"
, pPEHeader
-
>SizeOfOptionalHeader);
/
/
打印可选PE头相关信息
pOPtionHeader
=
(PIMAGE_OPTIONAL_HEADER32((DWORD)pPEHeader
+
IMAGE_SIZEOF_FILE_HEADER));
printf(
"******************************OPTION PE头*******************************\n"
);
printf(
"OPTION_PE:%x\n"
, pOPtionHeader
-
>Magic);
/
/
释放内存
free(pFileBuffer);