2

我正在尝试在 ghidra 中进行破解。我已经能够找到答案,但我想知道当我使用调试器并查看字符串时,我将如何“正确”完成此操作。在下图中,您可以清楚地看到有很多 thunk 函数,但老实说,它们看起来就像 printf 的。我不知道如何修复它,所以我可以获得实际可读的函数名称,或者如果没有办法。

我认为这可能与我在尝试分析文件时遇到的错误有关,而我收到有关 PDB 文件的错误。我尝试重新编译 msdia140.dll,因为我使用的是 Visual Studio 2019,但尝试编译时却出现了构建错误。

TL;DR 我如何做到这一点,以便下面的图像不包含 thunk 函数,并且实际上以某种方式可读,因为它们看起来像 printf 函数。

吉德拉桑克斯

当我尝试编译新的 PDA 时会发生什么

4

1 回答 1

4

我认为这可能与我尝试分析文件时遇到的错误有关,而我收到有关 PDB 文件的错误

我假设错误消息是“无法找到具有匹配 GUID [...] 的 PDB 文件“[...]”。如果是这样,这是因为您没有当前正在逆向工程的程序的 PDB 文件(包含调试信息的文件)。这是正常的,以防万一我会说。

TL;DR 我如何做到这一点,以便下面的图像不包含 thunk 函数,并且实际上以某种方式可读,因为它们看起来像 printf 函数。

这就是你作为逆向工程师需要做的实际工作:开始了解这些函数的作用并设置名称(和数据类型)。

除了在 MSIL 或 Java 等情况下,编译后的二进制文件中存在大量元数据,Ghidra 无法自动确定函数名称。对于变量来说,更糟糕的说法是:在许多体系结构中,机器代码中甚至没有变量的概念。

Ghidra 有一些启发式方法可以帮助您进行手动过程:当它作为前缀时thunk_,例如,这意味着有问题的函数被评估为简单地将控制权传递给另一个目标函数。或者对 API 函数的调用system已经正确命名。

好消息是您已经开始了一些工作:基于函数参数或基于您的动态分析,您已经猜到thunk_FUN_00d83950可能是printf. 因此,右键单击要重命名的函数,然后单击“重命名函数”。还要确保注意菜单中列出的热键 - 你会非常需要它。

其他功能将需要额外的分析工作:双击它们并尝试弄清楚它们的作用。或者 - 正如您之前所做的那样,这是一种非常强大的技术 - 将您的静态逆向工程工作与动态分析相结合。

更正一些函数名称后,您可能还想更改它们的类型。再次右键单击它,选择“编辑函数签名”,然后在出现的窗口中进行调整。如果printf具有可变参数,则可能需要选择右侧的“可变参数”。

于 2020-08-11T06:41:07.423 回答