看过"小黄书"的朋友们应该都对函数OC函数下断点步骤很清楚:
- LLDB连接到程序
- 调动命令image -o -f查看app二进制偏移
- 在hopper或者IDA查看需要下断点的函数的文件偏移
- LLDB输入br s -a 'app二进制偏移+函数的文件偏移'
但是作为传统的方式以上方法存在两个问题
- 需要hopper或者IDA支持,这两个软件对电脑配置的要求较高,而且反汇编速度较慢。
- 不能对“已经通过运行时替换函数实现地址的函数”进行拦截
作为一个逆向开发新手,特分享一个以小技巧,可以免除对反汇编软件的依赖,而且拦截成功率更高。
- LLDB连接到程序
- 找到需要下断点的类,如MMServiceCenter,然后在LLDB命令行输入po [MMServiceCenter _shortMethodDescription]。以微信的[MMServiceCenter getService:]断点为例,操作如下:

- 然后在命令行输入b 0x100bd04f0即可实现下断操作,实践效果如下:
最后再分享个打印数据模型内容很有用的私有函数方法[模型对象 _ivarDescription];更多黑科技私有函数,可参阅这个链接
             
            
              
              
              35 个赞
            
                
           
          
            
            
              刚才试了一下,是可行的,太棒了!
非常方便,比书中提到的方法优化了不少!
有的朋友可能会问,我怎么知道要在哪个类下断点呢?我认为可以从class-dump的头文件中找线索。
另外,LLDB结合私有函数的一些黑科技,可以看看这个帖子。
             
            
              
              
              2 个赞
            
           
          
            
              
                Zhang
                
              
                
              
                  
                  
              5
              
             
            
              
OS X 似乎没这玩意
自己从头封装了一遍。全当练手
https://gist.github.com/Naville/9649532644540b5b798308f66699ef67
~/.lldbinit里写入
command script import 这个脚本的路径
即可使用bom 类名 方法名 来下段。全平台通用不依赖私有方法
CC @snakeninny
             
            
              
              
              7 个赞
            
           
          
            
            
              话说跟br s -F "-[ViewController test]"有啥区别么…
             
            
              
              
              1 个赞
            
           
          
            
            
              这个确定可行吗?为什么我在第三方App上测试是不可行的呢
             
            
              
              
              
            
           
          
            
              
                Amou
                (叶俊谋)
              
              
                  
                  
              19
              
             
            
              (lldb) po [MMServiceCenter _shortMethodDescription]
error: Process is running.  Use ‘process interrupt’ to pause execution.    为什么我测试了不行  打开其他类也不行