小甲鱼PE详解之区块表(节表)和区块(节)续(PE详解05)

小甲鱼pe详解打包 小甲鱼pe详解打包 全了 立即下载
这一讲我们结合实例来谈谈区块表的定义以及各个属性的含义。

首先,我们先用之前学过的一点知识在二进制文件中手动翻找区块表,这样做的好处是可以使你很快的对PE结构牢记于心。学来的东西就是能用的东西,不能用的理论是空谈,是瞎扯。
(具体过程演示大伙可参考小甲鱼的视频教程:《解密系列》系统篇.第五讲)

这里我们经过千辛万苦终于找到了我们的区块表了(当然将来我会教大家写一个自己的工具,让工具去找,现在让大家自己动手是为了增强感觉!),现在我们联系上一章节提到的区块表的结构对各个成员进行详细的分析:


typedef struct _IMAGE_SECTION_HEADER 

{

        BYTE Name[IMAGE_SIZEOF_SHORT_NAME];     // 节表名称,如“.text” 

        //IMAGE_SIZEOF_SHORT_NAME=8

        union
         {

                DWORD PhysicalAddress;        // 物理地址

                DWORD VirtualSize;                // 真实长度,这两个值是一个联合结构,可以使用其中的任何一个,一

                                                              // 般是取后一个

        } Misc;

        DWORD VirtualAddress;              // 节区的 RVA 地址

        DWORD SizeOfRawData;            // 在文件中对齐后的尺寸

        DWORD PointerToRawData;        // 在文件中的偏移量

        DWORD PointerToRelocations;     // 在OBJ文件中使用,重定位的偏移

        DWORD PointerToLinenumbers;   // 行号表的偏移(供调试使用地)

        WORD NumberOfRelocations;      // 在OBJ文件中使用,重定位项数目

        WORD NumberOfLinenumbers;    // 行号表中行号的数目

         DWORD Characteristics;              // 节属性如可读,可写,可执行等 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; 

Name:区块名。这是一个由8位的ASCII 码名,用来定义区块的名称。多数区块名都习惯性以一个“.”作为开头(例如:.text),这个“.” 实际上是不是必须的。值得我们注意的是,如果区块名超过 8 个字节,则没有最后的终止标志“NULL” 字节。并且前边带有一个“$” 的区块名字会从连接器那里得到特殊的待遇,前边带有“$” 的相同名字的区块在载入时候将会被合并,在合并之后的区块中,他们是按照“$” 后边的字符的字母顺序进行合并的。

另外小甲鱼童鞋要跟大家啰嗦一下的是:每个区块的名称都是唯一的,不能有同名的两个区块。但事实上节的名称不代表任何含义,他的存在仅仅是为了正规统一编程的时候方便程序员查看方便而设置的一个标记而已。所以将包含代码的区块命名为“.Data” 或者说将包含数据的区块命名为“.Code” 都是合法的。

因此,小甲鱼建议大家:
当我们要从PE 文件中读取需要的区块时候,不能以区块的名称作为定位的标准和依据,正确的方法是按照 IMAGE_OPTIONAL_HEADER32 结构中的数据目录字段结合进行定位。


Virtual Size:对表对应的区块的大小,这是区块的数据在没有进行对齐处理前的实际大小。

Virtual Address:该区块装载到内存中的RVA 地址。这个地址是按照内存页来对齐的,因此它的数值总是 SectionAlignment 的值的整数倍。在Microsoft 工具中,第一个快的默认 RVA 总为1000h。在OBJ 中,该字段没有意义地,并被设为0。

SizeOfRawData:该区块在磁盘中所占的大小。在可执行文件中,该字段是已经被FileAlignment 潜规则处理过的长度。

PointerToRawData:该区块在磁盘中的偏移。这个数值是从文件头开始算起的偏移量哦。

PointerToRelocations:这哥们在EXE文件中没有意义,在OBJ 文件中,表示本区块重定位信息的偏移值。(在OBJ 文件中如果不是零,它会指向一个IMAGE_RELOCATION 结构的数组)

PointerToLinenumbers:行号表在文件中的偏移值,文件的调试信息,于我们没用,鸡肋。

NumberOfRelocations:这哥们在EXE文件中也没有意义,在OBJ 文件中,是本区块在重定位表中的重定位数目来着。

NumberOfLinenumbers:该区块在行号表中的行号数目,鸡肋。

Characteristics:该区块的属性。该字段是按位来指出区块的属性(如代码/数据/可读/可写等)的标志。

小甲鱼以下给大家列举出最常用的一些属性值:

具体内容可以参考MSDN在线文档:http://msdn.microsoft.com/en-us/library/ms680341%28v=vs.85%29.aspx
IMAGE_SCN_CNT_CODE 0x00000020


The section contains executable code.

包含代码,常与 0x10000000一起设置。


IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040


The section contains initialized data.

该区块包含以初始化的数据。


IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080


The section contains uninitialized data.

该区块包含未初始化的数据。


IMAGE_SCN_MEM_DISCARDABLE 0x02000000

The section can be discarded as needed.
该区块可被丢弃,因为当它一旦被装入后,
进程就不在需要它了,典型的如重定位区块。

IMAGE_SCN_MEM_SHARED 0x10000000
The section can be shared in memory.
该区块为共享区块。

IMAGE_SCN_MEM_EXECUTE 0x20000000

The section can be executed as code.
该区块可以执行。通常当0x00000020被设置
时候,该标志也被设置。

IMAGE_SCN_MEM_READ 0x40000000

The section can be read.
该区块可读,可执行文件中的区块总是设置该
标志。

IMAGE_SCN_MEM_WRITE 0x80000000
The section can be written to.
该区块可写。

实例讲解请观看视频演示:http://www.fishc.com/a/shipin/jiemixilie/1008.html
Eureka自我保护机制 Eureka自我保护机制 默认情况下,当eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒),但是,如果短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server一起重启(因为在开发过程中不会修改eureka注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last 阅读详情

相关推荐

从轻量化到高精度:3DXML 转 STP 的工程数据升级技术指南

本文详细解析了3DXML转STP格式的工程数据升级技术,对比了两种格式在轻量化和高精度方面的特性差异,并提供了CATIA、FreeCAD及Python编程等多种专业级转换方案。通过实际案例展示了如何确保转换过程中的数据精度,适用于CAD设计、精密制造等场景,帮助工程师实现工程数据的高效升级。

weixin_29201859的博客 215

块表的地址变换机构

时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环) 空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据结构在内存中都是连续存放的) 在基本地址变换机构中,每次要访问一个逻辑地址,都需要查询内存中的页表。由于局部性原理,可能连续很多次查到的都是同一个页表项。既然如此,能否利用这个特性减少访问页表的次数呢? 什么是块表(TLB) 块表,又称联想..

