不用反汇编!LLDB对Objective-C函数下断点的黑科技

嗯书上有我让他去看书然后把后续回复删了。
无论如何,感谢您的输入

1 个赞

我看了下,这个是UIKit给NSObject增加的方法,逆向下这两个方法,可以照着在Mac OS X上写一个…
主要用了class_copyMethodList,class_copyPropertyList这两个函数

-[NSObject(IvarDescription) _methodDescriptionForClass:]
-[NSObject(IvarDescription) _shortMethodDescription]
2 个赞

methods

Dumps all methods inplemented by the NSObject subclass (iOS, NSObject subclass only)

(lldb) methods UIView
command regex methods ‘s/(.+)/expression -lobjc -O – [%1 _shortMethodDescription]/’

3 个赞

awesome!!

so good!

mark 下,找地址便利了很多:+1:

张总 用这个提示 error: unable to execute script function 命令行和Xcode都一样提示这玩意儿。。是我哪里少配置什么了嘛 我的步骤 1 下载py 2 touch ~/.lldbinit 3 vi command script import 脚本路径 4 lldb 5 bom xx xx 提示这个错误 不能执行脚本方法

为什么我的不行哇…
帮我看下这个问题,困扰我两天了, 求解答 http://bbs.iosre.com/t/lldb/10258/6

cool, 3Q

厉害~以后逆向省事多了~

各位大哥这个问题解决了嘛? @AloneMonkey @Zhang @snakeninny

(lldb) po [MMServiceCenter _shortMethodDescription]
error: Execution was interrupted, reason: internal ObjC exception breakpoint(-3)..
The process has been returned to the state before expression evaluation.

流弊流弊~

你把其他断点先禁用了试试?

没有其他断点。

我attach的是一个系统的后台进程。 akd

so cool

逆向AppStore为啥输入的是微信的指令

报同样的错,只是顺手把他那个copy下来了。

那就解释通了。akd没有加载UIKit。 这个方法是uikit的category。解决方案就是自己加载一遍uikit

谢谢啦, 明天早上就试一哈

还是同样的错。

__attribute__((constructor)) static void init(int argc, const char **argv) {
    NSLog([UIViewController _shortMethodDescription]);
}

上面的代码,在log中看起来是正常


<UIViewController: 0x3b18e40c>: in UIViewController:
		Class Methods:
			+ (id) _currentWhitePointAdaptivityStyleViewController; (0x29223919)
			+ (id) _currentStatusBarStyleViewController; (0x290125a5)
			+ (id) _currentStatusBarHiddenViewController; (0x29012979)
			+ (void) _performWithoutDeferringTransitions:(^block)arg1; (0x29217779)
			+ (void) _traverseViewControllerHierarchyWithDelayedRelease:(^block)arg1; (0x29214231)
			+ (id) viewControllerForView:(id)arg1; (0x28ec3805)
			+ (void) initialize; (0x28f189c9)
....

看日志的确是没有找到这个方法


09:48:36 akd➜(null): unrecognized selector sent to class 0x3b18e40c

尝试用张总的py脚本来下断点也不行


(lldb) bom UIViewController doesOverridePreferredInterfaceOrientationForPresentation
error: libarclite_iphoneos.a(arclite.o) failed to load objfile for /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a
warning: failed to set breakpoint site at 0x0 for breakpoint 1.1: error: 0 sending the breakpoint request
Breakpoint 1: address = 0x00000000

另外脚本有几个地方张总可能有点手误

1. 方法签名

可能和lldb的版本有关系,我的版本是 lldb-902.0.79.2 所以我把方法签名改成了下面这样
def breakonmethod(debugger, command, result, internal_dict):
去掉了一个参数

2. script add

debugger.HandleCommand(
        'command script add -f BreakMessage.breakonmethod bom')

这个 -f 后面应该是文件名吧?我也没查反正改成文件名就work了

debugger.HandleCommand(
        'command script add -f BreakOnMethod.breakonmethod bom')