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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • resnet网络结构示意图_resnet50网络结构详解

    resnet网络结构示意图_resnet50网络结构详解代码importtorchfromtorchimportnnimporttorchvisiondevice=torch.device(“cuda”iftorch.cuda.is_available()else”cpu”)resnet=torchvision.models.resnet101(pretrained=True)#pretrainedImageNetResNet-101print(resnet)输出:ResNet((conv1):Con

    2022年10月7日
  • SDK封装_java封装类

    SDK封装_java封装类本文主要讲解java封装jar包的过程,一个简单的demo,方便大家入手学习打包jar包。转载地址:https://www.cnblogs.com/shirui/p/5270969.html准备材料: 1.java文件:      Helloworld.java packagecom.ray;publicclassHelloWorld{publicstaticvoidma…

    2022年10月21日
  • 几种常见的距离计算公式

    几种常见的距离计算公式在学习分类、聚类、预测、推荐算法的过程中常常会遇到比较两个或多个对象的相似性,而相似性的度量可以通过计算距离来实现。我们常用的距离计算公式是欧几里得距离公式,但是有时候这种计算方式会存在一些缺陷,那么就需要另外的计算方法去加以补充,本文将介绍几种在机器学习中常用的计算距离。在做很多研究问题时常常需要估算不同样本之间的相似性度量(SimilarityMeasurement),这时通常采用的方法就…

    2022年6月19日
  • html dl dt dd标签元素语法结构与使用

    html dl dt dd标签元素语法结构与使用

    2021年9月21日
  • java list转arraylist_进制数之间的转换方法

    java list转arraylist_进制数之间的转换方法一.Array转为List1.实现方法:java中数组转list使用Arrays.asList(T…a)方法。publicclassArray2List{publicstaticvoidmain(String[]args){List<String>listA=Arrays.asList(“dog”,”cat”,”cow”)…

    2022年8月23日
  • pytest的assert_java单元测试断言

    pytest的assert_java单元测试断言前言断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了。什么是断言呢?简单来讲就是实际结果和期望结果去对比,符合预期那就测试pass,不符合预期那就测试failed

    2022年7月30日

发表回复

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

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