LOOKTOMMER的博客 1322

【工具】GitHub学生认证+PyCharm配置Copilot全流程指南

本文提供了一份详细的GitHub学生认证及在PyCharm中配置Copilot的完整指南。通过完成A2F认证、准备有效材料并使用干净网络环境,学生可免费获取GitHub Copilot Pro订阅,极大提升编程学习与开发效率。

w7x8y9z的博客 1459

快表

一、快表 快表, 又称联想寄存器(TLB, translation lookaside buffer ) , 是一种访问速度比内存快很多的高速缓存(TLB不是内存! ) , 用来存放最近访问的页表项的副本, 可以加速地址变换的速度。与此对应, 内存中的页表常称为慢表。 二、引入快表后地址的变化过程 ① CPU给出逻辑地址, 由某个硬件算得页号、 页内偏移量, 将页号与快表中的所有页号进行比较。 ② 如果找到匹配的页号, 说明要访问的页表项(存放页号与页框号)在快表中有副本, 则直接从中取出该页对应的内存块号

qq_45100361的博客 1万+

告别复杂模型:用UFLD算法5分钟搞定车道线检测(附Python代码)

本文介绍了UFLD(Ultra Fast Lane Detection)算法在车道线检测中的高效应用,仅需5行核心代码即可实现实时检测,特别适合边缘计算设备。通过对比传统方法,UFLD在推理速度、模型大小和硬件需求上具有显著优势,是深度学习领域轻量级解决方案的典范。

weixin_27872611的博客 289

群晖NAS变身私有Git服务器:DS218+部署与TortoiseGit客户端实战指南

本文详细介绍了如何将群晖NAS(如DS218+)变身为私有Git服务器,并配置TortoiseGit客户端实现高效代码管理。通过硬件检查、系统更新、Git Server套件安装及权限配置等步骤,帮助开发者在局域网内搭建安全、高速的代码托管环境,特别适合小团队协作。

weixin_29252171的博客 225

操作系统面试题(十):页式内存管理中的块表和多级页表

