AllureLove15 发表于 2023-3-11 21:38

滴水逆向第三期打印PE头RunTime Library报错

用的是VS2019,打印PE头的内容,参照的滴水逆向海哥视频里面的文件操作代码,想问问这个是运行库报错吗?有什么解决方法没?求求大佬们帮帮忙,谢谢
```
//#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Windows.h>

#define FILE_PATH "C:\\Users\\Allure_Love\\Desktop\\notpad.exe"

LPVOID ReadPEFile(LPCSTR lpszFile)        //const char[]相当于const char*,LPSTR相当于char*,两者不兼容,所以可以把LPSTR改成LPCSTR
{
        FILE *pFile;
        DWORD fileSize = 0;
        LPVOID pFileBuffer = NULL;

        //打开文件
        errno_t err;
        err = fopen_s(&pFile,lpszFile,"rb");        //"rb"只读
        if (!pFile)
        {
                printf("无法打开.exe文件!");
        }

        //读取文件大小
        fseek(pFile,0,SEEK_END);
        //fseek(FILE * stream, long offset, int fromwhere);        //函数设置文件指针stream的位置,以fromwhere为基址,偏移offset个字节的位置
        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);        //size_t无符号整数,sieof()返回的结果类型
        //size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流stream读取nmemb个size大小的数据到ptr所指向的数组中
       
        if (!n)
        {
                printf("读取数据失败!");
                free(pFileBuffer);
                fclose(pFile);
                return NULL;
        }

        //关闭文件
        fclose(pFile);
        return pFileBuffer;
}

void PrintNTHeaders()
{
        //初始化
        LPVOID pFileBuffer = NULL;
        PIMAGE_DOS_HEADER pDosHeader = NULL;        //DOS头指针
        PIMAGE_NT_HEADERS pNTHeader = NULL;                //NT头指针
        PIMAGE_FILE_HEADER pPEHeader = NULL;        //标准PE头指针
        PIMAGE_OPTIONAL_HEADER32 pOptionalHeader = NULL;        //可选PE头指针ReadPEFile(FILE_PATH)

        pFileBuffer = ReadPEFile(FILE_PATH);
        if (!pFileBuffer)
        {
                printf("文件读取失败!");
                return;
        }

        if (*((PWORD)pFileBuffer) != IMAGE_DOS_SIGNATURE)
        {
                printf("不是有效的MZ标志!");
                free(pFileBuffer);        //释放指针内存
                return;
        }

        //打印DOS头
        pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
        printf("***************DOS头****************");
        printf("MZ标志:%x\n",pDosHeader->e_magic);
        printf("PE偏移:%x\n", pDosHeader->e_lfanew);

        //判断是否是有效的PE标志
        if (*((PDWORD)((PWORD)pFileBuffer + pDosHeader->e_lfanew)) != IMAGE_DOS_SIGNATURE)
        {
                printf("不是有效的PE标志!");
                free(pFileBuffer);
                return;
        }

        //打印NT头
        pNTHeader = (PIMAGE_NT_HEADERS)((PWORD)pFileBuffer + pDosHeader->e_lfanew);
        printf("***************NT头****************");
        printf("NT:%x\n", pNTHeader->Signature);

        //打印标准PE头
        pPEHeader = (PIMAGE_FILE_HEADER)(((PWORD)pNTHeader) + 4);
        printf("*************标准PE头****************");
        printf("PE:%x\n", pPEHeader->Machine);
        printf("节的数量:%x\n", pPEHeader->NumberOfSections);
        printf("可选PE头的大小:%x\n", pPEHeader->SizeOfOptionalHeader);

        //打印可选PE头
        pOptionalHeader = (PIMAGE_OPTIONAL_HEADER32)(((PWORD)pPEHeader)+ IMAGE_SIZEOF_FILE_HEADER);        //const IMAGE_SIZEOF_FILE_HEADER = 20        标准PE头大小
        printf("*************可选PE头****************");
        printf("Optional_PE:%x\n", pOptionalHeader->Magic);

        //释放内存
        free(pFileBuffer);
}

int main()
{
        PrintNTHeaders();
        return 0;
}
```

htpidk 发表于 2023-3-11 23:20

if (*((PDWORD)((PWORD)pFileBuffer + pDosHeader->e_lfanew)) != IMAGE_DOS_SIGNATURE)前面的(PWORD)pFileBuffer改成(DWORD)pFileBuffer,下面的都要这样改,你要搞清楚指针移动部长是多少,还有这句后面的 IMAGE_DOS_SIGNATURE改成 IMAGE_NT_SIGNATURE,其他没仔细看是否还有错误

AllureLove15 发表于 2023-3-12 14:55

找到错误原因了,是路径写错了(/(ㄒoㄒ)/~~)
notepad.exe写成了notpad.exe
不过IMAGE_DOS_SIGNATURE也确实写错了,谢谢

AllureLove15 发表于 2023-3-12 15:20

谢谢,我把PWORD改成DWORD后就跑通了
页: [1]
查看完整版本: 滴水逆向第三期打印PE头RunTime Library报错