首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PE知识复习之PE的导入

PE知识复习之PE的导入 一丶简介   上一讲讲解了导出. 也就是一个PE文件给别人使用的时候.导出的函数 函数的地址 函数名称 序号 等等.   ...一个进程是一组PE文件构成的. PE文件需要依赖那些模块.以及依赖这些模块中的那些函数.这个就是导入需要做的. 确定PE依赖那个模块. 确定PE依赖的那个函数. 以及确定函数地址....PE加载前加载后的区别. 一样是一样的.但是需要分清 PE加载前.还有PE加载后.如果加载前,那么IAT跟INT一样.都可以找到依赖的函数名称....如果是加载后.也就是在内存中的话.那么IAT保存的就是函数的地址. PE加载后如下图: ? IAT保存的就是函数地址了. 从导入中找到IAT. ?...PE加载后INT 同上. IAT变成了存储函数地址的地址了.   2. Name 民称. 直接指向DLL名称文件名.

1K20

PE知识复习之PE的导出

PE知识复习之PE的导出 一丶简介  在说明PE导出之前.我们要理解.一个PE可执行程序.是由一个文件组成的吗....答案: 不是.是由很多PE文件组成.DLL也是PE文件.如果我们PE文件运行.那么就需要依赖DLL.系统DLL就是Kerner32.dll user32.dll等等.这些都是PE文件....什么是导出:     导出就是当前的PE文件提供了那些函数.给别人用. 举个例子: PE文件相当于一个饭店.那么菜单就是导出....导出表解盲:     有人认为exe可执行文件.没有导出.而DLL有导出.这个是错误的. 不管是exe.还是DLL 本质都是PE文件. exe文件也可以导出函数给别人使用....所以我们需要转换为FOA 去PE文件中查看. RVA 判断在那个节.

1.5K20
您找到你想要的搜索结果了吗?
是的
没有找到

PE知识复习之PE的节

PE知识复习之PE的节 一丶节信息,PE两种状态.以及重要两个成员解析.   确定节位置: DOS + NT头下面就是节.   ...确定节数量: 节数量在文件头中存放着.可以准确知道节有多少个.   节是一个结构体数组.没一个节表表示了数据在哪,怎么存储.....我们知道.PE文件有两种状态.一种是内存状态.一种则是文件状态....以及文件展开后.节数据在文件中的那个偏移位置. 1.内存中节开始的位置 我们分别以PE两种状态.来加深一下.在内存中跟文件中节数据起始位置....根据上方我们观看节.得出在文件中的偏移是0x400位置.所以跳转到文件偏移处.发现节数据跟内存的数据是一样的. 这也解释了PE在内存中展开跟在文件中是不一样的.

98620

PE知识复习之PE的重定位

PE知识复习之PE的重定位 一丶何为重定位       重定位的意思就是修正偏移的意思. 如一个地址位 0x401234 ,Imagebase = 0x400000 ....首先我们知道.一个EXE文件.会调用很多DLL(PE) 有多个PE文件组成. exe文件启动的基址 (ImageBase) 是0x40000. 假设我们调用三个DLL A B C....但是我们知道.PE文件中有很多RVA .RVA 是相对于ImageBase的偏移进行存放的. 如果PE文件中都是 RVA 那就好办了. 但是不一定呀....我们知道.一个PE文件需要很多地方进行重定位的.比如这个记录的 大小为16....所以修复的位置是 0x116b0的位置. 0x116b0 + 当前PE文件的ImageBase就是要进行重定位的位置 当前PE的Imagebase为0x400000 重定位地方为 0x4116b0位置

1.6K30

手工修复PE导入

PE结构分析之手工修复导入 打开文件,发现打不开 ? 用 winhex 打开,看一下代码节,在2000处与2008处调用了函数 ? 用 Stud_PE 打开 ?...可以看到导入全是0,就是这里的原因使得无法正常打开,要想打开,我们需要修复导入 ? 我们可以看一下RVA RAW,2000对应的文件地址为600 ?...Pe文件加载的时候,先通过IID里面指向的INT获取出该函数名,在dll中查找出来该函数的入口地址,然后填入IID里面指向的IAT ?...在 IAT 600(RAW)位置填上205C,IAT 中每4个字节表示函数名的 RVA。以4个0表示该 IAT 的结束 ? 整理出各个函数及 DLL 的 RVA ?...这样把 IAT 修复完成 ? 下面需要完成 INT 的建立。INT 应该在 IID 之后,所以先确定 IID 的位置。