文章目录块表【1】块表【2】多级页表【3】总结 块表 在页式内存管理中有2个重要的问题: 虚拟地址到物理地址的转换要快 当虚拟空间很大时,相应的页表也会变得很大 为了解决这两个问题,引入了块表和多级页表 块表用于解决地址转换速度问题 多级页表用于解决页表过大,资源浪费问题 【1】块表 块表可以直接理解为页式内存管理的高速缓存(Cache) 块表的作用:加速虚拟地址到物理地址的转换速度 块表中存放着页表的一部分甚至全部内容 块表作为页表的高速缓存器(Cache),作用与页表的本质作用一致.

小杨的博客 3842

figma MCP + cursor如何将设计稿生成前端页面

Figma MCP配置与代码生成指南 本文详细介绍了如何在Cursor中配置Figma MCP(多上下文处理器)的完整流程:从获取Figma API密钥、设置MCP服务器配置,到添加代码生成规则。关键步骤包括生成Figm a个人访问令牌、配置cursor settings文件、启用MCP服务,以及设置代码规则(包含TypeScript/Vue技术栈规范、BEM命名规则等)。最后提供了将Figma设计稿转化为Vue页面的prompt模板,涵盖文件结构、图片处理、样式规范等具体要求,确保生成代码与设计稿高度一致

weixin_45644355的博客 2912

objectArx ---块表及图块

目录一、块定义二、块参照类2.1 封装类库2.2 测试代码三、带属性的块参照类3.1 封装类3.2 测试代码3.3 符号表查询结果 一、块定义 功能:只是新增了一个块表记录,模型空间中不显示 代码示例(见效果图的new)#include "StdAfx.h" #include "Commands.h" #include "Editor.h" void AddCommands() { Editor::AddCommand(_T("AddBlock"), ACRX_CMD_MODAL, CreateBl

chucksun0426的博客 2808

TC8:IPv4_HEADER_05-09

所有主机都必须准备好接受最多576个字节的数据报我们知道最大传输单元MTU通常是1500个字节,也就是说一条IP数据报的Header+payload最大1500,那为什么这条测试用例又要求主机准备好接受最多576个字节的IP数据报呢。

jasonj333 513

Spring AI 项目实战(十二):Spring Boot +AI + DeepSeek + 百度OCR 公司发票智能处理系统的技术实践(附完整源码)

本文介绍了基于百度OCR API与DeepSeek AI的发票智能处理系统,通过整合AI技术实现发票识别、信息提取和验证的全流程自动化。系统采用Spring Boot 3.2.0架构,结合百度OCR的高精度图像识别和DeepSeek的语义理解能力,显著提升了发票处理效率与准确率。关键技术包括多模型融合、智能错误纠正和自适应学习机制,实现了95%以上的识别准确率,将传统处理效率提升90%以上。该系统为数字化转型中的企业财务管理提供了智能化解决方案,具备高精度识别、实时处理、智能验证等核心优势。

博客 1628

快表、页表和cache之间的关系

快表、页表和cache之间的关系全相联映射快表命中全相联映射快表未命中四路组相连映射 在32位操作系统中,一个地址对应32位2进制数,则能寻址到4GB(232)的地址。 而在linux内存管理中,内存以页为单位进行管理,一般情况下每页4KB大小, 4GB内存就有个4GB/4KB=220页。 所以可将一个32位的地址分为20位+12位。 前20位可以确定出地址在页中的哪一页,剩下的12位就可以确定出在这一页中的哪个位置。 反过来,若是知道了页内为12位,那每页大小就肯定为212=4KB了。 全相联映射

sparky的博客 2万+

软考高级系统架构设计师历年论文真题深度分析(2011-2025)

本文系统分析了2011-2025年系统架构设计师论文真题,归纳出十大主题类别,包括架构风格、企业集成、数据技术、非功能属性等。研究发现新兴技术占比最高(18.8%),企业集成、数据架构和非功能属性为三大核心考点。论文命题呈现明显技术演进特征,从经典架构理论逐步转向云原生、AI融合等前沿方向。备考建议重点关注高频考点和技术前沿,同时强化场景化解决方案能力。分析表明,架构师考试持续跟踪行业技术发展,注重理论与实践结合,为考生提供了明确的备考方向。

一几文的编程学习笔记。 2058
上一篇: 小甲鱼PE详解之区块表(节表)和区块(节)(PE详解04)
下一篇: 小甲鱼PE详解之区块描述、对齐值以及RVA详解(PE详解06)
M-先生
博客等级 码龄17年 60粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值