开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2664|回复: 150
收起左侧

[易语言纯源码] PE解析.精简清晰.详细备注+结构说明.

  [复制链接]

结帖率:100% (48/48)
发表于 2025-2-18 03:51:27 | 显示全部楼层 |阅读模式   广东省广州市
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
起因是想研究一下ASLR.找了一圈发现易并没有这相关的资料,就开始研究PE头.


论坛上的PE类源码并没有多少 很多还是调用各种模块或声明一堆自定义数据类型.不管用得着还是用不着的 都一起塞进去.


这样的方式太臃肿 扣源码太麻烦.感觉除了做PE分析器以外.其实很多东西都是用不着的 大多数情况下 只需要取出特定的值.


所以写了一个简单的例子并付上详细备注+结构说明.大家要使用的时候 调整一下直接取出所需的内容就行了.

  
子程序名返回值类型公开备 注
PE解析整数型 
参数名类 型参考可空数组备 注
BIN字节集
变量名类 型静态数组备 注
DOS字节集 
e_magic短整数型 
e_lfanew整数型 
Signature整数型 
FileHeader字节集 
OptionalHeader字节集 
NumberOfSections短整数型 
ImageBase整数型 
SectionTable字节集 
i整数型 
如果真 (取字节集长度 (BIN) < 1024) ' 完整PE头=DOS头(64)+NT头[PE魔数(4)+文件头(20)+可选头(224)]+节表(节头*40)
返回 (0) ' 错误文件
' //
' DOS头结构
' e_magic(2 字节):
' 固定为 "MZ",值为 0x5A4D,是 PE 文件的标识符,标记该文件为 DOS 可执行文件。
' e_cblp(2 字节):
' 表示文件的最后页面的字节数。对于大部分 PE 文件,通常设置为 512(0x200),这意味着文件的最后一页的大小为 512 字节。
' e_cp(2 字节):
' 页数。表示文件的页面总数,每页通常是 512 字节。
' e_crlc(2 字节):
' 重定位项的数量。用于 DOS 可执行文件的重定位,通常为 0。
' e_cparhdr(2 字节):
' 程序头的大小。在 DOS 可执行文件中,程序头通常占用 16 字节(0x10)。
' e_minalloc(2 字节):
' 程序运行时最小内存分配。表示 DOS 程序所需的最小内存。
' e_maxalloc(2 字节):
' 程序运行时最大内存分配。表示 DOS 程序所需的最大内存。
' e_ss(2 字节):
' 程序的堆栈段地址。
' e_sp(2 字节):
' 程序的堆栈指针地址。
' e_csum(2 字节):
' 程序的校验和。用于确保文件未损坏,通常为 0。
' e_ip(2 字节):
' 程序的初始指令指针。
' e_cs(2 字节):
' 程序的初始代码段。
' e_lfarlc(2 字节):
' 重定位表的偏移量。指示该表在文件中的位置。
' e_ovno(2 字节):
' 保留字段,通常为 0。
' e_res(8 字节):
' 保留字段,通常为 0。
' e_oemid(2 字节):
' OEM 标识符,通常为 0。
' e_oeminfo(2 字节):
' OEM 信息,通常为 0。
' e_res2(20 字节):
' 保留字段,通常为 0。
' e_lfanew(4 字节):
' 该字段存储 PE 头的偏移地址(即 PE 头的位置)。PE 头紧跟在 DOS 头之后。
DOS = 取字节集中间 (BIN, 1, 64)
e_magic = 取字节集数据 (DOS, #短整数型, 1)
e_lfanew = 取字节集数据 (DOS, #整数型, 61)
如果真 (e_magic ≠ 23117 e_lfanew ≤ 0) ' 非EXE文件
返回 (0)
' //
' NT头
Signature = 取字节集数据 (BIN, #整数型, e_lfanew + 1) ' PE魔数=4
FileHeader = 取字节集中间 (BIN, e_lfanew + 5, 20) ' 文件头=20
OptionalHeader = 取字节集中间 (BIN, e_lfanew + 25, 224) ' 可选头(32位)=224 可选头(64位)=240
如果真 (Signature ≠ 17744 取字节集长度 (FileHeader) ≠ 20 取字节集长度 (OptionalHeader) ≠ 224) ' 17744=PE头起始标识
返回 (0)
' //
' 文件头结构
' Machine:2 字节,指示目标机器架构。
' NumberOfSections:2 字节,节的数量。
' TimeDateStamp:4 字节,文件的时间戳。
' PointerToSymbolTable:4 字节,符号表的指针(通常为 0)。
' NumberOfSymbols:4 字节,符号的数量(通常为 0)。
' SizeOfOptionalHeader:2 字节,可选头的大小。
' Characteristics:2 字节,文件的特性。
NumberOfSections = 取字节集数据 (FileHeader, #短整数型, 3)
' //
' 可选头结构(32位)
' Magic 短整数型 2 字节 魔数,固定值为 0x10B(对于 32 位)或 0x20B(对于 64 位)。
' MajorLinkerVersion 字节型 1 字节 链接器主版本号。
' MinorLinkerVersion 字节型 1 字节 链接器次版本号。
' SizeOfCode 整数型 4 字节 代码段的大小(字节数)。
' SizeOfInitializedData 整数型 4 字节 初始化数据段的大小(字节数)。
' SizeOfUninitializedData 整数型 4 字节 未初始化数据段的大小(字节数)。
' AddressOfEntryPoint 整数型 4 字节 入口点地址,程序开始执行的地址。
' BaseOfCode 整数型 4 字节 代码段的基地址。
' BaseOfData 整数型 4 字节 数据段的基地址。
' ImageBase 整数型 4 字节 映像基地址,指定程序加载到内存的起始地址。
' SectionAlignment 整数型 4 字节 节对齐大小。
' FileAlignment 整数型 4 字节 文件对齐大小,文件的字节对齐要求。
' MajorOperatingSystemVersion 短整数型 2 字节 操作系统主版本号。
' MinorOperatingSystemVersion 短整数型 2 字节 操作系统次版本号。
' MajorImageVersion 短整数型 2 字节 映像的主版本号。
' MinorImageVersion 短整数型 2 字节 映像的次版本号。
' MajorSubsystemVersion 短整数型 2 字节 子系统主版本号。
' MinorSubsystemVersion 短整数型 2 字节 子系统次版本号。
' Win32VersionValue 整数型 4 字节 保留字段,通常为 0。
' SizeOfImage 整数型 4 字节 映像的大小,表示程序加载到内存后的总大小。
' SizeOfHeaders 整数型 4 字节 头部的总大小,通常是 DOS 头、PE 头和节表的总大小。
' CheckSum 整数型 4 字节 校验和,文件校验和,通常为 0。
' Subsystem 短整数型 2 字节 子系统类型(如控制台程序、图形界面程序等)。
' DllCharacteristics 短整数型 2 字节 动态链接库的特性,标识是否是 DLL 文件。
' SizeOfStackReserve 整数型 4 字节 堆栈的保留大小。
' SizeOfStackCommit 整数型 4 字节 堆栈的提交大小。
' SizeOfHeapReserve 整数型 4 字节 堆的保留大小。
' SizeOfHeapCommit 整数型 4 字节 堆的提交大小。
' LoaderFlags 整数型 4 字节 加载器标志,通常为 0。
' NumberOfRvaAndSizes 整数型 4 字节 数据目录的数量,表示 PE 文件中数据目录的数量。
' DataDirectory 数组 8 字节 * 16 数据目录,包含数据目录的地址和大小(16 个数据目录)。
ImageBase = 取字节集数据 (OptionalHeader, #整数型, 29)
' //
' 节表
SectionTable = 取字节集中间 (BIN, e_lfanew + 249, NumberOfSections × 40) ' 节头=40
变量循环首 (0, NumberOfSections - 1, 1, i)
' 节表结构
' 节名(8 字节):节的名称,通常是 ASCII 字符。
' 虚拟地址(4 字节):节在内存中的虚拟地址。
' 文件偏移(4 字节):节在文件中的偏移位置。
' 节大小(4 字节):节的大小。
' 特性(4 字节):描述节的属性,如是否可执行、是否可读、是否可写等。
到文本 (取字节集中间 (SectionTable, 1 + i × 40, 8)) ' 节名
变量循环尾 ()
返回 (ImageBase)


评分

参与人数 21精币 +21 收起 理由
z134 + 1 感谢分享,很给力!~
zjbin1989 + 1 感谢分享,很给力!~
liy456 + 1 感谢分享,很给力!~
文西哥 + 1 感谢分享,很给力!~
风雨3137 + 1 感谢分享,很给力!~
sundanming + 1 感谢分享,很给力!~
初阳123 + 1 感谢分享,很给力!~
hackjoe + 1 感谢分享,很给力!~
jc520hll + 1 感谢分享,很给力!~
ma4747 + 1 感谢分享,很给力!~
t176 + 1 感谢分享,很给力!~
无尘666 + 1 感谢分享,很给力!~
3266167 + 1 感谢分享,很给力!~
huangdi9569 + 1 感谢分享,很给力!~
pj小黑屋 + 1 感谢分享,很给力!~
望尘莫及 + 1 感谢分享,很给力!~
黯丄辶 + 1 感谢分享,很给力!~
暮光之城 + 1 感谢分享,很给力!~
huangdi956 + 1 感谢分享,很给力!~
Zźh926 + 1 感谢分享,很给力!~
多多帅吧 + 1 感谢你的支持,精易有你更精彩

查看全部评分


本帖被以下淘专辑推荐:

签到天数: 19 天

发表于 2025-3-22 08:30:25 | 显示全部楼层   浙江省台州市
111111111111111111111111111111111
回复 支持 反对

使用道具 举报

结帖率:55% (6/11)

签到天数: 7 天

发表于 2025-3-15 03:13:43 | 显示全部楼层   海南省澄迈县
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

签到天数: 26 天

发表于 2025-3-11 23:02:39 | 显示全部楼层   江苏省淮安市
清晰.详细备注+结构
回复 支持 反对

使用道具 举报

结帖率:25% (6/24)

签到天数: 11 天

发表于 2025-3-11 22:48:18 | 显示全部楼层   黑龙江省大庆市
跟你学到了
回复 支持 反对

使用道具 举报

结帖率:100% (5/5)

签到天数: 31 天

发表于 2025-3-7 13:18:54 | 显示全部楼层   山西省临汾市
        感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 3 天

发表于 2025-3-4 15:19:41 | 显示全部楼层   广东省广州市

6666666666666666666
回复 支持 反对

使用道具 举报

结帖率:69% (9/13)

签到天数: 12 天

发表于 2025-3-3 21:43:19 | 显示全部楼层   湖北省咸宁市
学习一下~!~
回复 支持 反对

使用道具 举报

结帖率:90% (81/90)

签到天数: 11 天

发表于 2025-3-3 15:23:42 | 显示全部楼层   广东省湛江市
#在这里快速回复#这个厉害了支持一下
回复 支持 反对

使用道具 举报

签到天数: 8 天

发表于 2025-3-3 00:20:19 | 显示全部楼层   巴基斯坦
这个厉害了支持一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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