问题标签 [ghidra]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
303 浏览

python - 如何在 Ghidra Python preScript 中设置 HeadlessContinuationOption

我正在从命令行以无头模式运行 Ghidra python 脚本,将我的脚本指定为 preScript。
例如./analyzeHeadless project_path project_name -preScript pre.py -import my_exec_file

我想在该脚本中设置 HeadlessContinuationOption。

Java preScript 中的等价物将是:

然而,在 python 中,没有从 HeadlessScript 继承的类(并且setHeadlessContinuationOption在该抽象类的实例方法中)。我只是在全局范围内编写脚本。

我试图创建一个类似于 Java 脚本编写方式的类,但没有实例化它。我也尝试实例化它并调用run自己并调用setHeadlessContinuationOption该实例run,但它没有达到预期的效果(中止选项被忽略并继续导入 exec 文件)。
这是这段代码(不起作用)

那么如何setHeadlessContinuationOption(HeadlessContinuationOption.ABORT)在 python preScript 中设置呢?

谢谢。

0 投票
0 回答
1133 浏览

c - 为什么 Ghidra 将内存地址附加到显示的字符串而不是变量?

这是我第一次使用 Ghidra 和调试。我的项目涉及从 2007 年开始对 Dos 可执行文件进行逆向工程,以了解它如何生成代码。

我查找了通过 wine 启动程序时可以读取的字符串(在 linux 下调试)并找到了一个地方:

DISPLAY_MESSAGE

我将函数命名为“DISPLAY_MESSAGE”,因为我在屏幕上看到了字符串;-)。我想命名它,printf但它的签名与 of 不匹配,printf因为它采用byte *而不是char *, ...作为输入参数并返回一个int而不是void实际的printf.

字符串“Code = %s”(去除 CR 和新行)实际上位于地址“0040704c”,我很惊讶没有看到保存生成代码值的变量(这可以帮助我重命名变量) .

如果我将签名更改为其中之一,printf则会产生:

看起来更好,因为local_8可能是代码,但我不知道这样更改签名是否正确(从那时起我重命名的局部变量errorCode从未使用过,而它在签名更改之前返回)。

所以我的问题是:

  1. 为什么 Ghidra 会附加_0040704c到字符串(它应该对我有帮助吗,我应该如何利用这条信息)?
  2. 如果我的签名更改是正确的,是什么阻止 Ghidra 从其分析中找到正确的签名?
  3. 每当我看到函数签名undefinedX出现在 中时,我是否应该认为它存在问题DISPLAY_MESSAGE

非常感谢任何帮助!

0 投票
1 回答
1971 浏览

x86-64 - ghidra:如何使用 ghidra python api 获取静态变量?

我有以下 c 代码(来自基准测试):

我正在使用 ghidra api 从二进制文件中获取一些信息(使用 flag 预编译-g)。我想获取函数(或全局)中定义的变量。

给了我在函数中定义的变量,但它没有检测到buf,因为它被定义为static. 从 ghidra gui 我可以看到变量是在命名空间下的“main”中定义的。

有没有办法获得这些类型的变量(或一般的全局变量)?

0 投票
0 回答
261 浏览

reverse-engineering - 为什么在反编译的 EXE 中字符串有意义但没有用处?

我是一个带有 的游戏的可执行文件Ghidra,我搜索了strings. 我在.rdata部分发现了很多字符串,有可读的含义,但是如果我查找"references to this address",没有结果。binary如果它们没有用途,为什么它们会包含在 中?有没有可能,它们是在运行时使用的?下图,加深理解:

Ghidra 向我们展示了没有使用的字符串

我发现了很多这样的字符串。我非常了解这个游戏,而且我从未在游戏中看到过这样的字符串。

0 投票
1 回答
293 浏览

configuration - 如何删除 Ghidra 反汇编列表显示中的省略号 (...)?

Ghidra 经常用省略号 (...) 截断反汇编列表显示中的内容,如下图所示的几个示例...

带省略号的例子 在此处输入图像描述 在此处输入图像描述

我的问题是:我怎样才能让 Ghidra 停止这样做?我已经查看了广泛的配置选项,但我无法弄清楚。

0 投票
0 回答
2082 浏览

disassembly - 如何使用 Cutter 或 Radare2 比较两个 EXE 文件、找出差异并反编译它们?

经过几天的努力,我想问问社区:)

我有两个exe文件。两者大小相同且相当大(约 80MB)。

  • 第一个exe是原文件,前段时间编译过。我也有相应的PDB文件。
  • 第二个文件与第一个文件几乎相同,但已在多个位置进行了二进制修补。

我设法用 Cutter (Radare2 GUI) 反编译了文件,但考虑到文件大小,几乎不可能通过每一种方法。

