问题标签 [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.
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 中设置呢?
谢谢。
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
从未使用过,而它在签名更改之前返回)。
所以我的问题是:
- 为什么 Ghidra 会附加
_0040704c
到字符串(它应该对我有帮助吗,我应该如何利用这条信息)? - 如果我的签名更改是正确的,是什么阻止 Ghidra 从其分析中找到正确的签名?
- 每当我看到函数签名
undefinedX
出现在 中时,我是否应该认为它存在问题DISPLAY_MESSAGE
?
非常感谢任何帮助!
x86-64 - ghidra:如何使用 ghidra python api 获取静态变量?
我有以下 c 代码(来自基准测试):
我正在使用 ghidra api 从二进制文件中获取一些信息(使用 flag 预编译-g
)。我想获取函数(或全局)中定义的变量。
给了我在函数中定义的变量,但它没有检测到buf
,因为它被定义为static
. 从 ghidra gui 我可以看到变量是在命名空间下的“main”中定义的。
有没有办法获得这些类型的变量(或一般的全局变量)?
disassembly - 如何使用 Cutter 或 Radare2 比较两个 EXE 文件、找出差异并反编译它们?
经过几天的努力,我想问问社区:)
我有两个exe文件。两者大小相同且相当大(约 80MB)。
- 第一个exe是原文件,前段时间编译过。我也有相应的PDB文件。
- 第二个文件与第一个文件几乎相同,但已在多个位置进行了二进制修补。
我设法用 Cutter (Radare2 GUI) 反编译了文件,但考虑到文件大小,几乎不可能通过每一种方法。
使用十六进制编辑器(Hex Fiend),我设法获得了应用补丁的每个偏移位置。现在我正在尝试使用 Cutter 找到这些偏移量来反编译这些位置。
问题是:如何?当我在 Cutter 中打开 Hexdump 时,似乎一切都没有到位,我可能需要一个偏移量。在 Cutter 的加载屏幕上设置偏移量似乎没有任何作用。我用错了吗?
例子:
妖魔
刀具
474942 是 0x73F3E,但这与 0x0060713E 相差甚远
也许我需要其他工具?任何帮助表示赞赏!
assembly - 向已编译的 x86 exe 添加指令
我们在工作中使用一个应用程序,它的维护早已被放弃,但我们仍然需要维护。在这种情况下,这意味着对程序进行逆向工程。我已经使用 ghidra 对程序进行了反编译,并找到了我要添加的代码行以及添加位置。
原指令如下:
就在上面,我想补充一下:
Ghidra 不会让我这样做,所以我使用的是原始的十六进制代码编辑器。问题是仅仅在 之前插入字节是8d 7e 50
行不通的,因为它与LEA
创建无效代码的指令相混淆。我认为我需要将新代码放置在新的偏移量处,但我对hex/assembly
代码了解得不够多,不知道该怎么做。
reverse-engineering - 使用 Ghridra 反汇编 bin 文件
我有一个问题。我有一个要反汇编的 bin 文件。处理器是 Intel Atom® x5-Z8350。我正在使用 Ghidra,但我不确定在反汇编时应该选择哪种语言。任何可以让我在这方面走得更远的专家。
如果有任何问题请告诉我,我会尽我所能回答他们:)
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?为什么有些人使用从右到左,而有些人从左到右阅读?有没有差异?” 还没有回答,真的很吸引我,如果你有解释,我很乐意听!
arm - 反向后的addr指令是什么
我使用 ghidra armv7 反向固件。
分析到地址0x0002843a看起来像 r0 加载地址 0x0002881c 的数据,但地址0x0002881c addr 看起来像一条指令。
我阅读了 ARM®v7-M ArchitectureReference Manual 并没有看到 addr 指令。
我不明白 addr 是什么意思,请帮助我。