PE文件结构(三) 输入表
PE文件结构(三)
參考
书:《加密与解密》
视频:小甲鱼 解密系列 视频
输入表
输入函数,表示被程序调用可是它的代码不在程序代码中的,而在dll中的函数。对于这些函数。磁盘上的可执行文件仅仅是保留相关的函数信息,如函数名,dll文件名称等。
在程序执行前。程序是没有保存这些函数在内存中的地址。当程序执行起来时。windows载入器会把相关的dll装入内存。而且将输入函数的指令与函数真在内存中正的地址联系起来。输入表(导入表)就是用来保存这些函数的信息的。
在 IMAGE_OPTIONAL_HEADER 中的 DataDirectory[16] 数组保存了 输入表的RVA跟大小。
通过RVA能够在OD中载入程序通过 ImageBase+RVA 找到 输入表,或者通过RVA计算出文件偏移地址,查看磁盘中的可运行文件,通过文件偏移地址找到输入表。
输入表是以一个IMAGE_IMPORT_DESCRIPTOR(IID)数组 開始的。每个被PE文件隐式的链接进来的dll都有一个IID。IID数组的最后一个单元用NULL表示。
IMAGE_IMPORT_DESCRIPTOR 结构:
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
_ANONYMOUS_UNION union { //00h
DWORD Characteristics;
DWORD OriginalFirstThunk;
} DUMMYUNIONNAME;
DWORD TimeDateStamp; //04h
DWORD ForwarderChain; //08h
DWORD Name; //0Ch
DWORD FirstThunk; //10h
} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
当中Name是dll名字的指针。OriginalFirstThunk指向一个IMAGE_THUNK_DATA数组叫做输入名称表Import Name Table(INT),用来保存函数,FirstThunk也指向IMAGE_THUNK_DATA数组叫做输入地址表Import Address Table(IAT)。
IMAGE_THUNK_DATA 结构:
typedef struct _IMAGE_THUNK_DATA32 {
union {
DWORD ForwarderString;
DWORD Function;
DWORD Ordinal;
DWORD AddressOfData;
} u1;
} IMAGE_THUNK_DATA32,*PIMAGE_THUNK_DATA32;
当IMAGE_THUNK_DATA 的值最高位为1时,表示函数是以序号方式输入。这时低31为被当作函数序号。当最高位是0时,表示函数是以字符串类型的函数名方式输入的,这时。IMAGE_THUNK_DATA 的值为指向 IMAGE_IMPORT_BY_NAME 的结构的RVA。
typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint;
BYTE Name[1];
} IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;
Hint 表示这个函数在其所驻留dll的输出表的序号。不是必须的。
Name 表示 函数名,是一个ASCII字符串以0结尾,大小不固定。
INT保存的是这个程序导入这个dll中函数信息,它是固定的不会被改动。可是IAT会在程序载入时被重写,当程序载入时,它会被PE载入器重写成 这些函数的在内存中的真正地址。
即把它原来指向的IMAGE_IMPORT_BY_NAME 改成 函数真正的地址。
那为什么要两个 IMAGE_THUNK_DATA 数组?
当程序载入时,IAT 会被PE载入器重写。PE载入器先搜索INT,PE载入器迭代搜索INT数组中的每一个指针。找出 INT所指向的IMAGE_IMPORT_BY_NAME结构中的函数在内存中的真正的地址。并把它替代原来IAT中的值。
当完毕后,INT就没实用了,程序仅仅须要IAT就能够正常执行了。
看以下图,这个是可运行程序在磁盘中的时候:
这个是当程序被载入的是后:
实例分析:
先找到输入表RVA,通过IMAGE_OPTIONAL_HEADER 中的最后一个项 IMAGE_DATA_DIRECTORY 能够知道 输入表相对与PE文件头的偏移量为80h能够找到输入表达RVA。
图片1
但这个是RVA不是文件偏移地址。
通过转换能够知道。输入表的文件偏移地址为850h。
查看850h。即IID,能够看到这个程序有两个IID。即链接了 两个dll,看到一个IID,能够知道它的OriginalFirstThunk 是 2098h FirstThunk 为200Ch,它们转换后的文件偏移地址分别为898h 和 80Ch
图片2 IID数组
查看OriginalFirstThunk跟FirstThunk 。能够发现这里INT跟IAT的内容是一样的。先看看第一个函数的信息,由于第一位为1,所以这里00002122h 表示 IMAGE_IMPORT_BY_NAME 的RVA,转化为文件偏移值为922h
图片3 INT跟IAT
查看922h 能够看函数名。
图片4:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmlsbHZzbWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
我们能够从上面看到程序在磁盘中时 INT 与IAT内容一样,都是指向 IMAGE_IMPORT_BY_NAME 。
用OD载入程序,查看INT与IAT的内容
图片5 INT
图片6 IAT
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmlsbHZzbWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
能够发现INT没有发生变化。IAT变成了比如77D3C702h,IAT中的RVA被改成了函数的真正的地址。
查看77D3C702h,就能够看到这个函数
图片7
PE文件结构(三) 输入表的更多相关文章
- [PE结构分析] 8.输入表结构和输入地址表(IAT)
在 PE文件头的 IMAGE_OPTIONAL_HEADER 结构中的 DataDirectory(数据目录表) 的第二个成员就是指向输入表的.每个被链接进来的 DLL文件都分别对应一个 IMAGE_ ...
- PE文件结构学习
PE:Portable Executable File Format(可移植的执行体).Windows平台主流可执行文件格式..exe与.dll文件都是PE格式.32位的叫做PE32,64位的叫做PE ...
- vc++中输入表的免杀
国外的杀毒软件一般会把特征码定位在PE文件的输入表函数(也就是源码里我们调用了的API函数)上, 我们对付这种查杀的方法就是在源码里对API函数进行动态调用,对一个函数动态调用之后,本来以输入 表函数 ...
- PE文件结构详解(四)PE导入表
PE文件结构详解(二)可执行文件头的最后展示了一个数组,PE文件结构详解(三)PE导出表中解释了其中第一项的格式,本篇文章来揭示这个数组中的第二项:IMAGE_DIRECTORY_ENTRY_IMPO ...
- PE文件中的输入表
前言 PE文件中的输入表含有三个重要结构IID,IDT,IAT.PE文件为需要加载的DLL文件创建一个IID结构,一个DLL与一个IID对应.IDT是输入名称表,IAT输入地址表,在没有绑定输入的情况 ...
- 小甲鱼PE详解之输入表(导入表)详解2(PE详解08)
在此之前,我们已经对这个输入表进行了一些实践和理解,这有助于大家对这个概念更进一步的加深认识.小甲鱼觉得,越是复杂的问题我们应该越是去动手操作它,认识它,这样才容易熟悉它! 在上一节课我们像小鹿一样的 ...
- 小甲鱼PE详解之输入表(导入表)详解(PE详解07)
捷径并不是把弯路改直了,而是帮你把岔道堵上! 走得弯路跟成长的速度是成正比的!不要害怕走上弯路,弯路会让你懂得更多,最终还是会在终点交汇! 岔路会将你引入万劫不复的深渊,并越走越深…… 在开始讲解输入 ...
- PE文件结构详解(五)延迟导入表
PE文件结构详解(四)PE导入表讲 了一般的PE导入表,这次我们来看一下另外一种导入表:延迟导入(Delay Import).看名字就知道,这种导入机制导入其他DLL的时机比较“迟”,为什么要迟呢?因 ...
- PE文件结构详解(三)PE导出表
上篇文章 PE文件结构详解(二)可执行文件头 的结尾出现了一个大数组,这个数组中的每一项都是一个特定的结构,通过函数获取数组中的项可以用RtlImageDirectoryEntryToData函数,D ...
随机推荐
- android帧动画,移动位置,缩放,改变透明度等动画解说
1.苦逼的需求又来了,须要实现一些动画效果,第一个想到的是播放gif图片,可是这样会占包的资源,而且清晰度不高,于是想着程序实现,自己用帧动画+缩放+移动+透明度 实现了一些想要的效果,这里跟大家分享 ...
- 2015.05.05,外语,读书笔记-《Word Power Made Easy》 15 “如何谈论事情进展” SESSION 42
HOW TO TALK ABOUT WHAT GOES ON TEASER PREVIEW 一些以-ate结束的动词,通常表示: to exhaust([ig'zɔ:st] n. 排气,排气装置 v. ...
- Word技巧杂记(一)——去掉页眉上方的黑线
今天在调整文章的格式时,突然发现在页眉的上方有一条巨粗无比的黑线,不知从何处冒出来的(如下图) 经过长时间的研究,终于发现原来这是页面的边框.解决办法也很简单: 格式->边框与底纹->页面 ...
- bzoj4032: [HEOI2015]最短不公共子串(SAM+DP)
4032: [HEOI2015]最短不公共子串 题目:传送门 题解: 陈年老题良心%你赛膜爆嘎爷 当初做题...一眼SAM...结果只会两种直接DP的情况... 情况1: 直接设f[i][j] 表示的 ...
- 杂项-快捷键:Google浏览器常用快捷键
ylbtech-杂项-快捷键:Google浏览器常用快捷键 1.返回顶部 1. Google浏览器,是一个由Google(谷歌)公司开发的开放原始码网页浏览器.该浏览器是基于其他开放原始码软件所撰写, ...
- Hessian Servlet实例
Servlet实例 业务场景 在下面的例子中我会发布一个简单的输出字符串的方法,然后在客户端调用并输出结果. 服务器端 环境搭建 在服务端,我们需要引入hessian和servlet的包.编写服务.配 ...
- Ztree自动触发第一个节点的点击事件
1.代码 $(function () { var setting = { //check属性放在data属性之后,复选框不起作用 //check: { // enable: true //}, dat ...
- oracle导入导出操作
1,获取oracle导入导出帮助: imp help=y 2,导出命令 exp 用户名/密码@数据库实例 file=文件路径名 如: exp sys/password@orcl file=d:\dat ...
- POJ 1611 The Suspects【并查集】
解题思路:一共给出 n个人,m组,接下来是m组数据,每一组开头是该组共有的人 num,则接下来输入的num个数,这些数是一组的 又因为最开始只有编号为0的人携带有病毒,且只有同一组的人会相互传染,问最 ...
- ZBrush设计制作小怪兽并用KeyShot渲染
ZBrush为电影制作设计独特的生物概念重点向大家介绍了概念设计师Ian Joyner使用ZBrush®3D图形绘制软件雕刻面对镜头咆哮的生物半身像的具体过程,ZBrush创建好模型之后,要想让角色更 ...