PE文件结构(四) 输出表

PE文件结构(四) 输出表

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

PE文件结构(四)

參考

书:《加密与解密》

视频:小甲鱼 解密系列 视频

输出表

一般来说输出表存在于dll中。输出表提供了 文件里函数的名字跟这些函数的地址, PE装载器通过输出表来改动IAT。

IMAGE_OPTIONAL_HEADER中的 DataDirectory[0] 提供了输出表的RVA。输出表是以一个IMAGE_EXPORT_DIRECTORY结构 開始的。

IMAGE_EXPORT_DIRECTORY结构:

typedef struct _IMAGE_EXPORT_DIRECTORY {    DWORD   Characteristics;         //未使用    DWORD   TimeDateStamp;           //文件生成的时间    WORD    MajorVersion;            //主版本。一般为0    WORD    MinorVersion;            //次版本,一般为0    DWORD   Name;                    //指向dll名的RVA    DWORD   Base;                    // 基数,一般为 1 (就是从1数起)    DWORD   NumberOfFunctions;       // AddressOfFunctions指向的数组的元素的个数    DWORD   NumberOfNames;           // AddressOfNames 指向的数组的元素的个数    DWORD   AddressOfFunctions;     // 函数地址数组ENT的RVA    DWORD   AddressOfNames;         // 函数名字数组EAT的RVA     DWORD   AddressOfNameOrdinals;  // 输出序列号数组的RVA,这个数组是以WORD为单位的,用来函数名字数组连接函数地址数组的} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

输出表主要就是来给PE载入器改动IAT的,即查找函数的入口地址。PE载入器查找函数的地址有两种方法,从序号查找,从函数名查找。

1. 从序号查找函数入口地址

    PE载入器通过INT知道了序号。直接用这个序号 去找 函数地址数组EAT就能够了。

2. 从函数名查找函数入口地址

    通过函数名,查找函数名数组ENT,找到这个函数名在数组中的序号 n(从0数起),然后取输出序列号数组的第n个值(从0数起)。

然后 以这个值为序号的的函数地址数组EAT的值就是这个函数的入口地址。

即 ENT[  输出序列号数组[n]  ] 

实例分析:

比如找user32.dll 中AdjustWindowRect 这个函数。

先查看user32.dll的二进制文件。它的IMAGE_OPTIONAL_HEADER结构为:

图片1

PE文件结构(四) 输出表

从中能够知道:

Name: RVA 55C0h          文件偏移值:49C0h  
Base: 1
NumberOfFunctions: 02DCh  
NumberOfNmae:02DCh
AddressOfFunctions:  RVA 3928h         文件偏移值:2D28h
AddressOfNames:  RVA 4498h             文件偏移值:3898h
AddressOfNameOrdinals: RVA 5008h        文件偏移值:4408h

查看ENT数组所指向的字符串。能够知道AdjustWindowRect是第2个元素。

所以。查看AddressOfNameOrdinals所指向的输出序列号数组的第2个元素,能够发现值为 1。

图片2

PE文件结构(四) 输出表

再查看EAT中序号为1的元素(即第2个元素)值为021140h,这个就是AdjustWindowRect函数的RVA。

图片3

PE文件结构(四) 输出表

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117367.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ue4 项目模板_卡牌游戏项目模板

    ue4 项目模板_卡牌游戏项目模板del.jpg(596.79KB,下载次数:1)2019-4-2116:34上传—————————-1.02更新日志前言:hello,这里是由RC为您带来的卡牌游戏demo1.02更新,在本次更新中,对游戏性进行了大量的调整,并修复了众多的BUG,同时更新了2张新的卡牌。并特别感谢辉仔与糯米大瓜同学为卡牌设计提供了美术支持!非常感谢!OK,下面是更新…

    2022年7月24日
    8
  • navicat15手动激活码【2021.7最新】

    (navicat15手动激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSWQi…

    2022年3月21日
    532
  • jenkinsfile docker_docker构建自己的镜像

    jenkinsfile docker_docker构建自己的镜像前言之前我们用docker手动安装了jenkins环境,在jenkins中又安装了python3环境和各种安装包,如果我们想要在其他3台机器上安装,又是重复操作,重复劳动,那会显得很low,这里可以

    2022年7月29日
    3
  • ov7725摄像头人脸识别_ov7725摄像头

    ov7725摄像头人脸识别_ov7725摄像头OV7725摄像头软件实现简单的二值化处理项目使用的摄像头型号:​ 正点原子OV7725摄像头模块,带FIFO的摄像头模块。图像二值化化的个人见解:​ 常见的图片格式:​ 黑白图片、灰度图片、彩色图片。不同的图片的格式类型主要的不同点在每个像素点需要几位的二位数来表示。黑白图片每个像素不是0就是1,0代表黑颜色,1代表白颜色。灰度图像每个像素需要一个字节表示(8位二进制)每个像素可以量化…

    2022年9月2日
    3
  • DELPhI XE5 控件

    DELPhI XE5 控件Raize Components v6.1.5 + serial〖支持D7~XE5〗含序列号:EXE安装程序傻瓜安装即可http://download.csdn.net/detail/wozengcong/6356865EhLib v6.2.149 for D7-XE5〖最新版本 含源码和DEMO〗:EXE安装程序傻瓜安装即可http://download.csdn.net/det

    2022年7月18日
    14
  • ExecuteScalar方法

    ExecuteScalar方法oRs.Open”SELECTCOUNT(*)AsiRowCountFROMOrders”iCount=oRs.Fields(“iRowCount”).ValueADO.NET引入了一种从查询的结果中获取单值的新方式,可以用于预计只返回一行和一列的场合。ADO.NETCommand对象有一个ExecuteScalar方法,它从相关的查询中返回第一行和第一列的值。因为不用创建行集、查

    2022年6月24日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号