逆向 杂知识点

对于一个可执行文件的来说
1.DOS头
对于DOS头关注两个偏移量00h,和3ch
前者的内容是一个WORD型数据标记了DOS头,为4D 5A h
后者的内容是一个DWORD型数据是PE头的地址,即可通过DOS头的003ch中的内容知道PE头的地址
2.PE头
在PE头中讨论偏移量时都是相对于PE头的首地址的偏移量
偏移量00h的单元内容是一个DWORD型数据,在有效的PE文件里为00 00 45 50h 在小段储存的模式下即为PE00
偏移量04h到18h的单元内容为结构体IMAGE_FILE_HEADER的内容
偏移量04h的单元内容是一个WORD型数据,表明文件运行的平台
偏移量06h的单元内容是一个WORD型数据,表明文件的区块数目
偏移量08h的单元内容是一个DWORD型数据,表明文件创建日期和时间
偏移量14h的单元内容是一个WORD型数据,表明下一个结构IMAGE_OPTIONAL_HEADER32的大小
偏移量16h的单元内容是一个WORD型数据,表明文件的属性
偏移量18h开始是结构IMAGE_OPTIONAL_HEADER32的内容
偏移量18h到30h是标准域
偏移量28h的单元内容是一个DWORD型数据,表明程序执行入口RVA(偏移虚拟地址)
偏移量34h之后是NT结构扩展领域
偏移量34h的单元内容是一个DWORD型数据,表明程序的首选装载地址ImgBase (和文件头有什么区别)

通过ImgBase+RVA可得到程序的入口地址,用OD打开后若第一次的断点设置在WinMain处则,将要执行的第一条代码的地址就是ImgBase+RVA的值
但是对某些程序好像不是这样,对于飞Young宽带AdialClient.exe这个程序
显示RVA为00CC745D,但是用OD打开后却显示00F41187,但是飞Yong宽带还有一个EXE程序AidcRes.exe,这个程序与上个程序相比,左下角有了一个管理原身份的标志,对于这个程序ImgBase+RVA和OD显示的是一致的,不知道为什么,或许是那个管理员的问题?

偏移量38h的单元内容是一个DWORD型数据,表明内存中区块的对齐大小
偏移量3ch的单元内容是一个DWORD型数据,表明文件中区块的对齐大小
偏移量5ch的单元内容是一个WORD型数据,表明可执行文件期望的子系统
偏移量78h的单元内容是一个数组,存放16个IMAGE_DATA_DIRECTORY结构体
一个索引对应一个区块,该索引的结构体中存放区块的起始RVA和长度。每个结构体的长度是8个字节
紧接着PE头的是区块表,也可通过PE结构中的SizeofOptionalHeader字段获得大小加上地址来得到区块表的地址
开始的地址距离PE头的偏移量为F8h,表是由若干个
_IMAGE_SECTION_HEADER 结构所组成的,每个结构40(十进制)个字节,
虽然说是节表中结构的个数等于有效节的个数加1,但是当用UE打开AidsRes.exe文件时,发现NumberOfSection字段值是9,对应了正好的9个块,不知道为什么
数据目录表和区块表的区别

区块表及区块表中的RVA和PointerToRawOffset

如何按照数据目录表定位区块
第一块的起始地址并不是0x00001000
因为UE打开的是磁盘中的文件,所以采用的对齐方式是磁盘中的对齐方式AidsRes.exe第一块的起始地址为0x00000400?

根据内存中的虚拟偏移地址如何知道文件中的偏移地址呢?
首先区块表上记录了各个区块的RVA和
SizeofRawData(为什么是SizeofRawData磁盘中的大小)
总之就是根据这两者确定数据在哪个节中,然后数据的RVA-节的RVA得到这个数据相对于该节首地址的偏移,然后通过区块表中的PointerToRawOffset得到区块在文件中的首地址的偏移,加上数据相对于该节首地址的偏移就是数据的文件偏移

https://www.52pojie.cn/forum.php?mod=viewthread&tid=1407996&page=1&extra=#37810231_misc%E5%92%8Csizeofrawdata
VirtualSize为内存中没有对齐前的大小,也就是块的最后一个有意义的数据到块的第一个数据之间的大小
SizeofRawdata是文件中对齐后的大小,在内存态无效
在内存中(运行态时),实际上 该节在内存中的末尾位置应该为:VA+内存对齐后的大小

但是在节的属性中并没有表示内存对齐后大小的成员,内存对齐后的大小是如何得来的?

内存对齐后的大小
决定内存对齐后的大小的因素有2个:

内存对齐:即SectionAlignment
Max{Misc,SizeOfRawData}:Misc和SizeOfRawData的最大值
内存对齐后的大小 = (Max{Misc,SizeOfRawData} ÷ SectionAlignment) 向上取整 × SectionAlignment

取SizeOfRawData很容易理解,但为什么还和Misc有关?

Misc表示的是实际大小难道不是一定小于文件对齐后的大小吗?

并不是,实际大小也可能要比文件对其后的大小要大,就拿全局变量为例

全局变量可以分为两种:有初始值的和没有初始值的

有初始值的全局变量在文件中就已经为其分配了空间,而没有初始值的全局变量只有到程序加载到内存中(运行态)后才会为其分配空间

假设当前存储的全局变量都是没有有初始值的,即在文件中没有为其分配空间,也就是在文件中大小为0,这也就导致SizeOfRawData为0,因此,此时的Misc > SizeOfRawData

所以内存对齐后的大小要综合Misc和SizeOfRawData决定

重定位表的大小好像和VirtualSize不一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值