2025年pe文件是什么意思(电脑pe文件是什么)

pe文件是什么意思(电脑pe文件是什么)pe 首先分为三大块 dos 头 pe 头 区块 节点 分析工具 PETool 和 010Editor 一 dos 头 dos 头为一个 64 个字节的结构体 大小固定的 需要记住它的开头是 e magic 结尾是 e lfanew DOS Header MS DOS Header winHex 打开后前四行为 dos 头 一般开头是 e magic 为 4D5A 显示数据为 MZ 此处不能修改

大家好,我是讯享网,很高兴认识大家。



pe首先分为三大块:dos 头,pe头,区块/节点。

分析工具:PETool 和010Editor。

一、dos头

dos头为一个64个字节的结构体(大小固定的),需要记住它的开头是e_magic ,结尾是e_lfanew。

DOS Header (MS-DOS Header)

    winHex打开后前四行为dos头,一般开头是e_magic为4D5A,显示数据为“MZ”,此处不能修改,否则可能执行不成功,用od打开会失败。

    第四行的结尾假设是0000 00F8 代表的是偏移。就是pe头和dos头的距离,但是在内存中dos头不是从0000 0000开始的。 所以,用内存中的开始地址+结尾的e_lfanew得出pe头的位置。

    二、pe头

    NT头/pe头=dos头+偏移。那么对于不加壳的软件,在dos尾和pe头之间的部分为垃圾区,加壳软件则可能会在这个区域之间做一些文章。

    pe头分为pe文件标志(4个字节),文件头(大小固定,里面有存放可选PE头的大小),可选PE头(大小可变)。

        2. File Header (PE Header)

          3. Optional Header 可选pe头

            SizeOfHeaders怎么算的?

              计算公式:64+4 + 20+ SizeOfOptionalHeader (需知道是224还是240 )+

              NumberOfSections(区块或者节点数量)* 40 = SizeOfHeaders

                EntryPoint 偏移地址(OEP)+ImageBase = 程序的入口点。

                此时若od反编译后,程序入口点不是该地址。说明程序编译链接时,选择了随机基址。

                怎么改成固定地址,分为自己写的程序和修改他人程序2种情况:

                1.如果是自己vs写的程序,打开项目属性,链接器,高级,随机基址选否,固定基址选是,关闭运行后验证。

                2.如果是别人写的程序改成固定基址,注意可选pe头中的DllCharacteristics这个属性,用010Editor点进去后,进入这个结构体,找到DYNAMIC_BASE ,把值改成0,然后保存。

                只适用于exe文件,dll文件最好不要改成固定基址。因为一个exe可能加载多个dll,如果都放在固定位置可能会造成冲突。

                其他思路:EntryPoint 偏移地址(OEP)+getMoudleHandle 获取基址 = 程序入口

                代码示范:


                讯享网

                int main()

                {

                HANDLE hfile = CreateFileA("内联汇编.exe",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

                if (hfile == INVALID_HANDLE_VALUE) {

                GetLastError();

                }

                DWORD fileSize=GetFileSize(hfile,NULL);

                char* fileBuff = new char[fileSize]; // 基址

                DWORD reallyRead = 0;

                BOOL bsucess = FALSE;

                // pe头 

                PIMAGE_NT_HEADERS pNtHeaders = 0;

                // 文件头

                PIMAGE_FILE_HEADER pFileHeader = 0;

                // 可选pe头

                PIMAGE_OPTIONAL_HEADER pOptionHeaders = 0;

                bsucess=ReadFile(hfile, fileBuff,fileSize,&reallyRead,NULL);

                if (bsucess) {

                PIMAGE_DOS_HEADER pDosHeaders = (PIMAGE_DOS_HEADER)fileBuff;

                if (pDosHeaders->e_magic!=0x5A4D) {

                printf("该文件不是有效的pe文件 ");

                return 0;

                }

                cout << "pe头的偏移地址e_lfanew= " << pDosHeaders->e_lfanew << endl;

                pNtHeaders = (PIMAGE_NT_HEADERS)((DWORD) pDosHeaders->e_lfanew + (DWORD)fileBuff);

                DWORD pe=pNtHeaders->Signature;

                if (0x4550 != pe) {

                printf("该文件不是有效的pe文件 ");

                delete[] fileBuff;

                }

                pFileHeader = &(pNtHeaders->FileHeader);

                // cpu类型

                cout << "pFileHeader->Machine:"<<::hex << pFileHeader->Machine << endl;

                cout << "pFileHeader->Characteristics" << ::hex << pFileHeader->Characteristics << endl;

                cout << "pFileHeader->NumberOfSections"<< pFileHeader->NumberOfSections << endl;

                // 可选pe头的大小

                cout << "pFileHeader->SizeOfOptionalHeader" << pFileHeader->SizeOfOptionalHeader << endl;

                // 基于pe头得到可选pe头

                pOptionHeaders =&pNtHeaders->OptionalHeader;

                }

                delete[] fileBuff;

                CloseHandle(hfile);

                return 0;

                }

                作业: 自己写去定位可选pe头

                小讯
                上一篇 2025-04-27 08:46
                下一篇 2025-05-31 18:55

                相关推荐

                版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
                如需转载请保留出处:https://51itzy.com/kjqy/142146.html