我是逆向工程的初学者,我已经阅读了一些教程,并且了解了一些基本的 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
两个可能的applicationDidFinishLaunching
s,没有一个来自实际游戏(我怀疑它们来自 Sparkle.framework)。看起来好像 Ambrosia 很聪明并且剥离了所有调试符号,但是 class-dump 给了我完整的标题,nm 给了我一堆符号,而 Hopper 找到了各种方法。所以我不明白为什么 GDB 不能使用它。再说一次,我是这一切的初学者,也许我在做一些明显错误的事情。我也用 Mac App Store 游戏“Hack RUN Free”尝试了同样的事情,但得到了同样的No symbol table is loaded. Use the "file" command
错误。当然,file 命令根本没有帮助。
有谁知道如何解决这个问题?我想在这方面超越纯粹的理论水平?