欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]手查PE导出表

[原创]手查PE导出表

晚上无事  闲着也闲着   发帖怡情
首先我们准备工具: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

上传的附件 1.png
2.png
3.png
4.png
5.png
6.png
7.png
8.png
MFCLibrary1Dll.rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功