首页
论坛
专栏
课程

[原创]手查PE导出表

2015-11-22 21:48 6672

[原创]手查PE导出表

2015-11-22 21:48
6672
晚上无事  闲着也闲着   发帖怡情

首先我们准备工具: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

[公告]LV6级以上的看雪会员可以免费获得《2019安全开发者峰会》门票一张!!

上传的附件:
最新回复 (9)
Tennn 5 2015-11-22 21:49
2
0
完了 排版真是醉了 明天再编辑吧。。。。
syser 2015-11-22 22:07
3
0
= =  不懂为什么要手查
Tennn 5 2015-11-23 08:23
4
0
其实我也不怎么喜欢 因为有现成的工具 但是我查了后 发现对PE文件结构有更深一步的理解
从“要这样”“要这样”到“为什么是这样”“为什么要这样”
---当然了 这是小菜的感受。。。。。。。
dalerkd 1 2015-11-23 08:52
5
0
少年有空讲讲重定位表吧
Tennn 5 2015-11-23 09:39
6
0
有空肯定 哈哈
Tennn 5 2015-11-26 10:32
7
0
AbandonQ 2015-12-13 03:00
8
0
不错 收藏了
shinfly 2016-1-4 11:20
9
0
支持,楼主最近精华帖很多么
若世浮屠 2018-6-12 22:15
10
0
好“古老”的帖子啊。。。。。
游客
登录 | 注册 方可回帖
返回