使用十六进制编辑器(Hex Fiend),我设法获得了应用补丁的每个偏移位置。现在我正在尝试使用 Cutter 找到这些偏移量来反编译这些位置。

问题是:如何?当我在 Cutter 中打开 Hexdump 时,似乎一切都没有到位,我可能需要一个偏移量。在 Cutter 的加载屏幕上设置偏移量似乎没有任何作用。我用错了吗?

例子:

妖魔

刀具

474942 是 0x73F3E,但这与 0x0060713E 相差甚远

也许我需要其他工具?任何帮助表示赞赏!

0 投票
0 回答
576 浏览

assembly - 向已编译的 x86 exe 添加指令

我们在工作中使用一个应用程序,它的维护早已被放弃,但我们仍然需要维护。在这种情况下,这意味着对程序进行逆向工程。我已经使用 ghidra 对程序进行了反编译,并找到了我要添加的代码行以及添加位置。

原指令如下:

就在上面,我想补充一下:

Ghidra 不会让我这样做,所以我使用的是原始的十六进制代码编辑器。问题是仅仅在 之前插入字节是8d 7e 50行不通的,因为它与LEA创建无效代码的指令相混淆。我认为我需要将新代码放置在新的偏移量处,但我对hex/assembly代码了解得不够多,不知道该怎么做。

0 投票
1 回答
108 浏览

reverse-engineering - 使用 Ghridra 反汇编 bin 文件

我有一个问题。我有一个要反汇编的 bin 文件。处理器是 Intel Atom® x5-Z8350。我正在使用 Ghidra,但我不确定在反汇编时应该选择哪种语言。任何可以让我在这方面走得更远的专家。

如果有任何问题请告诉我,我会尽我所能回答他们:)

0 投票
1 回答
443 浏览

assembly - 从反编译的 ASM 中获取信息

我愿意在一个小 3D 游戏上修改相机坐标。我已经能够找到三个功能,每个轴一个。我们称它们为 CameraX、CameraY 和 CameraZ。当我发现我遗漏了一些东西时,我一直只使用第一个。

以下是从 Ghidra 获得的 ASM 说明:

我知道:
- 我的可执行文件是 32 位的,用 Delphi 制作的。
- x 是新的 x 轴值。

我的目标是将此函数与注入的 dll 一起使用。我来到这个:

但没办法,我在线上遇到了“访问冲突” 004789fb FSTP dword ptr [DAT_00871218]。这是第一次使用 x 值。所以我猜这是错误的类型。

这是我的理解:
- 由于原始程序是用 Delphi 编写的,所以想到了 __pascal 调用约定。由于它在 Visual Studio 中已被弃用,因此我正在使用 __stdcall。我假设,因为只有一个论点*,所以不会有任何区别。
- x 总是一个很大的数字。如果不是 32 位,我会选择很长的。
- 我真的不知道返回类型。我选择 int 是因为调用者函数在test al, al调用之后会生成一个。

* : Ghidra 告诉我只有一个论点,但如果我在听自己的话,就会有 2 个:

所以这是我的问题:
- 真的只有一个论点吗?
- 如果正确的调用约定是 __pascal,我应该使用哪种调用约定,因为它不适用于 Visual Studio?(如果有多个参数)
- 检索返回值的方法是什么?
- 为什么我们“发明”了这么多调用约定?例如,为什么我们不都使用 __cdecl?为什么有些人使用从右到左,而有些人从左到右阅读?有什么区别吗?

我很确定缺少一些信息,Ghidra 生成的伪代码有用吗?

编辑 :

编辑 2:

这是完整的 ASM 代码: https ://pastebin.com/UiGGEju1,这是 Ghidra 生成的伪代码: https ://pastebin.com/1Fc48k1g

所以我想我错了:这不是我认为导致这个问题的线,而是这个:00478c3d 89 46 1c MOV dword ptr [ESI + 0x1c],x 但它仍然是我的 x 值导致它。

我不明白的是“为什么”:x 是一个 int(32 位),程序试图将它作为 dword(32 位)存储在 [ESI + 0x1c] 中。程序是否有可能无法解析 x 在哪里/是什么?(就像我在没有参数的情况下调用函数一样)

顺便问一下这个问题:“-为什么我们“发明”了这么多调用约定?例如,为什么我们不都使用__cdecl?为什么有些人使用从右到左,而有些人从左到右阅读?有没有差异?” 还没有回答,真的很吸引我,如果你有解释,我很乐意听!

0 投票
1 回答
471 浏览

arm - 反向后的addr指令是什么

我使用 ghidra armv7 反向固件。

分析到地址0x0002843a看起来像 r0 加载地址 0x0002881c 的数据,地址0x0002881c addr 看起来像一条指令。

我阅读了 ARM®v7-M ArchitectureReference Manual 并没有看到 addr 指令。

我不明白 addr 是什么意思,请帮助我。