PE文件格式
code_greenhand
这个作者很懒,什么都没留下…
展开
-
PE文件格式中数据目录项中的资源表
资源表资源表地址在数据目录的数组下标为2的地方,定位到资源表后就可以遍历资源资源是树形结构,一般有3层 根目录 子目录 文件根目录结构结构体如下定义typedef struct _IMAGE_RESOURCE_DIRECTORY { DWORD Characteristics; 资源属性 DWORD TimeDateStamp; ...原创 2019-11-16 00:33:37 · 424 阅读 · 0 评论 -
PE文件格式中数据目录项中的TLS
TLS(线程句柄存储)TLS表地址在数据目录项数组下标为9的位置TLS结构体定义如下typedef struct _IMAGE_TLS_DIRECTORY32 { DWORD StartAddressOfRawData; // TLS初始化数据的起始地址 DWORD EndAddressOfRawData; // TLS初始化数据的结束地址 两个正好...原创 2019-11-16 00:08:13 · 556 阅读 · 0 评论 -
PE文件格式中数据目录项中的重定位表和模拟LoadLibrary
重定位表重定位表的作用当链接器生成一个PE文件时,会假设这个文件在执行时被装载到默认的基址处,并把code和data的相关地址都写入到PE文件中,如果加载PE文件时将默认的值作为基地址加载,则不需要重定位。如果PE文件被装载到虚拟内存的另一个地址的话,连接器记录的那个地址就是错误的,这时就需要重定位表来进行调整地址VA重定位表的结构定义typedef struct _IMAGE_BAS...原创 2019-11-15 22:25:28 · 344 阅读 · 0 评论 -
模拟操作系统的装载器LoadPE
模拟操作系统实现loadPE设计思路将PE文件头加载到内存中把所有节区数据加载到内存修正导入表,也就是上面的获取导入函数地址填入到IAT中注意:为了防止装载的程序涉及到VA不一样,导致loadPE访问地址崩溃,所以自己的loadPe程序的基址要和装载的程序地址要一样,可以修改link 选项 /base:基地址举例说明:假如对方模块基址为10000000 有个指令为jmp 0x1000...原创 2019-11-15 21:33:14 · 997 阅读 · 0 评论 -
PE文件格式中数据目录项中的导出表和模拟GetProcAddress
导出表导出表的概念记录了导出符号(函数或变量)的地址,名称,与序号的集合的一张表位导出表导出表的作用通过导出表来分析不认识的动态库文件所提供的功能向调用者提供导出函数指令在模块中的起始地址,也就是API GetProcAddress的功能导出表有对应导出函数的地址,所以可以通过导出表来修正导入表的IAT地址导出表的结构体定义导出表在数据目录项的第0项 IMAGE_DIREC...原创 2019-11-15 21:11:25 · 405 阅读 · 0 评论 -
PE文件格式中数据目录项中的导入表和VA-RVA-FA转换
VAva(虚拟地址):虚拟地址是内存中的地址,每一个内存空间都有一个地址表示,这就是虚拟地址如打开OD,加载程序,里面的每一个地址都是虚拟地址,VA如下图,PE文件加载进内存的VA都是由imageBase(基址)+RVA(相对虚拟地址)形成的绝对虚拟地址VARVARVA(相对虚拟地址):相对虚拟地址相对的是选项头里面的字段ImageBase(程序基址),PE结构中大部分字段的存的就是RVA...原创 2019-11-15 20:21:01 · 1574 阅读 · 0 评论 -
PE文件格式各个头部结构
pe文件格式Dos头Dos头数据格式定义如下typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number (固定标志,不会变的标志)4D5A MZ,用来判断是否是DOS程序的 WORD e_cblp; ...原创 2019-11-13 17:22:59 · 736 阅读 · 0 评论