GDB 问题:无法在 Obj-C 方法上设置断点

逆向工程 工具 数据库 操作系统
2021-06-19 09:08:45

我是逆向工程的初学者,我已经阅读了一些教程,并且了解了一些基本的 GDB 和汇编代码。在完成了一些琐碎的例子之后,我想尝试一些更“现实世界”的东西。我的目标是对 Introversion Software / Ambrosia Software 的游戏“Uplink”进行逆向工程和“破解”。

请注意,我只是为了挑战而这样做,如果我只是想免费玩游戏,我会找到破解,而不是制作破解。该演示可在http://www.ambrosiasw.com/games/uplink/上免费获得

现在,我使用 Hopper 和 class-dump 工具通过静态分析学到了一些重要的东西。很快就清楚注册相关的函数存在于 中ASWRegistration.framework,但在尝试了一些静态分析后,无济于事,我决定最好将 GDB 放在它上面。加载它,尝试在其中一个看起来很有趣的函数上设置断点。

(gdb) b +[ASWRegistration isRegistered:]
Function "+[ASWRegistration isRegistered:]" not defined.
Make breakpoint pending on future shared library load? (y or [n]) n

唉,真烦人。让我们试试别的。

(gdb) b isRegistered
Function "isRegistered" not defined.
Make breakpoint pending on future shared library load? (y or [n]) n

嗯,也许我做错了什么......

(gdb) b isRegistered:
No symbol table is loaded.  Use the "file" command.
Make breakpoint pending on future shared library load? (y or [n]) n
(gdb)

好吧,这给了我一个不同的错误消息,但它仍然无法正常工作......

经过进一步检查,我发现我什至无法正确地中断可执行文件本身内部的函数。

(gdb) b applicationDidFinishLaunching:
[0] cancel
[1] all

Non-debugging symbols:
[2]    -[SUStatusChecker applicationDidFinishLaunching:]
[3]    -[SUUpdater applicationDidFinishLaunching:]
> 0
canceled

两个可能的applicationDidFinishLaunchings,没有一个来自实际游戏(我怀疑它们来自 Sparkle.framework)。看起来好像 Ambrosia 很聪明并且剥离了所有调试符号,但是 class-dump 给了我完整的标题,nm 给了我一堆符号,而 Hopper 找到了各种方法。所以我不明白为什么 GDB 不能使用它。再说一次,我是这一切的初学者,也许我在做一些明显错误的事情。我也用 Mac App Store 游戏“Hack RUN Free”尝试了同样的事情,但得到了同样的No symbol table is loaded. Use the "file" command错误。当然,file 命令根本没有帮助。

有谁知道如何解决这个问题?我想在这方面超越纯粹的理论水平?

1个回答

Objective-C 的工作方式与大多数语言略有不同。您在_ObjC用作参数部分中有选择器obj_msgSend(这就是调用几乎所有内容的方式)。函数之间没有直接调用。我建议从 REcon 2008 中关于这个主题的 Cameron Hotchkies幻灯片开始。