马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 shuiyu 于 2018-1-15 09:46 编辑
越努力,越幸运。欢迎大家来看我的笔记,不对的请各位大佬指正,谢谢
一、复习复习
(1)对于映射到内存中的PE文件各块之间的间隙:间隙的作用主要是对齐;在磁盘中一般是以200h(十六进制,也可以说是200字节)为一页对齐,而到内存中是要按CPU的方式对齐,CPU的对齐方式一般为1000h(十六进制,也可以说是1000个字节即4kb)
(2)IMAGE_DOS_HEADER结构体。
只要记住下面两个就行了。IMAGE_DOS_HEADER STRUCT{
+0h WORD e_magic // Magic DOS sigbature MZ(4Dh 5Ah) DOS可执行文件标记(MZ为两个字节)
+3ch DWORD e_lfanew // Offset to start of PE header 指向PE文件头(里面装着PE文件头的偏移地址)
}
(3)为什么会有"DOS可执行文件标记"?因为为了兼容DOS系统(远古时代DOS系统还是很有用的)。
(4)上一讲中圆圈中的广告是什么?在DOS运行这个程序的时候,首先会进行一个DOS的可执行体,会先提示圆圈中内容。(它的修改不会对程序造成影响)
(5)IMAGE_NT_HEADER 结构 IMAGE_NT_HEADERS STRUCT
{
+0h DWORD Signature
+4h IMAGE_FILE_HEADER FileHeader
+18h IMAGE_OPTIONAL_HEADER32 OptionlHeader //可选择的32位文件头
}IMAGE_NT_HEADERS ENDS
1.Signature:如果是一个有效的PE文件里,Signature字段将被设置为00004550h,ASCII码字符是"PE00"。
2.IMAGE_FILE_HEADER也是结构体(所以就变成结构里面得结构了,具体情况看上一讲)
3.下面就讲:IMAGE_OPTIONAL_HEADER32 OptionlHeader //可选择的32位文件头
二、IMAGE_OPTIONAL_HEADER32结构 (在IMAGE_NT_HEADER 结构中(结构中的结构),表示可选择的32位文件头)
(1)PE可执行文件中接下来的224个字节组成了PE可选头部。虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。
(2)重点摘要:(具体情况:http://bbs.fishc.com/home.php?mo ... ;do=blog&id=514)
AddressOfEntryPoint字段,指出文件被执行时的入口地址,这是一个RVA地址(相对虚拟地址)。这个域表示应用程序入口点的位置。并且,对于系统黑客来说,这个位置就是导入地址表(IAT)的末尾。
ImageBase字段:进程映像地址空间中的首选基地址(文件的优先装入地址)。Windows NT的Microsoft Win32 SDK链接器将exe文件这个值默认设为0x00400000(而DLL默认为10000000h),但是你可以使用-BASE:linker开关改变这个值。(如果装入地址被占据,则由Windows装载器改架到其它地方,所以就需要进行重定位操作,影响效率。对于EXE文件因为它总是使用独立的虚拟地址空间,所以装入地址不可能被占用,而DLL文件则必须包含重定位信息了)
SectionAlignment字段:内存中的区块的对齐大小。Windows NT虚拟内存管理器规定,段对齐不能少于页尺寸(当前的x86平台是4096字节),并且必须是成倍的页尺寸。4096字节是x86链接器的默认值,但是它可以通过-ALIGN: linker开关来设置。 (32位位1000h,即4kb;64位为2000h,即8kb。而一般我们的程序兼容或者不兼容,就是因为这个对齐大小不一样)
FileAlignment字段:文件(磁盘)中的区块大小。映像文件首先装载的最小的信息块间隔。例如,链接器将一个段实体(段的原始数据)加零扩展为文件中最接近的FileAlignment边界。早先提及的2.39版链接器将映像文件以0x200字节的边界对齐,这个值可以被强制改为512到65535这么多。 (一般情况下32位为200h,即200个字节)
NumberOfRvaAndSizes字段。这个域标识了接下来的DataDirectory数组。请注意它被用来标识这个数组,而不是数组中的各个入口数字,这一点非常重要。(自Windows NT发布以来一直都是16)
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]。
即DataDirectory字段。数据目录表示文件中其它可执行信息重要组成部分的位置。它事实上就是一个由16个相同的IMAGE_DATA_DIRECTORY结构的数组组成(结构里面的结构的结构),位于可选头部结构的末尾。当前的PE文件格式定义了16种可能的数据目录,这之中的11种现在在使用中。
IMAGE_DATA_DIRECTORY结构的定义:IMAGE_DATA_DIRECTORY STRUCT
VirtualAddress DWORD?; //数据的起始RVA
isize DWORD?; //数据块的长度
IMAGE_DATA_DIRECTORY ENDS
数据目录列表的含义:
谢谢小甲鱼带来的视频教程,感谢!!
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记,不对的请各位大佬指教,谢谢 |