当前位置:鱼C工作室 >解密系列 >系统篇 > 查看文章

PE格式详细讲解6(下)- 系统篇06|解密系列

PE格式详细讲解6(下)- 系统篇06

 

让编程改变世界

Change the world by program


 

当然我们在Visual C++ 中也可以自己命名我们的区块,用#pragma 来声明,告诉编译器插入数据到一个区块内,格式如下:

#pragma data_msg( “FC_data” )

 

大家还记得吧,#为宏处理符号,啥是宏?简单的说就是编译器的时候由编译器直接先进行翻译。或许说按照指定的格式机械替换。

嘻嘻,学破解要懂编程呐~

以上语句告诉编译器将数据都放进一个叫“FC_data” 的区块内,而不是默认的.data 区块。

区块一般是从OBJ 文件开始,被编译器放置的。链接器的工作就是合并左右OBJ 和库中需要的块,使其成为一个最终合适的区块。

链接器会遵循一套相当完整的规则,它会判断哪些区块将被合并以及如何被合并。

 

合并区块:

 

链接器的一个有趣特征就是能够合并区块。如果两个区块有相似、一致性的属性,那么它们在链接的时候能被合并成一个单一的区块。

这取决于是否开启编译器的 /merge 开关。事实上合并区块有一个好处就是可以节省磁盘的内存空间……

注意:我们不应该将.rsrc、.reloc、.pdata 合并到**的区块里。

 

区块的对齐值:

 

之前我们简单了解过区块是要对齐的,无论是在内存中存放还是在磁盘中存放~但他们一般的对齐值是不同的。

PE 文件头里边的FileAligment 定义了磁盘区块的对齐值。每一个区块从对齐值的倍数的偏移位置开始存放。

而区块的实际代码或数据的大小不一定刚好是这么多,所以在多余的地方一般以00h 来填充,这就是区块间的间隙。

 

例如,在PE文件中,一个典型的对齐值是200h ,这样,每个区块都将从200h 的倍数的文件偏移位置开始。

假设第一个区块在400h 处,长度为90h,那么从文件400h 到490h 为这一区块的内容,而由于文件的对齐值是200h。

所以为了使这一区块的长度为FileAlignment 的整数倍,490h 到 600h 这一个区间都会被00h 填充,这段空间称为区块间隙,下一个区块的开始地址为600h 。

 

PE 文件头里边的SectionAligment 定义了内存中区块的对齐值。PE 文件被映射到内存中时,区块总是至少从一个页边界开始。

一般在X86 系列的CPU 中,页是按4KB(1000h)来排列的;在IA-64 上,是按8KB(2000h)来排列的。

所以在X86 系统中,PE文件区块的内存对齐值一般等于 1000h,每个区块按1000h 的倍数在内存中存放。

分页阅读: 1 2 下一页
为您推荐

报歉!评论已关闭.