首页 > 其他分享 >PE文件结构

PE文件结构

时间:2023-11-08 12:12:26浏览次数:27  
标签:文件 NAME INT IMAGE DESCRIPTOR IAT PE IMPORT 结构

导入表

image

typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    union {
        DWORD   Characteristics;            // 0 for terminating null import descriptor
        DWORD   OriginalFirstThunk;         // RVA 指向 INT (PIMAGE_THUNK_DATA结构数组)
    } DUMMYUNIONNAME;
    DWORD   TimeDateStamp;                  // 0 if not bound,
                                            // -1 if bound, and real date\time stamp
                                            //     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
                                            // O.W. date/time stamp of DLL bound to (Old BIND)

    DWORD   ForwarderChain;                 // -1 if no forwarders
    DWORD   Name;							//RVA指向dll名字,以0结尾
    DWORD   FirstThunk;                     // RVA 指向 IAT (PIMAGE_THUNK_DATA结构数组)
} IMAGE_IMPORT_DESCRIPTOR;
typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;
typedef struct _IMAGE_IMPORT_BY_NAME {
    WORD    Hint; //可能为空,编译器决定,如果不为空,是函数在导出表的索引
    BYTE    Name[1]; //函数名称,以0结尾
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

导入表是一个数组,每一个元素都是一个IMAGE_IMPORT_DESCRIPTOR(最后一个元素为空来表示数组的结束,后面的数组都是这样的),每一个IMAGE_IMPORT_DESCRIPTOR都代表了一个dll,Name存放着dll名称的地址,OriginalFirstThunk存放着INT的地址,FirstThunk存放着IAT的地址。

INT也是一个数组,每一个元素都是一个ULONGLONG AddressOfData;,AddressOfData存放着IMAGE_IMPORT_BY_NAME的地址。

IAT也是一个数组,每一个元素都是一个ULONGLONG Function;,Function存放着导入函数的地址。

INTIAT的元素是根据索引一一对应的

IAT填充

下面介绍在PE加载过程中操作系统如何对IAT进行填充

  • 获取模块句柄

通过IMAGE_IMPORT_DESCRIPTOR的成员Name获取dll名称地址调用GetModuleHandle(dll函数名称),获取该dll模块句柄

  • 获取函数地址

首先通过OriginalFirstThunk,找到INT,通过INT的元素AddressOfData找到IMAGE_IMPORT_BY_NAME,若IMAGE_IMPORT_BY_NAME.Name不为空,则通过调用GetProcAddress(IMAGE_IMPORT_BY_NAME.Name)获取该函数地址,若IMAGE_IMPORT_BY_NAME.Name为空,则通过调用GetProcAddress(IMAGE_IMPORT_BY_NAME.Hint)获取该函数地址

  • 填充IAT

通过INT的元素AddressOfData的索引,找到IAT中对应的元素Function,将获取到的函数地址填充到Function

标签:文件,NAME,INT,IMAGE,DESCRIPTOR,IAT,PE,IMPORT,结构
From: https://www.cnblogs.com/czlnb/p/17817092.html

相关文章

  • PMP-5.3.1 管理质量文件--质量报告、测试与评估文件、变更
    一、质量报告1.定义​质量报告可能是图形、数据或定性文件。2.作用(1)​其中包含的信息可帮助其他过程和部门采取纠正措施,以实现项目质量期望。(2)质量报告用于识别不合规的卖方过程、程序或产品。(控制采购过程)3.​质量报告的信息可以包含:(1)团队上报的质量管理问题由团队管......
  • How to grant permissions to a custom assembly that is referenced in a report in
    Ref:http://support.microsoft.com/kb/842419/en-us HowtograntpermissionstoacustomassemblythatisreferencedinareportinReportingServicesViewproductsthatthisarticleappliesto.ArticleID:842419LastReview:April3,2007Revision:2.1OnThisPa......
  • C#C++,opencv的dll中detach相关:关于调用dll后程序退出后进程仍然驻留系统列表的问题
    我在c#中调用C++的dll,内部使用了线程并detach使其独立于主线程UI运行。但后来发现程序关闭后,任务列表中的进场依然存在,即app并未实际正常退出。这个问题有很多人碰到和争论,但都没有给出明确的答案。这里提供一个理论解释和绝佳的调试排除方法:根本原因:程序退出之前,系统(或程序员......
  • Linux(指令篇)-文件管理(常用)
    一、文件路径1、绝对路径cd/usr/share/doc/2、相对路径cd../man“..”:表示当前目录的上层目录“.”:表示当前目录 二、目录操作1、创建目录用户可以通过mkdir命令创建一个空白目录mkdirabc此外,mkdir命令还可以通过添加“-p”参数来创建一个多层目录2、查看目录......
  • C语言程序设计 练习题参考答案 第三章 (3) 循环结构
    /*3.9求派的值*/#include"stdio.h"voidmain(){intn;doublesum=0;for(n=1;n<=10000;n++){sum=sum+1.0/(4*n-3)-1.0/(4*n-1);}printf("pi的值为%lf\n",4*sum);}/*3.9求派的值*/#include<stdio.......
  • C语言程序设计 练习题参考答案 第六章 (1) 结构体 综合练习
    /*6.910个学生,每个学生3门课程成绩,求平均分及前五名*/#include"stdio.h"#include"conio.h"#defineN6structstudent/*定义结构体数据类型*/{intnum;charname[10];intscore[3];/*不能使用float*/floataverage;};voidsort(structstudentstu......
  • C语言程序设计 练习题参考答案 第三章 (2) 选择结构
    /*3.6求3个数中最大值。类似于例1.2*/#include<stdio.h>voidmain(){inta,b,c,max;printf("\n请输入3个整数,整数以空格分隔:\n");scanf("%d%d%d",&a,&b,&c);if(a>b)max=a;elsemax=b;if(max......
  • C语言程序设计 试卷试题结构
    每套试卷结构如下:、填空(10题,2分/题)20分、阅读程序写运行结果(7小题,5分/题)35分、补充程序题(8空,2分/空,补充函数或主程序1题,4分)20分、程序改错题(错误点5个)10分、编程题(2小题)15分(5+10)每套试卷要求覆盖的知识点(三大基本程序结构、函数、数组、指针、文件、结构体)......
  • C语言程序设计 第七章 指针与结构体 指针数组 例题
    /*---------------------------------------例7.19输入N个学生学号,姓名,成绩,并按成绩降序排列,并输出p指向结构体变量s1,则s1.成员名,(*p).成员名,p->成员名等价。本题采用自定义函数较为合适Author:emanleeDate:2008-05-12----------------......
  • C语言程序设计 文件操作函数
    文件操作函数C语言(FILEfputcfgetcfputsfgetsfscanffprintf)在ANSIC中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。一、流式文件操作这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:typedefstruct{intlevel;/*fill/empt......