Ghidra使用之Options页面功能介绍

news2025/1/21 1:00:16

14b739dcb76989697c505b6694d8df6b.jpeg

==Apply Processor Defined Lables==

在Ghidra中,apply processor defined labels功能可以为汇编代码中的地址和数据自动添加注释,这可以大大提高反汇编代码的可读性。

使用步骤如下:

  1. 打开您要反汇编的文件,进入Code Browser窗口。

  2. 点击Edit菜单,选择Apply Processor Defined Labels。

  3. 在弹出窗口中,选择要应用的处理器类型,比如ARM或Intel x86。选中“Apply to data at defined data labels”选项。

  4. 点击OK按钮,Ghidra将为汇编代码中的相关地址和数据自动添加注释。

  5. 这时你会看到类似如下的代码注释:

ARM: 0x1000: ldr r0, [pc, #0xc] ; 0x1014 @Load address of _start

ARM: 0x1004: blx r0 ; Branch to _start ARM: 0x1008: .word _start ; 0x1000 @Pointer to _start

Ghidra通过分析处理器规范,得到了各种地址和数据的值对应的语义注释,并为汇编代码添加上这些注释,极大提高了可读性。

这是一个Ghidra非常有用的功能,可以让反汇编变得更简单高效。但是,它的前提是您要选择与目标文件相匹配的处理器类型,否则无法正确分析并添加注释。

==Anchor Processor Defined Lables==

Anchor Processor Defined Labels是一个类似的功能,但它可以让您手动设置要添加注释的地址。

使用步骤如下:

  1. 定位您要添加注释的指令地址,右键选择Set Anchor Here。

  2. 点击Edit菜单,选择Apply Processor Defined Labels。

  3. 与前面介绍的功能相同,选择处理器类型和要应用到的数据,然后点击OK。

  4. 这时,Ghidra只会为设置过Anchor的地址添加注释,而不会自动分析整个文件。

  5. 设置Anchor可以让您有更精确的控制,只为感兴趣的特定地址添加注释。

举个例子,如果您的文件中有一小段特定的代码您感兴趣,那么可以只为这段代码设置Anchor,Apply Processor Defined Labels时只会为Anchor中的地址添加注释,而忽略文件中的其他地址。

这给了您更高的灵活性,可以根据需要选择只为特定地方添加注释,而不必注释整个文件。

与自动分析相比,手动设置Anchor所需要的处理器知识也更少,您只需要确定感兴趣的指令地址,并选中正确的处理器类型,Ghidra即可自动为该地址添加语义注释。

Anchor Processor Defined Labels功能让Ghidra的注释功能更加高效和可控,用户可以根据具体需要添加注释,而无需完全依赖Ghidra的自动分析。这在一定程度上降低了用户对各种指令格式的依赖,更加灵活方便。

两者的区别:

Anchor Processor Defined Labels和Apply Processor Defined Labels的主要区别在于:

Anchor Processor Defined Labels:

  1. 需要用户手动设置感兴趣的指令地址(Anchor),然后才可以添加注释。

  2. 只会为设置过Anchor的地址添加注释,忽略文件中其他地址。

  3. 用户控制更精细,可以有选择性地只为特定地址添加注释。

  4. 对处理器知识的依赖较少,用户只需要确定正确的处理器类型。

Apply Processor Defined Labels:

  1. 会自动分析整个文件,为所有的指令地址和数据添加注释。

  2. 需要正确选择与目标文件相匹配的处理器类型,否则无法正确分析和添加注释。

  3. 需要对相应的处理器指令格式和规范有一定了解,才能判断分析结果是否正确。

  4. 适用于需要完全理解反汇编代码的情况,需要为所有的地址添加注释。

所以,两者的选择依据如下:

  1. 如果您需要完全理解反汇编代码,选择Apply Processor Defined Labels。但需要对处理器知识有一定了解。

  2. 如果您只需要理解文件的某一小段代码,选择Anchor Processor Defined Labels。这需要更少的处理器知识,更加简单和可控。

  3. 如果文件很大,但您只关注其中一小部分,推荐选择Anchor Processor Defined Labels,可以避免为整个文件添加大量无用注释。

  4. 如果您不确定正确的处理器类型,Anchor Processor Defined Labels也是一个更安全的选择,它只依赖您正确设置Anchor所在的地址。

  5. 两者也可以结合使用,针对不同的需求选择不同的功能。

==Create Export Symbol File==

该功能可以将反汇编代码中的函数和变量导出为符号文件。该符号文件包含了所有函数和变量的名称、地址以及相关信息。

导出符号文件有以下主要用途:

  1. 与其他工具共享符号信息。许多调试器、IDA等工具都支持导入符号文件,以显示函数和变量的名称,而不仅仅是地址。

  2. 方便其他人理解你的反汇编代码。通过导入符号文件,其他研究人员可以直接看到函数和变量的名称,更好理解代码逻辑。

  3. 方便自己重新审查文件。有的时候你可能需要在很长时间之后重新审查一个文件,导入符号文件可以立刻恢复对各个函数和变量名称的记忆,无需全部重新命名。

  4. 进行差分分析。如果有多个相似的文件,通过分别为每个文件创建符号文件,然后对比两个符号文件,可以快速找到两者之间的不同之处。

使用步骤如下:

  1. 反汇编并命名好您要导出的文件中的所有函数和变量。

  2. 点击File菜单,选择Create Export Symbol File。

  3. 设置符号文件相关选项,比如要包含的数据类型、函数和变量等。选中“Create mapping file”可以额外创建一个TMAP文件以映射符号地址。

  4. 点击OK,Ghidra会生成两个文件:yourfile.sym作为符号文件,yourfile.tmap作为地址映射文件。

  5. 这两个文件即包含了您反汇编文件中的所有符号信息,可以导入到其他工具或文件中使用。

导出符号信息是逆向工程中的一个重要步骤,可以saying方便各种后续工作的进行。Ghidra提供了简单方便的功能来导出并共享符号信息,这在团队合作等情况下尤为有用。

==Load External Libraries==

在Ghidra中,Load External Libraries功能可以导入外部库文件,以提供更丰富的反汇编信息。导入外部库的主要作用有:

  1. 提供库函数名和参数信息。有了库文件,Ghidra可以显示调用库函数的函数名和参数,而不仅仅是地址,这极大提高了可读性。

  2. 识别库调用。有了库信息,Ghidra可以正确识别文件中调用的库函数,而不会将其误认为数据或其他指令。

  3. 帮助数据类型推断。库文件包含了函数的参数和返回值类型信息,这可以帮助Ghidra推断数据类型,为变量和参数选择正确的类型。

  4. 理解文件依赖。通过查看文件调用了什么库函数,可以理解程序需要依赖什么库来编译和运行。

使用步骤如下:

  1. 获得要导入的外部库文件。格式可以是Ghidra支持的库文件格式,比如CodeView等。

  2. 点击File菜单,选择Load External Libraries。

  3. 点击“Add File”按钮,选择库文件并打开。可以添加多个库文件。

  4. 设置好库文件的相关选项,比如处理器类型等。然后点击“OK”按钮。

  5. Ghidra会加载指定的库文件,并在Background Tasks窗口显示导入进度。

  6. 导入成功后,文件中调用库函数的地方将显示函数名和参数,相应数据类型也会被推断。

  7. 可以在Defined Functions和Defined Data Types窗口查看导入的库信息。加载外部库是一个提高Ghidra反汇编效果的重要手段。但是,它也依赖获得正确的库文件,并选择与目标文件匹配的处理器类型和设置。所以,用户仍需要具备一定的逆向知识,才能充分利用这个功能。

==Perform Symbol Relocations==

该功能可以重新定位反汇编代码中的符号(函数和变量)地址。

重新定位符号地址的主要作用有:

  1. 修复误识别的函数和变量。有时候Ghidra在自动分析文件时可能会误识别一些数据为函数或变量,这会导致它们的地址不正确。重新定位可以修复这些误识别的符号。

  2. 处理反汇编后地址变化的情况。比如,您修改了一些代码后重新编译,地址就可能会发生变化。这时需要重新定位符号以更新地址。

  3. 使符号地址与其他工具的结果匹配。有时候您可能会使用多个工具分析同一个文件,此时重新定位可以使Ghidra的符号地址与其他工具的结果一致。

  4. 重命名已有符号。重新定位时您可以选择为某个现有符号输入一个新的名称,这就实现了符号的重命名功能。

使用步骤如下:

  1. 定位您要重新定位的符号,右键选择Relocate Symbol。

  2. 在弹出窗口中,可以为该符号输入新的名称和地址。地址可以选择相对于image base或文件开始的绝对地址。

  3. 设置好相关选项后点击“OK”按钮,该符号的地址和名称将被更新。

  4. 继续以上的步骤重新定位其他符号。您也可以选择多个符号一起重新定位。

  5. 重新定位完成后,检查代码中相关调用和引用的地址都已正确更新。

重新定位功能给用户提供了更高的控制权,可以根据需要手动修改和修复符号信息。但同时也增加了用户工作量,需要手动逐个检查符号并更新信息。

所以,一个好的工作流程是:首先尽量利用Ghidra的自动分析功能生成符号信息;然后通过手动审查和对比其他工具的结果,检查自动分析的结果,并仅针对必要的符号进行手动重新定位,这可以最大限度利用Ghidra的功能,同时也保证符号信息的准确性。

==Import Non-Loaded Data==

该功能可以导入当前文件中未加载的数据段。

导入未加载数据段的主要作用有:

  1. 完整显示文件的所有数据段。有时候Ghidra在加载文件时可能无法自动解析某些数据段,无法将其加载入内存。导入可以手动加载这些未解析的数据段。

  2. 分析文件中其他工具无法加载的数据。某些保护机制可能会导致其他工具无法完整加载文件的数据,但Ghidra的导入功能可以绕过这些保护加载全部数据。

  3. 处理文件扩展或 Truncation 的情况。如果文件大小发生变化,那么默认加载的大小也会变化。导入功能可以加载新增的数据或忽略删除的数据。

  4. 自定义数据段加载方式。通过选择不同的加载选项,用户可以自定义数据段的加载方式,而不局限于Ghidra的默认自动解析。

使用步骤如下:

  1. 利用Ghidra的各种数据查看功能,查找文件中当前未加载的数据段。通常显示为红色或深灰色背景。

  2. 定位要导入的数据段,右键选择Import Non-Loaded Data。

  3. 在弹出窗口中,设置数据段的名称、大小、加载地址等选项。

  4. 选择数据段的加载方式,可以选择加载为byte数组、字符数组等不同格式。

  5. 设置好相关选项后点击“OK”按钮,该数据段将被加载入内存,并在Listing窗口中显示。

  6. 继续以上的步骤导入其他未加载数据段。

  7. 导入完成后,利用各种分析工具查看并理解已经导入的数据内容。

导入未加载数据功能使Ghidra的加载不再局限于它的自动解析,用户可以更加灵活地控制文件数据的加载方式。但是,它也增加了用户手动分析和选择数据格式的工作量。

所以,一个好的工作流程是:首先利用自动解析功能加载尽可能多的数据;然后通过手动分析 located 未加载的数据段,仅针对必要和无法自动解析的数据进行手动导入。这可以最大限度减少人工工作,同时也使最终的文件加载结果更加准确全面。

==Fixedup Unresolved External Symbols==

该功能可以修复文件中未解析的外部符号。

未解析的外部符号通常出现在以下情况:

  1. 文件调用了未加载的外部库函数。如果未导入相关外部库,调用该库的函数则无法解析。

  2. 文件引用了其他文件的函数或变量,但未加载该文件。跨文件调用导致的未解析符号。

  3. 编译器优化或保护机制导致某些符号在文件中未显式出现。这时Ghidra无法自动解析这些符号。

修复未解析符号的主要作用有:

  1. 恢复文件正常的调用关系和逻辑。有了符号,调用和引用关系才能被正确理解。

  2. 显示函数和变量的真实名称,提高代码可读性。

  3. 帮助数据类型推断。有了函数和变量的类型信息,可以为相关参数和变量推断正确类型。

  4. 理解文件编译环境和选项。某些优化方案和保护机制会产生未解析符号,分析这些符号可以帮助理解编译过程。

使用步骤如下:

  1. 定位文件中显示为红色的未解析外部符号,比如外部函数调用等。

  2. 右键选择该符号,选择Fixedup Unresolved External Symbols。

  3. 在弹出窗口中,为该符号输入正确的名称、地址和类型信息。

  4. 设置好相关选项后点击“OK”按钮,该符号将被解析,并在文件中正确显示名称和类型。

  5. 继续以上的步骤修复其他未解析符号。您也可以选择多个符号一起修复。

  6. 修复完成后,检查代码中相关调用和引用已全部解析正确。

修复未解析符号功能增加了用户手动解析和命名的工作量。但是,这也给用户更高的控制权,可以根据具体文件情况和经验为符号选择最合适的信息。

一个好的工作流程是:首先尽量通过加载外部库等方式自动解析尽可能多的符号;然后手动fix剩余未解析且关键的符号。这可以避免过多人工工作,同时也使最终结果达到满意的精度。

行数:248

字数:3992

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/434565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql不同服务器跨库查询解决方案

项目场景: Mysql在不同服务器实现跨库查询,类似dblink。 解决方案: 在两台不同服务器,实现跨库查询,其实现原理类似一个虚拟映射,需要用到mysql的另一个存储引擎Federated,FEDERATED存储引擎访问在远程数据…

另一个世界的人

休假 赶在假期无效前,休了个长假回了趟老家。不仅是为了逃离工作的繁忙,也为了看望老家的婆婆爷爷。回趟老家对于我们这种社会人来说确实太难了,如果只是周末回去也就休息一天就得往回赶,太累。自己的假期本来就不多,如…

如何对HDFS进行节点内(磁盘间)数据平衡

当HDFS的DataNode节点挂载多个磁盘时,往往会出现两种数据不均衡的情况: 1.不同DataNode节点间数据不均衡; 2.挂载数据盘的磁盘间数据不均衡。 特别是这种情况:当DataNode原来是挂载了几个数据盘,当磁盘占用率很高之…

7.1 参数的点估计

小结: 点估计是一种统计推断方法,它用于通过样本数据估计总体参数的值。在统计学中,总体是指一个包含所有个体的集合,而样本是从总体中选出的一部分个体。总体参数是总体的某种特征,如平均值、标准差、比例等。 点估…

全志V851s、V853内g2d模块sample深究

1. g2d 模块概述 g2d 主要功能: 1)旋转:支持90、180、270旋转; 2)镜像反转:H / V; 3) scale:放缩 4)格式转换:yuv 转 rgb 等,多种格式相互间转换&#xff1b…

