iOS_逆向_LLDB与debugserver

作者: 丶纳凉 | 来源:发表于2017-04-25 23:15 被阅读259次

    一丶介绍

    “LLDB全称为“Low Level Debugger”,是由苹果出品,内置于Xcode中的动态调试工具,不但通吃C、C++、Objective-C,还全盘支持OSX、iOS,以及iOS模拟器。

    LLDB的功能可以概括为以下四点:
    ·在指定的条件下启动程序;
    ·在指定的条件下停止程序;
    ·在程序停止的时候检查程序内部发生的事;
    ·在程序停止的时候对程序进行改动,观察程序的执行过程有什么变化。”
    

    “debugserver运行在iOS上,顾名思义,它作为服务端,实际执行LLDB(作为客户端)传过来的命令,再把执行结果反馈给LLDB,显示给用户,即所谓的“远程调试”。

    在默认情况下,iOS上并没有安装debugserver,只有在设备连接过一次Xcode,
    并在Window→Devices菜单中添加此设备后,debugserver才会被Xcode安装到iOS的“/Developer/usr/bin/”目录下。
    
    Paste_Image.png

    二丶debugserver

    1.减肥

    1副本.png

    找到你手机对应的ARM架构;

    1.1“将未经处理的debugserver从iOS拷贝到OSX中的“/Users/snakeninny/”目录下,命令如下:

    $scp root@iOSIP:/Developer/usr/bin/debugserver ~/debugserver
    

    1.2减肥 armv7s == 你iPhone的架构

    $ lipo -thin armv7s ~/debugserver -output ~/debugserver
    

    2.给debugserver添加task_for_pid权限

    下载http://iosre.com/ent.xml 放到 ~/User/用户名/

    #方法一:
    $/opt/theos/bin/ldid -Sent.xml debug server
    
    #方法二:
    $ codesign -s - --entitlements ent.plist -f 
    

    3.将经过处理的debugserver拷回iOS,并添加执行权限

    $scp ~/debugserver root@iOSIP:/usr/bin/debugserver
    $ ssh root@iOSIP
    $chmod +x /usr/bin/debugserver
    

    4.用debugserver启动或附加进程

    启动executable,并开启port端口,等待来自IP的LLDB接入。

    debugserver -x backboard IP:port /path/to/executable
    

    附加ProcessName,并开启port端口,等待来自IP的LLDB接入。

    debugserver IP:port -a "ProcessName"
    

    例如:

    FunMaker-5:~ root# debugserver -x backboard *:1234 /Applications/MobileSMS.app/MobileSMS  
    debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-320.2.89
     for armv7.
    Listening to port 1234 for a connection from *...
    

    上面的代码会启动MobileSMS,并开启1234端口,等待任意IP地址的LLDB接入。而:

    “FunMaker-5:~ root# debugserver 192.168.1.6:1234 -a "MobileSMS"
    debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-320.2.89
     for armv7.
    Attaching to process MobileNotes...
    Listening to port 1234 for a connection from 192.168.1.6...
    

    会附加MobileSMS,并开启1234端口,等待来自192.168.1.6的LLDB接入。

    如果上面的命令在执行时报错,如下:

    FunMaker-5:~ root# debugserver *:1234 -a "MobileSMS"
    dyld: Library not loaded: /Developer/Library/PrivateFrameworks/ARMDisassembler.framework/ARMDisassembler
      Referenced from: /usr/bin/debugserver
      Reason: image not found
    Trace/BPT trap: 5
    

    说明iOS上的“/Developer/”目录下缺少必要的调试数据。这种情况一般是因为没有在Xcode的Window→Devices菜单中添加此设备,重新添加设备就可以解决问题。”

    摘录来自: 沙梓社 吴航 著.iOS应用逆向工程(第2版)

    三丶LLDB

    1.image list

    (lldb)image list -o -f
    

    列举当前进程中的所有模块(image)

    2.breakpoint

    设置断点

    breakpoint
    b function
    br s -a address
    br s -a 'ASLROffset+address'
    
    //例子:
    函数的起始位置设置断点;
    (lldb)b NSLog
    在地址处设置断点
    (lldb)bs s -a 0xCCCCC
    (lldb)bs s -a '0x6+0x9'
    
    禁用所有断点
    (lldb)br dis
    禁用某个断点
    (lldb)br dis 6
    启用所有断点
    (lldb)br en
    启用所有断点
    (lldb)br en 6
    删除所有断点
    br del
    删除某个断点
    br del 8
    
    指定在某个断点得到出发的时候,执行预先设置指令:
    (lldb) br com add 1
    

    3.print

    打印某处的值

    po 打印Object-C对象
    
    p(char*) 通过强制转换的方式打印了C语言基本数据类型对象
    
    

    4.nexti与stepi

    “nexti”与“stepi”的作用都是执行下一条机器指令,它们最大的区别是前者不进入函数体,而后者会进入函数体。它们可分别简写为“ni”与“si”,是调试时使用最多的指令之一”

    5.register write

    “register write”命令用于给指定的寄存器赋值,从而“对程序进行改动,观察程序的执行过程有什么变化”。”

    四丶LLDB使用小提示

    4.1.调试的二进制文件必须从iOS中提取

    4.2.LLDB中的简化输入

    4.2.1.在使用LLDB时,如果想重复执行上一条指令,直接按回车键
    4.2.2.如果想查看以前执行过的指令,按方向键的向上和向下键就可以了。

    五丶总结:

    ...除了lldb;其他还需要具体情况,具体使用;实践后才能领会;

    相关文章

      网友评论

        本文标题:iOS_逆向_LLDB与debugserver

        本文链接:https://www.haomeiwen.com/subject/pbybzttx.html