1.8K30

PE知识复习之PE的绑定导入

PE知识复习之PE的绑定导入 一丶简介   根据前几讲,我们已经熟悉了导入结构.但是如果大家尝试过打印导入的结构. INT IAT的时候. 会出现问题....PE在加载前 INT IAT都指向一个名称. 这样说是没错的. 但是如果你打印过导入.会发现一个问题. 有的EXE程序.在打印IAT的时候.发现里面是地址....原因:   我们的PE程序在加载的时候.我们知道. PE中导入的子表. IAT.会填写函数地址. 但是这就造成了一个问题.PE程序启动慢.每次启动都要给IAT填写函数地址.   ...优点:   PE程序启动变快. 缺点:   如果DLL的ImageBase变了.那么就需要进行重定位.因为在文件中你填写的地址是固定的地址....PE的文件名 WORD NumberOfModuleForwarderRefs;        //依赖的另外的DLL有几个 // Array of zero or more IMAGE_BOUND_FORWARDER_REF

98220

2.4 PE结构:节详细解析

(Section Table)是Windows PE/COFF格式的可执行文件中一个非常重要的数据结构,它记录了各个代码段、数据段、资源段、重定向等在文件中的位置和大小信息,是操作系统加载文件时根据节来进行各个段的映射和初始化的重要依据...在执行PE文件的时候,Windows 并不在一开始就将整个文件读入内存,PE装载器在装载的时候仅仅建立好虚拟地址和PE文件之间的映射关系,只有真正执行到某个内存页中的指令或者访问页中的数据时,这个页面才会被从磁盘提交到内存中...图片 Windows 装载器在装载DOS部分PE文件头部分和节部分时不进行任何处理,而在装载节区的时候会根据节的不同属性做不同的处理,一般需要处理以下几个方面的内容: 节区的属性: 节是相同属性的数据的组合...一般来说,当一个PE文件被编译生成时则默认会存在.text,.data等基本节,而每一个节都是由一个IMAGE_SECTION_HEADER结构排列而成,每个结构都用来描述一个节,节总被存放在紧接在...PE文件头的地方,也即是从PE文件头开始偏移为00f8h的位置,针对每一个节中的定义可查看节结构体的定义; typedef struct _IMAGE_SECTION_HEADER { BYTE

29920

2.5 PE结构:导入详细解析

2.5.1 导入原理分析 对于磁盘上的PE文件来说,它无法得知这些导入函数会被放置在那个空间中,只有当PE文件被装入内存时,Windows装载器才会将导入中声明的动态链接库与函数一并加载到进程的地址空间...PE文件在被装入内存后JMP跳转后面的地址才会被操作系统确定并填充到指定的位置上,那么在程序没有被PE装载器加载之前0x00D22000地址处的内容是什么呢,我们使用上面的PE解析器对节进行解析观察....{ DWORD Characteristics; DWORD OriginalFirstThunk; // 包含指向IMAGE_THUNK_DATA(输入名称...DLL的ASCII字符串的RVA DWORD FirstThunk; // 指向输入地址(IAT)的RVA } IMAGE_IMPORT_DESCRIPTOR.../ 被导入函数的地址 DWORD Ordinal; // 被导入函数的序号 DWORD AddressOfData; // 指向输入名称

28520

2.9 PE结构:重建导入结构

在脱壳修复中,一般是通过将脱壳前和脱壳后的输入进行对比,找出IAT和INT中不一致的地方,然后将脱壳前的输入覆盖到脱壳后的程序中,以完成修复操作。...数据目录的第二个成员指向导入,该指针在PE开头位置向下偏移0x80h处,此处PE开始位置为0xF0h也就是说导入偏移地址应该在0xf0+0x80h=170h如下图中,导入表相对偏移为0x21d4h...这个地址的读取同样可以使用PeView工具得到,通过输入DataDirectory读者可看到如下图所示的输出信息,其中第二行则是导入的地址。...0000 0000 => ForwardChain => 转向API索引,默认为0 0000 244A => Name => 指向DLL名字的指针 0000 209C => FirstThunk => 指向输入地址...当系统装入内存后,其实只会用到IAT中的地址解析,输入中的INT就已经不需要了,此地址每个系统之间都会不同,该地址是操作系统动态计算后填入的,这也是为什么会存在导入这个东西的原因,就是为了解决不同系统间的互通问题

18930

2.9 PE结构:重建导入结构

在脱壳修复中,一般是通过将脱壳前和脱壳后的输入进行对比,找出IAT和INT中不一致的地方,然后将脱壳前的输入覆盖到脱壳后的程序中,以完成修复操作。...数据目录的第二个成员指向导入,该指针在PE开头位置向下偏移0x80h处,此处PE开始位置为0xF0h也就是说导入偏移地址应该在0xf0+0x80h=170h如下图中,导入表相对偏移为0x21d4h...图片这个地址的读取同样可以使用PeView工具得到,通过输入DataDirectory读者可看到如下图所示的输出信息,其中第二行则是导入的地址。...UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;我们以第一个调用动态链接库为例,其地址与结构的说明如下所示:0000 22C0 => OrignalFirstThunk => 指向输入名称...图片当系统装入内存后,其实只会用到IAT中的地址解析,输入中的INT就已经不需要了,此地址每个系统之间都会不同,该地址是操作系统动态计算后填入的,这也是为什么会存在导入这个东西的原因,就是为了解决不同系统间的互通问题

28220

2.4 PE结构:节详细解析

(Section Table)是Windows PE/COFF格式的可执行文件中一个非常重要的数据结构,它记录了各个代码段、数据段、资源段、重定向等在文件中的位置和大小信息,是操作系统加载文件时根据节来进行各个段的映射和初始化的重要依据...在执行PE文件的时候,Windows 并不在一开始就将整个文件读入内存,PE装载器在装载的时候仅仅建立好虚拟地址和PE文件之间的映射关系,只有真正执行到某个内存页中的指令或者访问页中的数据时,这个页面才会被从磁盘提交到内存中...Windows 装载器在装载DOS部分PE文件头部分和节部分时不进行任何处理,而在装载节区的时候会根据节的不同属性做不同的处理,一般需要处理以下几个方面的内容: 节区的属性: 节是相同属性的数据的组合...一般来说,当一个PE文件被编译生成时则默认会存在.text,.data等基本节,而每一个节都是由一个IMAGE_SECTION_HEADER结构排列而成,每个结构都用来描述一个节,节总被存放在紧接在...PE文件头的地方,也即是从PE文件头开始偏移为00f8h的位置,针对每一个节中的定义可查看节结构体的定义; typedef struct _IMAGE_SECTION_HEADER { BYTE

26720

2.6 PE结构:导出详细解析

PE文件执行时Windows装载器将文件装入内存并将导入中登记的DLL文件一并装入,再根据DLL文件中函数的导出信息对可执行文件的导入(IAT)进行修正。...导出函数存储在PE文件的导出表里,导出的位置存放在PE文件头中的数据目录中,与导出对应的项目是数据目录中的首个IMAGE_DATA_DIRECTORY结构,从这个结构的VirtualAddress...加上模块基址便是第一个导出函数的地址,向后每次相加导出函数偏移即可依次遍历出所有的导出函数地址,代码如下所示: int main(int argc, char * argv[]) { BOOL PE...= IsPeFile(OpenPeFile("c://pe/lyshark.dll"), 0); if (PE == TRUE) { // 0....获取三张,分别是 地址,名称,序号,其中序号是WORD DWORD* Addr_Table = (DWORD*)(RVAtoFOA(ExportTable->AddressOfFunctions

17920

2.6 PE结构:导出详细解析

PE文件执行时Windows装载器将文件装入内存并将导入中登记的DLL文件一并装入,再根据DLL文件中函数的导出信息对可执行文件的导入(IAT)进行修正。...导出函数存储在PE文件的导出表里,导出的位置存放在PE文件头中的数据目录中,与导出对应的项目是数据目录中的首个IMAGE_DATA_DIRECTORY结构,从这个结构的VirtualAddress...RVA加上模块基址便是第一个导出函数的地址,向后每次相加导出函数偏移即可依次遍历出所有的导出函数地址,代码如下所示:int main(int argc, char * argv[]){ BOOL PE...= IsPeFile(OpenPeFile("c://pe/lyshark.dll"), 0); if (PE == TRUE) { // 0....获取三张,分别是 地址,名称,序号,其中序号是WORD DWORD* Addr_Table = (DWORD*)(RVAtoFOA(ExportTable->AddressOfFunctions

35110

PE格式第六讲,导出

PE格式第六讲,导出 请注意,下方字数比较多,其实结构挺简单,但是你如果把博客内容弄明白了,对你受益匪浅,千万不要看到字数多就懵了,其实字数多代表它重要.特别是第五步...IAT表格中 2.程序运行的时候,用到那个API,才会填写到IAT中(延时加载技术,下面讲解) 3.程序还没运行的时候,在PE中函数的地址就已经写死了....原因是这样的 1.如果我们通过函数名字查找,比如找fun1,那么序号就是0,也就是第一项,那么通过0就可以找到fun1的偏移了 2.如果我们通过序号查找,比如我们输入3,我们要调用fun3了,那么这个时候...此时Base成员的作用就来了,它默认是1,那么我们输入3序号的时候,会减去base的值,得出的下标,再去序号中查找....所以现在是由两种方式, 第一种就是名字导入,fun1默认不加序号就是从0开始的,去序号中查0就能找到偏移. 第二种就是专门按照序号导入的,那么此时你输入的序号-base才真正的是函数的偏移了.

1K60

2.5 PE结构:导入详细解析

2.5.1 导入原理分析对于磁盘上的PE文件来说,它无法得知这些导入函数会被放置在那个空间中,只有当PE文件被装入内存时,Windows装载器才会将导入中声明的动态链接库与函数一并加载到进程的地址空间...文件在被装入内存后JMP跳转后面的地址才会被操作系统确定并填充到指定的位置上,那么在程序没有被PE装载器加载之前0x00D22000地址处的内容是什么呢,我们使用上面的PE解析器对节进行解析观察....,那么将RVA值加上PE文件装入的基址就是实际的地址.首先我们需要找到数据目录,找到了数据目录结构,就能找到导入,导入由一系列的IMAGE_IMPORT_DESCRIPTOR结构组成,结构的数量取决于程序需要使用的...union { DWORD Characteristics; DWORD OriginalFirstThunk; // 包含指向IMAGE_THUNK_DATA(输入名称...DLL的ASCII字符串的RVA DWORD FirstThunk; // 指向输入地址(IAT)的RVA} IMAGE_IMPORT_DESCRIPTOR;

46320

PE格式:导入与IAT内存修正

本章教程中,使用的工具是上次制作的PE结构解析器,如果还不会使用请先看前一篇文章中对该工具的介绍,本章节内容主要复习导入结构的基础知识点,并通过前面编写的一些小案例,实现对内存的转储与导入的脱壳修复等...脱壳修复:输入一般分为IAT与INT,由于加壳后程序可能会加密或者破坏IAT结构,导致脱壳后IAT不一致了,脱壳修复就是使用未脱壳的源程序的输入覆盖到新程序中,就这麽简单。...解析 IMAGE_IMPORT_DESCRIPTOR 数据目录第二个成员指向输入,该指针在PE开头位置向下偏移80H处,PE开始位置就是B0H , B0H+80H= 130H处。...此处存放着一个指针,00002040 即输入在内存中的偏移量为 2040,使用前面制作的工具可以快速定位到此处。...先查节,发现UPX 定位到数据目录中第二个字段,也就是输入的存储位置,直接使用工具计算出foa地址。

73830
领券