-
-
[原创]手查PE导出表
-
2015-11-22 21:48
10465
-
晚上无事 闲着也闲着 发帖怡情
首先我们准备工具:010editor ,
把需要分析的PE文件拖入,打开-模板-在线模板-下载EXETEMPLATE2.BT/EXETEMPLATE2.BT
保存-模板-打开模板-F5运行,此时,左边会出来一个小窗口,点击变量依顺序选择
- struct IMAGE_NT_HEADERS nt_headers[NT头]
- struct IMAGE_OPTIONAL_HEADER32 OptionalHeader[可选头]
- struct IMAGE_DATA_DIRECTORIES DataDirectory[目录表]
- struct DATA_DIR Export[导出表]
点击
struct DATA_DIR Export 010会蓝色高亮导出表的地址和大小
好,我们再来看看导出表的数据结构
IMAGE_EXPORT_DIRECTORY STRUCT【导出表,共40字节】
{
00 DWORD Characteristics ; 没用 保留值 恒为0
04 DWORD TimeDateStamp ;
08 WORD MajorVersion ; 主版本号
0A WORD MinorVersion ; 次版本号
0C DWORD Name ; 本PE文件名字
10 DWORD Base ; 序号基数
14 DWORD NumberOfFunctions ; 函数数量
18 DWORD NumberOfNames ; 函数名称数量
1C DWORD AddressOfFunctions ; 函数地址表的相对虚拟地址
20 DWORD AddressOfNames ; 函数名称表的相对虚拟地址
24 DWORD AddressOfNameOrdinals ; 序号表的相对虚拟地址
};IMAGE_EXPORT_DIRECTORY ENDS
如上图 我们已知导出表的
地址 240d0 大小178
接下来找区段便可 我们要判断它落在哪个区段 怎么判断呢
公式:
找到的虚拟地址>该区段起始相对虚拟地址+该区段大小
再回到左边的小窗口,点击:
struct IMAGE_SECTION_HEADER sections_table[7] [区段头]
有七个分支:[不同PE文件数量不一样]
- struct IMAGE_SECTION_HEADER sections_table[0] [.textbss]
- struct IMAGE_SECTION_HEADER sections_table[1] [.text]
- struct IMAGE_SECTION_HEADER sections_table[2] [.rdata]
- struct IMAGE_SECTION_HEADER sections_table[3] [.data]
- struct IMAGE_SECTION_HEADER sections_table[4] [.idata]
- struct IMAGE_SECTION_HEADER sections_table[5] [.rsrc]
- struct IMAGE_SECTION_HEADER sections_table[6] [.reloc]
点击高亮显示:
区段前8个字节为名字 无需关注 再是大小、地址 现在知道这些就够了
9-12为大小 13-16为区段相对虚拟地址
10000 1000
E8CA 11000
4248 20000 落在这个区段 在这个区段找到偏移 EE00
再对照公式
我们再用一个公式:
文件偏移(磁盘文件的位置)=数据目录导出表地址(任意RVA)-该区段相对虚拟地址(RVA)+该区段的文件偏移(offset)
即:240d0-20000+EE00=12ED0
通俗点来讲:找到的虚拟地址(首先判断在哪个区段)-该区段起始相对虚拟地址+该区段的文件偏移
CTRL+G 粘贴12ED0 回车
找到最后12个字节 共40字节
依顺序(从左往右) 分别是
1.函数表的相对虚拟地址 2. 函数名称表的相对虚拟地址 3.序号表的相对虚拟地址
1. 0240F8 2. 024100 3. 024108
我们再对照公式计算
- 0240F8-20000+ee00=12EF8
- 024100-20000+EE00=12F00
- 024108-20000+EE00=12F08
CTRL+G 粘贴12EF8 回车找到011037
以下就不贴图了
CTRL+G 粘贴12F00 回车找到(函数名地址依顺序)02411F、02412c(因为只有俩个)
CTRL+G 粘贴12F08 回车找到(从左往右2个字节计算) 分别是0000和0001
我们再查函数名称:
02411F-20000+EE00=12F1F
CreateCframe遇到反斜杠0结束 0000+序号基数1
02412c-20000+EE00=12f2C
GetName遇到反斜杠0结束 0001+序号基数1
序号表和函数名称表是一一对应的
至此 我们手工查找结束了 是不是很简单呢 其它也是如此查找 或许有些许不同 随机应变就可。
我们再用lordepe的简化版【简易PE】(自己写的、有时间再发帖、依然开源) 验证一下是否正确
OK 如我所料。
好 不早了 走了 回宿舍 不然又得被阿姨关外面了
------------------------------------
样本:
MFCLibrary1Dll.rar
[培训]《安卓高级研修班(网课)》月薪三万计划