目录
🧠 PE 导出表三表逻辑完全解析
📘 核心理解
🔍 逻辑拆解
① 函数地址表(EAT)
② 名称表(ENT)
③ 序号表(EIT)
④ 名字 → 序号 → 地址的完整路径
🎯 核心结论
🖇️ ASCII 流程图展示三表通讯逻辑
🧩 最终确认:三表关系完全清晰
✅ 修正关键点:
✅ 完整关系链:
✅ 判断逻辑 if (pEIT[index] == i) 的含义:
📊 可视化关系图(ASCII版)
🎯 完全吃透的总结
🧠 PE 导出表三表逻辑完全解析
📘 核心理解
序号(Ordinal)不是名称表的索引,而是连接名称表(ENT)和函数地址表(EAT)的桥梁。
三者关系可以总结为:
名称表 ENT[index] → 序号表 EIT[index] → 函数地址表 EAT[ordinal]序号就是媒介,让名字和地址正确对应。
🔍 逻辑拆解
① 函数地址表(EAT)
按序号排列
每个序号对应一个函数地址
表示:
EAT[i]= 第 i 个序号对应的函数地址
② 名称表(ENT)
按字母顺序排列函数名称
不存序号,只存名字
表示:
ENT[index]= "Add" / "Sub" / "Mul" / ...
③ 序号表(EIT)
连接名称表和地址表
保存 ENT[index] 对应的序号(ordinal)表示:
EIT[index]= 名称表对应的序号
④ 名字 → 序号 → 地址的完整路径
从名称表获取名字:
ENT[index]查序号表得到序号:
EIT[index] = ordinal用序号查地址表:
EAT[ordinal]= 函数地址
逻辑链条清晰:
ENT[index] → EIT[index] = i → EAT[i]也就是if (EIT[index] == i)判断的真正含义:
名称表的名字是否对应函数地址表第 i 项?如果是,找对了。
🎯 核心结论
EAT:序号 → 函数地址
ENT:字母序 → 函数名称
EIT:名字 → 序号
序号是桥梁,三者通过序号正确关联
这个机制就是 PE 导出表运作的核心。
🖇️ 流程图展示三表通讯逻辑
┌───────────────┐ │ 名称表 ENT │ │ index = 0..n │ │ "Add" "Div" ..│ └──────┬────────┘ │ 通过 EIT[index] ▼ ┌───────────────┐ │ 序号表 EIT │ │ index = 0..n │ │ 0, 1, 3, ... │ └──────┬────────┘ │ 序号 i 对应地址 ▼ ┌───────────────┐ │ 函数地址表 EAT │ │ i = 0..n │ │ addr(Add) ... │ └───────────────┘每个名称通过 EIT 得到序号
序号指向 EAT 中的实际函数地址
判断公式
if (EIT[index] == i)验证名称对应地址是否正确
三张表的关系直观化呈现:名称表 → 序号表 → 地址表
🧩 最终确认:三表关系完全清晰
✅ 修正关键点:
序号表(EIT)不是名称表的索引,而是名称表到序号的映射桥梁
✅ 完整关系链:
名称表 ENT[index] → 函数名称(如"Add") ↓ 通过 EIT[index] 获取序号 序号 i = EIT[index] ↓ 通过 EAT[i] 获取地址 函数地址 = EAT[i]✅ 判断逻辑if (pEIT[index] == i)的含义:
"名称表中第index个名称对应的序号,是否等于函数地址表中的第i个序号?"
如果是,说明找到了名称表ENT[index]对应的函数地址EAT[i]。
📊 可视化关系图(ASCII版)
id: export-table-relationship name: PE导出表三表关系图 type: markdown content: |- # PE导出表三表关系示意图 ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 名称表 (ENT) │ │ 序号表 (EIT) │ │ 函数地址表 (EAT) │ ├─────────────────┤ ├─────────────────┤ ├─────────────────┤ │ index=0: "Add" │───→│ index=0: 2 │───→│ 序号=2: 0x1000 │ │ index=1: "Div" │───→│ index=1: 1 │───→│ 序号=1: 0x2000 │ │ index=2: "Mul" │───→│ index=2: 3 │───→│ 序号=3: 0x3000 │ │ index=3: "Sub" │───→│ index=3: 0 │───→│ 序号=0: 0x4000 │ └─────────────────┘ └─────────────────┘ └─────────────────┘ ↑ ↓ ↓ │ 映射关系桥梁 地址按序号排列 │ (名称→序号) (序号→函数地址) │ 名称按字母序排列 ``` ## 🔄 查找流程示例:查找"Div"函数 1. 在ENT中找到"Div"位于index=1 2. 通过EIT[1]获取序号=1 3. 通过EAT[1]获取函数地址=0x2000 ## 🎯 核心机制 - **ENT**: 名称→索引(按字母序) - **EIT**: 索引→序号(映射桥梁) - **EAT**: 序号→地址(按序号排列)🎯 完全吃透的总结
PE导出表通过序号表(EIT)作为媒介,将按字母序排列的名称表(ENT)与按序号排列的函数地址表(EAT)正确关联,实现了"名称→序号→地址"的完整映射链条。
这个机制完美解决了:
名称查找效率(ENT按字母序)
地址存储效率(EAT按序号紧凑排列)
两者之间的正确映射(EIT作为桥梁)
最后这个点和免杀劫持hook以及shellcode 二进制漏洞 逆向相关看的明白就看看不明白就说明水平还不够哟