反转似乎未加密的 Mac OS X 二进制文件,回溯仅显示 mach_msg_trap ()

逆向工程 数据库 操作系统 男子气概
2021-06-24 17:25:26

目前我有一个正在调查的二进制文件。该应用程序是 GUI/事件驱动的,因此很难设置断点。我想在某个按钮点击时设置一个断点,所以我想我会点击该按钮,然后backtrace在 GDB 中运行 a以查看我点击该按钮时调用了哪些函数,但输出bt只是显示mach_msg_trap(),我想还有其他一些“功能”。有谁知道我为什么在mach_msg_trap() 我假设这是 Apple 实施的一些安全功能以防止人们逆转他们的软件,我只是想我会问,因为我的 googlefu 并没有真正返回任何有形的结果。

GDB 输出的屏幕截图

2个回答

好吧,我的 Mac fu 不是太强,但我有 Mac 的终端访问权限,并将给它一个疯狂的机会,希望为您提供继续所需的洞察力。

info sharedlibraryGDB 提示符会告诉您有关这些函数所在的共享库范围的详细信息。但是我们已经从函数名称中知道了这一点。

NSApplication 来自:可可。

NSApplication对象维护NSWindow应用程序使用的所有对象的列表,因此它可以检索应用程序的任何 NSView对象。

所以我的建议是从启动应用程序开始

gdb --args /path/to/binary optional arguments for program

然后设置断点:

b NSApplicationMain

.gdbinit显然可以在里面完成

然后让应用程序继续。使用Ctrl+进入它C很可能backtrace与您之前看到的类似,但可能不会达到mach_msg_trap().

然后转到使用具有NSApplication实例引用的函数的一帧bt显然,您可以使用 找到帧号所以说:

f 9

在那里你应该能够使用 GDB 的call. 现在,我的 Objective-C/C++ fu 比我的 Mac fu 还要弱,但是你可以使用

set language

列出可用的语言(这会影响 的语法call)。因此,您可能应该酌情切换到 Objective-C/C++ 替代方案之一。在我的 Mac 上,我有以下语言选项:

(gdb) set language
The currently understood settings are:

local or auto    Automatic setting based on source file
ada              Use the Ada language
c                Use the C language
c++              Use the C++ language
asm              Use the Asm language
minimal          Use the Minimal language
fortran          Use the Fortran language
objective-c      Use the Objective-c language
objective-c++    Use the Objective-c++ language
java             Use the Java language
modula-2         Use the Modula-2 language
pascal           Use the Pascal language
scheme           Use the Scheme language

call允许您在正在运行的程序的上下文中调用函数(并且 GDB 对它知道的符号具有命令行完成功能)。因此调用mainWindow了的NSApplication情况下会出现一个好主意,然后从那里向下搜索。

从那里你应该能够弄清楚你的按钮在哪里起作用并设置断点,不是吗?

基本上,如果您知道框架中某个调用的某个参数引用了您的按钮(我们假设它有一个指针),您可以使用

break location if condition

语法以确保断点只会在按下按钮时触发。另一种方法是ignore忽略断点的 X 次命中并仅在此之后触发命令。

你有应用程序的 md5 吗?

它看起来像一个 GUI/Cocoa 应用程序。代码似乎卡在msgloop. 这个循环通常发生在需要用户交互的应用程序中或应用程序与消息交互时。

图中显示断点已被击中__CFRunLoopRun这意味着应用程序正在运行并处理系统消息,直到遇到断点(在本例中Command+ C)它需要某种用户交互或正在等待某些消息,可能是单击或按键或来自某些系统进程的消息.

如果你有示例 md5 或 SHA,我可以看看它