PE文件浅析
PE文件浅析
相关术语
文件偏移地址(File Offset,FOA)
数据在PE文件中的地址。这是文件在磁盘中存放是相对于文件开头的偏移。
装载基址(Image Base)
PE文件装入内存时的基地址。
虚拟内存地址(Virtual Address,VA)
PE文件中的指令被装入内存之后的地址。
相对虚拟地址(Relative Virtual Address,RVA)
内存地址相对于映射基址的偏移量。
三者关系
VA=Image Base+ RVA
PE解码器
IMAGE_DATA_DIRECTORY 数据目录结构
1 | typedef struct _IMAGE_DATA_DIRECTORY { |
1 | //定位目录项的方法(以导出表为例): 所有操作都在FileBuffer状态下完成 |
IMAGE_IMPORT_DESCRIPTOR导入表
descriptor->描述符
OriginalFirstThunk
**这个值是一个4字节的RVA地址,这个地址指向了导入名称表(INT)**,INT是一个IMAGE_THUNK_DATA结构体数组,这个结构体的最后一个成员内容为0时数组结束。这个数组的每一个成员又指向了一个IMAGE_IMPORT_BY_NAME结构体,这个结构体包含了两个成员函数序号和函数名,不过这个序号一般没什么用,所以有的编译器会把函数序号置0。函数名可以当作一个以0结尾的字符串。
FirstThunk
**这个值是一个4字节的RVA地址,这个地址指向了导入地址表(IAT),这个IAT和INT一样,也是一个IMAGE_THUNK_DATA结构体数组,不过它在程序载入前和载入后由两种状态,在程序载入前它的结构和内容和INT表完全一样,但却是两个不同的表,指向了IMAGE_IMPORT_BY_NAME结构体。在程序载入后,他的结构和INT表一样,但内容就不一样了,里面存放的都是导入函数的地址。
节表各成员意义详解。
PE文件头保存着整个PE文件的索引信息,可以帮助PE装载器定位资源,而节则保存着整个PE文件的所有资源。正因为如此,所以存在着这样的说法:头是节的描述,节是头的具体化。
参考文章:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 infinite!