飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5020|回复: 9

[x64] 抛砖引玉-PE64简单解析代码

[复制链接]
  • TA的每日心情
    难过
    昨天 14:49
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2015-1-9 11:00:06 | 显示全部楼层 |阅读模式
    周五了,O(∩_∩)O哈哈~很久没进Windows了,开虚拟机随手写一段烂代码玩玩,纯属支持小Q x64版块~~~{:soso_e113:}


    1. /*
    2. winnt.h 中VS做了平台宏判断,所以直接用即可,不用刻意区分32、64

    3. 详见:
    4. #ifdef _WIN64
    5. typedef IMAGE_NT_HEADERS64                  IMAGE_NT_HEADERS;
    6. typedef PIMAGE_NT_HEADERS64                 PIMAGE_NT_HEADERS;
    7. #else
    8. typedef IMAGE_NT_HEADERS32                  IMAGE_NT_HEADERS;
    9. typedef PIMAGE_NT_HEADERS32                 PIMAGE_NT_HEADERS;
    10. #endif
    11. */

    12. /*
    13. PE64 简单解析 By 飘云/P.Y.G
    14. 2015-01-09
    15. https://www.chinapyg.com
    16. */

    17. #include <stdio.h>
    18. #include <windows.h>

    19. int main()
    20. {
    21.         FILE *fp;
    22.         char szFileName[MAX_PATH];

    23.         IMAGE_DOS_HEADER DOS_Header;                        // DOS头结构
    24.         IMAGE_NT_HEADERS NT_Header;                                // PE头结构
    25.         IMAGE_SECTION_HEADER *lpSection_Header;        // 区段表结构指针

    26.         printf("请输入文件路径:");
    27.         gets(szFileName);

    28.         fp = fopen(szFileName, "rb");
    29.         if(!fp)
    30.         {
    31.                 printf("\n[PYG]--打开文件出错,请重试!\n");
    32.                 getchar();
    33.                 exit(0);
    34.         }

    35.         printf("\n--------------------PE基本信息-------------------\n");
    36.         // 读取Dos头
    37.         fread(&DOS_Header, sizeof(IMAGE_DOS_HEADER), 1, fp);

    38.         // 验证PE合法性
    39.         if (DOS_Header.e_magic != IMAGE_DOS_SIGNATURE)
    40.         {
    41.                 printf("[PYG]--非PE文件!\n");        
    42.                 fclose(fp);
    43.                 getchar();
    44.                 exit(0);
    45.         }

    46.         // PE头偏移
    47.         printf("PE头偏移:0x%.2X\n", DOS_Header.e_lfanew);

    48.         // 定位到PE头
    49.         fseek(fp, DOS_Header.e_lfanew, 0);
    50.         // 读取PE头数据
    51.         fread(&NT_Header, sizeof(IMAGE_NT_HEADERS), 1, fp);

    52.         // 继续验证PE合法性
    53.         if(NT_Header.Signature != IMAGE_NT_SIGNATURE)
    54.         {
    55.                 printf("[PYG]--非PE文件!\n");
    56.                 fclose(fp);
    57.                 getchar();
    58.                 exit(0);
    59.         }

    60.         printf("区段数量:0x%.2X\n", NT_Header.FileHeader.NumberOfSections);
    61.         printf("入 口 点:0x%.8X\n", NT_Header.OptionalHeader.AddressOfEntryPoint);
    62.         printf("镜像基址:0x%.16X\n", NT_Header.OptionalHeader.ImageBase);
    63.         printf("镜像大小:0x%.8X\n", NT_Header.OptionalHeader.SizeOfImage);
    64.         
    65.         printf("\n------------------各区段详细信息-----------------\n\n");

    66.         // 定位到区段首地址
    67.         fseek(fp, DOS_Header.e_lfanew + sizeof(IMAGE_NT_SIGNATURE) + NT_Header.FileHeader.SizeOfOptionalHeader + sizeof(IMAGE_FILE_HEADER), 0);
    68.         lpSection_Header = new IMAGE_SECTION_HEADER[NT_Header.FileHeader.NumberOfSections];
    69.         // 读取区段数据
    70.         fread(lpSection_Header, NT_Header.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER), 1, fp);

    71.         printf("Name        Offset         V.Addr          V.Size   R.Size   Flags\n");
    72.         printf("-------------------------------------------------\n");
    73.         for(int i = 0; i<NT_Header.FileHeader.NumberOfSections; i++)
    74.         {
    75.                 printf("%s        ", lpSection_Header[i].Name);
    76.                 printf("%.8X ", lpSection_Header[i].PointerToRawData);
    77.                 printf("%.8X ", lpSection_Header[i].VirtualAddress);
    78.                 printf("%.8X ", lpSection_Header[i].Misc.VirtualSize);
    79.                 printf("%.8X ", lpSection_Header[i].SizeOfRawData);
    80.                 printf("%.8X \n", lpSection_Header[i].Characteristics);
    81.         }
    82.         fclose(fp);
    83.         getchar();
    84.         return 0;
    85. }
    复制代码

    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2024-3-10 19:49
  • 签到天数: 473 天

    [LV.9]以坛为家II

    发表于 2015-1-9 12:34:59 | 显示全部楼层
    正在转向64位。谢谢飘哥 分享代码
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2015-1-9 13:50:50 | 显示全部楼层
    多谢坛主分享
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2016-10-10 10:27
  • 签到天数: 26 天

    [LV.4]偶尔看看III

    发表于 2015-1-9 14:55:12 | 显示全部楼层
    感谢飘哥分享
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    昨天 09:45
  • 签到天数: 957 天

    [LV.10]以坛为家III

    发表于 2015-1-9 15:25:56 | 显示全部楼层

    果断回帖,如果沉了就是我弄沉的很有成就感。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-9-27 19:17
  • 签到天数: 31 天

    [LV.5]常住居民I

    发表于 2015-1-9 19:23:20 | 显示全部楼层
    学习了{:soso_e179:}
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2016-1-13 12:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2015-1-11 08:17:31 | 显示全部楼层
    {:soso_e179:}嘿嘿,又多了一份精品
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2016-5-10 09:25
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2015-4-9 15:56:27 | 显示全部楼层
    马上学习飘大的作品
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-7-24 08:52
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    发表于 2017-6-1 11:39:13 | 显示全部楼层
    感谢飘哥,向飘哥学习
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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