gwgirl 发表于 2021-12-20 19:00

用C写的打开一个文件查看这个文件的头文件信息

#include        <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h>

LPVOID ReadPEFile(LPSTR lpszFile)
{
        FILE* pFile = NULL;
        DWORD filesize = 0;
        LPVOID pFileBuffer = NULL;

        //打开文件
        fopen_s(&pFile,lpszFile, "r+b");
        if (!pFile)
        {
                printf("无法打开EXE文件!");
                return NULL;
        }

        //读取文件大小
        fseek(pFile, 0, SEEK_END);
        int fileSize = ftell(pFile);
        fseek(pFile, 0, SEEK_SET);

        //分配缓冲区
        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;
}

VOIDPrintNTHeaders(char* FILEPATH)
{
        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标志
        if (*((PWORD)pFileBuffer) != IMAGE_DOS_SIGNATURE)
        {
                printf("不是有效的MZ标志\n");
                free(pFileBuffer);
                return;
        }
        pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;

        //打印DOC头
        printf("******************DOC头********************\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: %x\n", pPEHeader->Machine);
        printf("节的数量:%x\n", pPEHeader->NumberOfSections);
        printf("PE: %x\n", pPEHeader->Machine);
        printf("节的数量:%x\n", pPEHeader->NumberOfSections);
        printf("Size0f0ptionalHeader: %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);       
}

int main()
{
        char* FILEPATH = (char*)"E:/file/IPMSG2007.exe";
        PrintNTHeaders(FILEPATH);       
        return 0;
}

taiyuanzhou 发表于 2021-12-21 12:19

牛人,学习学习

1666909156 发表于 2021-12-22 23:27

没有可视化,不是傻瓜操作,一般没几个人用的!!!!!!!!!!!!!!

gwgirl 发表于 2021-12-23 09:04

1666909156 发表于 2021-12-22 23:27
没有可视化,不是傻瓜操作,一般没几个人用的!!!!!!!!!!!!!!

这些事给刚刚学C的看到,其实就是看看怎么写语法{:7_246:}

雷lilei 发表于 2021-12-25 02:26

备注太少了啊,,

gwgirl 发表于 2021-12-26 10:03

雷lilei 发表于 2021-12-25 02:26
备注太少了啊,,

#include<Windows.h>
第二个函数都是用的这个头文件!

sunsky517 发表于 2021-12-27 11:49

纯支持,谢谢分享

6378895 发表于 2022-1-2 12:50

正在学习C中

无限和小白菜 发表于 2022-1-22 18:58

来向大佬学习

清爽打煎蛋 发表于 2022-1-22 19:26

感谢楼主
页: [1] 2 3 4 5 6 7 8
查看完整版本: 用C写的打开一个文件查看这个文件的头文件信息