分类: PE

6 篇文章

PE格式分析_6(IMAGE_SECTION_HEADER)
节表( IMAGE_SECTION_HEADER ) 作用:描述PE文件与内存之间的映射关系,说明PE文件的指定内容拷贝至内存的哪个位置、拷贝大小及内存属性的设置。 一个结构体总大小: 0x 28 (40) 字节 节表位置: 置于选项头之后,位置 = 选项头( IMAGE_OPTIONAL_HEADER) 的地址 + 选项头( IMAGE_OPTIONAL_HEADER)的大小。 // IMAGE_SECTION_HEADER 节表结构体,大小40B typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 节表名称:描述性字段 2个字节, 这个段写了区段名字(.text .rdata ....),但是系统不承认这个名字,名字随便改 // 重要的是内存属性 不是名字, 调试器查看内存有区段显示,是从这里获取的 // 下方4个字段:从文件S1处开始,拷贝S2大小的数据,到内存S3处,有效数据占用内存S4大小 union { DWORD PhysicalAddress; DWORD VirtualSize; // S4:在内存中的大小 } Misc; DWORD VirtualAddress; // S3:内存地址:基于模块基址,与SectionAlignment对齐(0x1000) DWORD SizeOfRawData; // S2:文件大小(从文件中取SizeOfRawData字节到VirtualAddress地址),与FileAlignment对齐(0x200) DWORD PointerToRawData; // S1:文件偏移,与FileAlignment对齐(0x200) //跟调试相关 …
PE格式分析_5(IMAGE_OPTIONAL_HEADER)
IMAGE_OPTIONAL_HEADER typedef struct _IMAGE_OPTIONAL_HEADER { WORD Magic; // 判断32位0x10b,64位0x20b BYTE MajorLinkerVersion; // 主链接器版本号,仅供参考 BYTE MinorLinkerVersion; // 副链接器版本号,仅供参考 //系统分配内存不看着3个值,对于调试器有影响 DWORD SizeOfCode; // 代码所占空间大小,仅供参考,OD反汇编代码,通过这个字段获得内存 // SizeOfCode可以尝试出极限值,让OD调试可以使用,但是会卡很久 // OS是从节表里算的代码段的大小 DWORD SizeOfInitializedData; // 已初始化数据所占空间大小,仅供参考,微软没使用 DWORD SizeOfUninitializedData;// 未初始化数据所占空间大小,仅供参考,微软没使用 DWORD AddressOfEntryPoint; // ***** oep:原本的程序入口 //这个值可以修改,但是修改过后必须跳转到在该偏移处跳转到真正入口 DWORD BaseOfCode; // 代码基址 (无用) DWORD BaseOfData; // 数据基址 (无用) DWORD ImageBase; // ****** 建议模块地址:exe映射加载到内存中的首地址 = PE 0处,即实例句柄hInstance // 一般而言,exe文件可遵从装载地址建议,但dll文件无法满足 (开了随机基址可能也不是这个值,是通过重定位表得到) //这个值最好不要改,改的话要改动大量地方,因为函数和全局变量的地址也需要跟着改变 DWORD Sectio…
PE格式分析_4(PE查看工具(010_Editor))
www.010Editor.com 查看PE的工具 winhex 这个功能很强大,但是查看文件结构不方便,可以写脚本来告诉编辑器如何解析,脚本语言是winhex的特定语言; 010_Editor 功能和winhex同样强大,这个也可以写脚本,脚本语言是C语言,因此这个工具会更加方便; 举例: myPE.BT 直接拖到 010_Editor里来写 步骤: vs中的结构体直接拷贝到脚本里,然后重新定义一下就好了(直接把文件拖进010_Editor来编辑),就会按照结构体来解析; myPE.BT typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number WORD e_cblp; // Bytes on last page of file WORD e_cp; // Pages in file WORD e_crlc; // Relocations WORD e_cparhdr; // Size of header in paragraphs WORD e_minalloc; // Minimum extra paragraphs needed WORD e_maxalloc; // Maximum extra paragraphs needed WORD e_ss; // Initial (relative) SS value WORD e_sp; // Initial SP value WORD e_csum; // Checksum WORD e_ip; // Initial IP value WORD e_cs; // Initial (relative) CS value WORD e…
PE格式分析_3(IMAGE_FILE_HEADER)
pe格式代码,分析PE header #include <stdio.h> #include <Windows.h> //#include <winnt.h> // 定义了pe结构体的所有成员 int main() { /******************************* Dos header ************************************/ IMAGE_DOS_HEADER Header; // Dos头 /******************************* PE header ************************************/ //IMAGE_FILE_HEADER peHeader; // 新的文件格式从这里开始,并开始区分32和64位程序,但是文件头被NT头包含 IMAGE_NT_HEADERS32 NTHeader; // IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS64 NT头(PE) // NT头包含: { IMAGE_FILE_HEADER FileHeader; // 文件头,保存文件信息 IMAGE_OPTIONAL_HEADER32 OptionalHeader; // 选项头,存放程序信息 // 选项头包含: { IMAGE_DATA_DIRECTORY DataDirectory[1]; // 数据目录,存放各种表,放1个表就增加1项 } } /******************************* Section header ************************************/ IMAGE_SECTIO…
PE格式分析_2
编写最小的PE文件 在Windows上新建一个minPE.asm文件,使用vs的x86 Native Tools Command Prompt for VS 2019来编译 使用编译脚本 build.bat ml /c minPE.asm link /entry:START /subsystem:windows /merge:.rdata=.text /ALIGN:16 minPE.obj 注意: 这个ALIGN:16对齐值给512,就没有版本问题了(在xp上不行) 如果是在xp上运行,对齐值给4就可以,但是需要用VC++6.0编译 minPE.asm .386 .model flat,stdcall option casemap:none includelib user32.lib includelib kernel32.lib extern MessageBoxA:proto : dword, : dword, : dword, : dword extern ExitProcess:proto : dword .const g_szText db "pe for pe teach",0 g_szTitle db "tiptip",0 .code START proc push 0 push offset g_szText push offset g_szTitle push 0 call MessageBoxA push 0 call ExitProcess ret START endp end 分析PE文件内容 如果32的PE文件在16位的Dos运行,会怎么样? 可以运行啊,只运行16位的部分,打印出一提示语,先看下PE头的大小字节; Dos的16位…
PE格式分析_1
PE历史简介: portable excute 可移植的,可执行的文件(exe、dll) Microsoft最开始做的Dos系统,开头是MZ标识,又叫MZ系统(这tm是个人名,碉堡了),是16位操作体统。 Microsoft后开开发了Windows NT系统,最大的特点是桌面,是32位操作系统。 那么文件格式需要重新设计,出现了PE,希望一统江湖,考虑了所有的操作系统厂家,但是Apple和Linux没有使用PE,而是用ELF(unix、Linux)格式。 因此PE的文件格式里面有很多字段是 windows 系统用不到的,有些是给已经被淘汰的dos系统用的,还有一些是给其他系统用的,所以不是每个字段都非常有用,只需要关注在 windows 上用的,即windows会检查的一些字段 畸形PE:做过手脚的PE,用于对抗 msdn: 代码解释结构 #include <stdio.h> #include <Windows.h> //#include <winnt.h> // 定义了pe结构体的所有成员 int main() { /******************************* Dos header ************************************/ IMAGE_DOS_HEADER Header; // Dos头 /******************************* PE header ************************************/ //IMAGE_FILE_HEADER peHeader; // 新的文件格式从这里开始,并开始区分32和64位程序,但是文件头被NT头包含 IMAGE_NT_…