python学习——缺失值、重复值处理、排序及替换

文章目录 1 缺失值处理1.1 查看缺失值 df.isnull()1.2 统计缺失值 df.isnull().sum()1.3 删除缺失值 df.drop()1.4 填充缺失值 df.fillna()1.4.1 固定值填充 df.fillna(value)1.4.2 线性插值填充 df.fillna(df.interpolate()) 2 重复值处理2.1 查看重复值 df.duplicated()2.2 筛…

最佳实践:Android应用中的网络请求和数据缓存

最佳实践:Android应用中的网络请求和数据缓存 网络请求在Android应用中的重要性 在现代移动应用中,网络请求扮演着重要的角色,涉及到数据的获取、上传、更新等功能。网络请求在Android应用中具有关键地位,对于提供优秀的用户体验和…

如何使用山海鲸可视化绘制堆叠双轴图?

简介 堆叠双轴图是一种数据可视化图表类型,它结合了堆叠柱状图和双轴图的特点,将两个或更多个数据系列以不同的颜色或图案堆叠在一起,同时使用两个垂直轴来表示不同的数据范围,以显示它们之间的关系和趋势。其中一个轴通常代表数…

一个实例讲解如何使用BP神经网络(附代码)

本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com BP神经网络是一个广泛应用的模型, 本文以一个实例作为主线,面向初学者讲解如何构建和使用一个BP神经网络 帮助没接触进BP神经网络的初学者,快速上手BP神经网络…

