天天看点

08-1-iOS逆向之动态调试App一、什么是动态调试二、Xcode的动态调试原理三、动态调试任意APP

文章目录

  • 一、什么是动态调试
  • 二、Xcode的动态调试原理
  • 三、动态调试任意APP
    • 3.1 debugserver的权限问题
    • 3.2 如何给debugserver签上权限
    • 3.3 让debugserver附加到某个APP进程
    • 3.4 在Mac上启动LLDB,远程连接iPhone上的debugserver服务
    • 3.5 通过debugserver 启动 APP

一、什么是动态调试

  • 将程序运行起来,通过下断点、打印等方式,查看参数、返回值、函数调用流程等

二、Xcode的动态调试原理

08-1-iOS逆向之动态调试App一、什么是动态调试二、Xcode的动态调试原理三、动态调试任意APP
  • 关于GCC、LLVM、 GDB、LLDB
    • Xcode的编译器发展历程: GCC→LLVM
    • Xcode的调试器发展历程: GDB→LLDB
  • debugserver

    一开始存放在 Mac 的 Xcode 里面
    • /Applications/Xcode.app/Contents/Developer/Platforms/iPhone0S.platform/De viceSupport/9.1/DeveloperDisklmage.dmg/usr/bin/debugserver

      08-1-iOS逆向之动态调试App一、什么是动态调试二、Xcode的动态调试原理三、动态调试任意APP
  • 当Xcode识别到手机设备时,Xcode会自动将debugserver安装到iPhone上
    • /Developer/usr/bin/debugserver

    • 注意: 这个文件夹是只读属性
      08-1-iOS逆向之动态调试App一、什么是动态调试二、Xcode的动态调试原理三、动态调试任意APP
  • Xcode调试的局限性
    • 一般情况下,只能调试通过Xcode安装的APP

三、动态调试任意APP

08-1-iOS逆向之动态调试App一、什么是动态调试二、Xcode的动态调试原理三、动态调试任意APP

3.1 debugserver的权限问题

  • 默认情况下,

    /Developer/usr/bin/debugserver

    缺少一定的权限,只能调试通过Xcode安装的

    APP,无法调试其他APP (比如来自App Store的APP)

  • 如果希望调试其他APP,需要对debugserver重新签名,签上2个调试相关的权限
    • get-task-allow
    • task_for_pid-allow

3.2 如何给debugserver签上权限

  • iPhone上的

    /Developer/

    目录是只读的,无法直接对

    /Developer/usr/bin/debugserver

    文件签

    名,需要先把

    debugserver

    复制到Mac
  • 通过Idid命令导出文件以前的签名权限
ldid -e debugserver > debugserver.entitlements
           
  • debugserver.entitlements

    文件加上

    get-task-allow

    task_for_pid-allow

    权限
    08-1-iOS逆向之动态调试App一、什么是动态调试二、Xcode的动态调试原理三、动态调试任意APP
  • 通过Idid命令重新签名
ldid -Sdebugserver.entitlements debugserver
           
  • 将已经签好权限的

    debugserver

    放到

    /usr/bin

    目录,便于找到debugserver指令
  • 关于权限的签名,也可以使用codesign
# 查看权限信息
$ codesign -d --entitlements - debugserver

# 签名权限
$ codesign -f -s - --entitlements debugserver.entitlements debugserver

# 或者简写为
$ codesign -fs- --entitlements debugserver .entitlements debugserver
           

3.3 让debugserver附加到某个APP进程

08-1-iOS逆向之动态调试App一、什么是动态调试二、Xcode的动态调试原理三、动态调试任意APP
$ debugserver *:端口号 -a 进程
           
  • *:端口号

    • 使用iPhone的某个端口启动debugserver服务 (只要不是保留端口号就行)
  • a进程

    • 输入APP的进程信息(进程ID或者进程名称)
08-1-iOS逆向之动态调试App一、什么是动态调试二、Xcode的动态调试原理三、动态调试任意APP

3.4 在Mac上启动LLDB,远程连接iPhone上的debugserver服务

08-1-iOS逆向之动态调试App一、什么是动态调试二、Xcode的动态调试原理三、动态调试任意APP
  • 启动LLDB
~ » lldb                                                            
(lldb)
           
  • 连接debugsever服务
(lldb) process connect connect://手机IP地址:debugserver服务端口号
# 这里用的是手机的10011端口映射电脑的10011端口, 这样就可以直接使用电脑的10011端口了
process connect connect://localhost:10011
           
08-1-iOS逆向之动态调试App一、什么是动态调试二、Xcode的动态调试原理三、动态调试任意APP
  • 使用LLDB的c(continue)命令让程序继续运行
(lldb) c
           
  • 接下来就可以使用LLDB命令调试App了

3.5 通过debugserver 启动 APP

$ debugserver -x auto *:端口号 APP的可执行文件路径
           

继续阅读