我是逆向工程的初学者,我通读了一些教程,并且了解一些基本的GDB和汇编代码。在通过一些琐碎的示例工作之后,我想尝试一些“现实世界”。我的目标是反向工程和“破解” Introversion Software / Ambrosia Software的游戏“ Uplink”。

请注意,如果我只是想免费玩游戏,我只是为迎接挑战而这样做。我会发现一个裂缝,而不是一个。该演示可从http://www.ambrosiasw.com/games/uplink/免费获得。

现在,我已经通过使用Hopper和class-倾倒。很快就知道与注册相关的功能存在于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)


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

有人知道如何解决此问题吗?我想超越纯粹的理论水平吗?

评论

您是否尝试过使用信息功能来显示可执行文件中的所有功能符号?料斗似乎有另一种(更有效的)方法来提取符号表。这可能是GDB的限制。

另外,请注意,GDB可能会破坏可执行文件中的任何位置。您只需要使用以下之一:b * 0xdeadbeef或b * myfunction。

实际上,GDB找不到ASWRegistration函数的符号。不幸的是,我不知道如何手动计算共享库的偏移量。其他用于OS X的调试器可以执行此操作吗?

并且,在尝试objdump -x(查看导出表)时是否找到了这个符号?

@perror据我所知。如果您有兴趣,可以在这里找到objdump的输出。我知道可以弄清楚这些符号,因为Hopper和IDA的演示版都可以做到这一点。我已经到了静态分析的地步,虽然我很确定自己在正确的位置,但是我的组装技能还不够好,一旦Hopper不再能够找到方法,我就可以跟踪正在发生的事情为了我。有一些明显的_objc_msgSend调用正在进行,但我不知道如何找到那些指向的实际代码。

#1 楼

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

评论


我知道,我在这里遇到的问题是,我找不到由于obj_msgSend调用而调用的实际代码是什么。这是前一段时间,但是我相信实时调试和otool -ov的组合可以帮助我找到所需的内容。

–SlEePlEs5
14年7月16日在21:20