|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include<windows.h>
- #include<stdio.h>
- #define FILEPATH "C:\\Documents and Settings\\Administrator\\桌面\\123.exe"
-
- LPVOID ReadPEFile(LPSTR lpszFile)
- {
- FILE *pFile = NULL;
- DWORD fileSize = 0;
- LPVOID pFileBuffer = NULL;
-
- //打开文件
- pFile = fopen(lpszFile, "rb");
- if(!pFile)
- {
- printf(" 无法打开 EXE 文件! ");
- return NULL;
- }
-
- //从0开始读取文件大小,偏移量SEEK_END,就是到文件末尾
- fseek(pFile, 0, SEEK_END);
- fileSize = ftell(pFile);
-
- //重新设置到开头,后面还要用到读取
- fseek(pFile, 0, SEEK_SET);
-
- //分配缓冲区,malloc的返回值是一个缓冲区的指针
- pFileBuffer = malloc(fileSize);
-
- if(!pFileBuffer)
- {
- printf(" 分配缓冲区失败! ");
- fclose(pFile);
- return NULL;
- }
- //将文件数据读取到缓冲区
- size_t n = fread(pFileBuffer, fileSize, 1, pFile);
- if(!n)
- {
- printf(" 读取数据失败! ");
- free(pFileBuffer);
- fclose(pFile);
- return NULL;
- }
- //关闭文件
- fclose(pFile);
- return pFileBuffer;
- }
- VOID PrintNTHeaders()
- {
- LPVOID pFileBuffer = NULL;
- PIMAGE_DOS_HEADER pDosHeader = NULL;
- PIMAGE_NT_HEADERS pNTHeader = NULL;
- PIMAGE_FILE_HEADER pPEHeader = NULL;
- PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
- PIMAGE_SECTION_HEADER pSectionHeader = NULL;
-
- pFileBuffer = ReadPEFile(FILEPATH);
- if(!pFileBuffer)
- {
- printf("文件读取失败\n");
- return ;
- }
-
- //判断是否是有效的MZ标志,也就是0x5A4D,取前四个字节
- if(*((PWORD)pFileBuffer) != IMAGE_DOS_SIGNATURE)
- {
- printf("不是有效的MZ标志\n");
- free(pFileBuffer);
- return ;
- }
- pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
- //打印DOS头
- printf("********************DOS头********************\n");
- printf("MZ标志:%x\n",pDosHeader->e_magic);
- printf("PE偏移:%x\n",pDosHeader->e_lfanew);
-
- //判断是否是有效的PE标志
- if(*((PDWORD)((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);
- printf("********************PE?********************\n");
- printf("PE->Machine:%x\n",pPEHeader->Machine);
- printf("节的数量%x\n",pPEHeader->NumberOfSections);
- printf("可选头大小SizeOfOptionalHeader:%x\n",pPEHeader->SizeOfOptionalHeader);
-
- //可选PE头
- pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader+IMAGE_SIZEOF_FILE_HEADER);
- printf("********************OPTIOIN_PE?********************\n");
- printf("OPTION_PE:%x\n",pOptionHeader->Magic);
-
- }
-
- //释放内存
- free(pFileBuffer);
- }
复制代码
判断是否是有效PE标志中的
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer+pDosHeader->e_lfanew);
这个的DWORD可以直接将pFileBuffer强转成DWORD吗
为什么强转类型不能写成下面这样
pNTHeader = (PIMAGE_NT_HEADERS)(DWORD)(pFileBuffer+pDosHeader->e_lfanew);
|
|