首页 > 编程知识 正文

区块链哈希值怎么查,什么是区块链哈希值

时间:2023-05-04 08:51:33 阅读:163763 作者:3589

每个块的说明:

很多朋友喜欢听鳖的PE详细说明。 因为,上课时老师讲解的都只是一点点,大家都觉得在云中漂浮。 正好鳖的文采也不像正在上课的教授所说明的那么好,只能用简单易懂的语言进行说明。

块中的数据通常在逻辑上是相关的。 PE文件通常至少有两个块。 一个是代码块,另一个是数据块。 每个块需要完全不同的名称。 这个名字主要用于表达块的用途。 例如,有一个名为. rdata的块,表示他是只读块。 注:块按映像中的开始地址(RVA )顺序排列,而不是按字母顺序排列。

此外,使用块名只是为了方便人们的识别和编程,对操作系统来说这些都不重要。 微软给这些块起了一个很有特色的名字,但这不是必须的。 编程从PE文件中读取所需内容时,例如输入表、输出表不能参考块名。 正确的方法是根据数据目录表中的字段进行定位。

下表中的块名称和含义:

当然,Visual C还可以自己命名自己的块,并在#pragma中声明它,告诉编译器使用以下格式将数据插入块中:

#pragmadata_msg(fc_data ) )。

你还记得吗? #为宏处理符号。 什么是宏? 简单来说,对于编译器,编译器直接先进行翻译。 可能是用指定的格式机械地置换。 嘻嘻,学习解读需要编程啊~

上述语句指示编译器将数据放在名为" FC_data "的块中,而不是缺省的. data块中。 块一般从OBJ文件开始,由编译器放置。 链接器的工作是将左右的OBJ和库所需的块合并在一起,最终成为合适的块。 链接器遵循相当完整的规则集,以确定哪些块将被合并以及如何合并。

连接块:

链接器的一个有趣特征是可以合并块。 如果两个块具有相似且一致的属性,则它们在被链接时合并为一个块。 这取决于是否打开编译器的/merge开关。 实际合并块的优点是可以节省磁盘的内存空间。 ……注意:不应该将. rsrc、 reloc和. pdata合并为**块。

块对齐值:

以前,无论块是存储在内存中还是存储在磁盘上,都很容易理解对齐。 但是,他们的一般对齐值不同。

PE文件头中的文件定义磁盘区块的对齐值。 每个块都从对齐值倍数的偏移位置开始存储。 另一方面,块的实际代码和数据的大小不一定这么多,所以一般用00h填充剩下的地方。 这就是方块之间的间隙。

例如,在PE文件中,常见的对齐值为200h,每个组块从文件偏移位置开始,偏移位置为200h的倍数。 假设第一个信息块位于400h,长度为90h,则文件的内容为400h到490h。 由于文件对齐值为200h,因此490h到600h之间的间隔用00h填充,以使信息块的长度为文件对齐。 这个空间称为块间隙,下一块的开始地址为600h。

PE文件头中的SectionAligment定义内存中块的对齐值。 当PE文件映射到内存时,块始终从至少一个页面边界开始。

在X86系列CPU上,页面通常以4kb(1000h )的速度排列。 在IA-64中,以8kb(2000h )排列。 因此,在X86系统上,PE文件块的内存对准值通常等于1000h,每个块都以1000h的倍数存储在内存中。

RVA和文件偏移转换

之前讨论过RVA这个词,但是对于第一次接触PE文件的朋友来说,尤其是陌生人也没办法。 中国人不喜欢旧的缩写,但总是要**接受的……但是前面的知识铺垫好了,现在就来谈谈这个概念吧。 大的人应该有自信。 至少不用看起来那么费解无力哦~

RVA是相对虚拟地址(Relative Virtual Address )的缩写,顾名思义是“相对地址”。 PE文件内的各种数据结构中与地址相关的字段的大部分用RVA表示,有木有?

更准确地说,RVA是将PE文件加载到内存后数据位置相对于文件标题的偏移。 例如,如果Windows加载器将PE文件加载到00400000h的存储器中,并且将某个块的数据加载到0040=**xh中,则该数据的RVA是(0040**xh - 00400000h ) **xh

看图说话:

显然,DOS文件头、PE文件头和块表的偏移位置和大小不会改变。 当每个块映射到内存时,偏移位置会发生变化。

RVA有助于在将文件加载到内存后放置数据,但在磁盘上放置静态PE文件时存在问题。 举个例子来说吧。 ……例子在视频中,所以为了在这里争取时间不写。 大家一起看参考视频的演示吧。

如何换算RVA和文件偏移量?

在处理PE文件时,所有RVA必须经过换算到文件偏移量

,才能用来定位并访问文件中的数据,但换算却无法用一个简单的公式来完成,事实上,唯一可用的方法就是最土最笨的方法:

步骤一:循环扫描区块表得出每个区块在内存中的起始 RVA(根据IMAGE_SECTION_HEADER 中的VirtualAddress 字段),并根据区块的大小(根据IMAGE_SECTION_HEADER 中的SizeOfRawData 字段)算出区块的结束 RVA(两者相加即可),最后判断目标 RVA 是否落在该区块内。

步骤二:通过步骤一定位了目标 RVA 处于具体的某个区块中后,那么用目标 RVA 减去该区块的起始 RVA ,这样就能得到目标 RVA 相对于起始地址的偏移量 RVA2.

步骤三:在区块表中获取该区块在文件中所处的偏移地址(根据IMAGE_SECTION_HEADER 中的PointerToRawData 字段), 将这个偏移值加上步骤二得到的 RVA2 值,就得到了真正的文件偏移地址。

为节省笔墨和时间,以上步骤将在视频中具体演示……

通过上述三个步骤,我们可以写得出程序……

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。