传统机器学习(四)聚类算法DBSCAN

传统机器学习(四)聚类算法DBSCAN 1.1 算法概述 DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。 该算法将具有足够密度的区域划分为簇,并在…

【C++学习】类和对象--对象特性(2)

静态成员 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员。 静态成员变量: 所有对象共享同一份数据 在编译阶段分配内存 类内声明,类外初始化 静态成员函数: 所有对象共享同一个函数 静态成员函数只能访问静态…

MyBatis小技巧

一、MyBatis中接口代理机制及使用 我们不难发现,以前编写dao/mapper实现类中的方法代码很固定,基本上就是一行代码,通过SqlSession对象调用insert、delete、update、select等方法,这个类中的方法没有任何业务逻辑,既然…

【Cadence】 ADS Dynamic Link使用教程

ADS Dynamic Link使用教程 1.新建一个Cadence Schematic2.打开ADS3.在ADS新建Schematic4.加入控件OPTIONS5.加入Netlist6.仿真测试7.写在最后 1.新建一个Cadence Schematic 随便搭了一个Cascode 注意这个时候不要新建symbol 2.打开ADS 3.在ADS新建Schematic 选择对应的Cade…

BI技巧丨计算组环形图

当我们使用Power BI时,会发现其内置了许多可视化组件,这些组件可以帮我们快速地创建各种类型的报表和仪表板,这是非常方便的。但是,我们也会发现,有些组件的细节功能并不是很完善,这就导致了我们在平常使用…

