lldb“无法解决私有Objective-C类中的断点”?

时间:2017-10-03 16:00:00

标签: objective-c macos reverse-engineering lldb

作为lldb练习,我试图在Apple的macOS TextEdit.app中附加 lldb 并设置符号断点。我可以在Foundation类中设置断点。但在私人课程中,似乎我总是得到无法解决任何实际位置的断点。为什么?

我理解已发布的可执行文件已被删除,但我也理解Objective-C符号名称无法删除,并且已阅读了几篇解释如何“破解”应用程序的旧文章,看起来它对他们有效,尽管如此GDB。当我在TextEdit可执行文件上运行otool -ov时,会显示所有私有符号及其地址。

示例

了解它如何很好地适用于Foundation类:

(lldb) breakpoint set -F "-[NSString initWithFormat:]"
Breakpoint 1: where = Foundation`-[NSString initWithFormat:], address = 0x00007fff2c0c29d0
(lldb) breakpoint set -r '\[NSString .*\]$'
Breakpoint 2: 139 locations.

但是当我在私有Document类中尝试相同时,或者在我使用Steve Nygard的class-dump找到的方法中失败时,它失败了:

(lldb) breakpoint set -F "-[Document validateMenuItem:]"
Breakpoint 3: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.
(lldb) breakpoint set -r '\[Document .*\]$'
Breakpoint 4: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.

1 个答案:

答案 0 :(得分:1)

目前,lldb仅使用ObjC运行时数据为方法在表达式解析器中调用时提供类型信息。它不会将其中找到的方法折叠到符号表中以进行断点查找。