吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 770|回复: 3
收起左侧

[求助] 滴水逆向第三期打印PE头RunTime Library报错

  [复制链接]
AllureLove15 发表于 2023-3-11 21:38
用的是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
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-6-17 07:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表