解决 mapper.xml 文件的 resultType 爆红问题:Cannot resolve symbol ‘xxx‘

解决mapper.xml文件的resultType爆红问题:Cannot resolve symbol xxx 1.问题描述2.问题分析3.问题解决3.1 配置注解(推荐)3.2 配置全类名3.3 删除插件 4.事件感悟 系统:Win10 JDK:1.8.0_333 IDEA:2022.2.4 …

【C++】Qt环境下的五子棋小程序

实现要求 这个程序是一个基于Qt的五子棋游戏,实现了人机对战和双人对战两种游戏模式,提供了基本的棋谱记录和游戏音效功能。程序采用了MVC模式,将数据与界面分离,实现了代码的模块化和可扩展性。主要构建包括三个文件&#xff0c…

Java - 数据结构,哈希表

一、概念 顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( ),搜索的效率取决于搜…

Ambari【部署 01】最新版本ambari-2.7.7下载编译打包安装使用(踩坑实录)

Ambari 官网 本次安装的为当前最新版本 2.7.7 文档 。 1.环境及准备 1.1 环境 # 系统 [roottcloud ~]# cat /etc/centos-release CentOS Linux release 7.9.2009 (Core) # JDK [roottcloud ~]# java -version java version "1.8.0_241" Java(TM) SE Runtime Envir…

java模板/策略模式打怪兽

模板&策略模式 实现姿势 我们会从简单到复杂,讲解代码正确的实现姿势,分别为最 Low 方式、常规方式、模板模式和策略模式。 最 Low 方式 假如现在有 3 个奥特曼,都喜欢 “训练,飞翔,打怪兽” public class OldTig…

jsp+java自行车租赁租借和买卖系统

自行车租借和买卖系统 系统包括四个模块。1,系统模块,2,车辆管理模块,3.租借车管理模块,4,买卖车管理模块。 1,系统模块包括: 连接数据库,工作人员登录,退出。 2&#…