在非越狱设备上使用 LLDB 调试第三方 App

说明


      这个方法是在 iOS 8 刚发布的时候想到的,当时主要用来在非越狱的 iOS 8 设备上调试分析第三方已经支持 iOS 8 的 App,比如:UC 浏览器,下面也会使用 UCWEB 为例来说明一些命令。

为什么要进行这种调试


  1. 同一个功能在不同的系统版本上会有不同的实现方式,以现在的情况为例:目前 iOS 8.2 还没有越狱,假如想分析第三方程序在 iOS 8.2 上的实现方式。
  2. 有些功能可能是针对某些系统版本的。

原理


     谈不上原理,主要就是利用 xcode 的工具链,当然如果对证书、签名、Entitlements 比较熟悉,可能会很自然的想到这个方法。当时想到方法后,就在 github 上搜索了一下发现已经有人写了相关的工具,下面跟大家说下具体如何操作。

工具


     ios-deploy:https://github.com/phonegap/ios-deploy

环境


     1、OS X Yosemite - 10.10.2
     2、xcode - 6.1.1

步骤


     1、配置 xcode 的命令行环境,如下图:


     说明:xcode 支持的 iOS 系统版本号需要大于等于设备,否则会无法挂载调试工具。

     2、签出工具:git clone https://github.com/phonegap/ios-deploy

     3、编译工具,shell 进入到 ios-deploy 目录,直接 make 即可:

 在非越狱设备上使用 LLDB 调试第三方 App_第1张图片

     编译成功后,可以将 ios-deploy 拷贝到 /usr/local/bin 中,便于全局使用。

     4、在越狱设备上解密第三方 App,可以手工操作,也可以使用 Clutch 等。
     这步比较重要,不解密会报错,具体原因没有去追究。在开发调试时向设备上安装的应用也是没有加密的。

     5、权限 Entitlements

<?xml version="1.0"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
		<key>get-task-allow</key>
		<true/>
	</dict>
</plist>

将如上内容保存为:Entitlements.plist,后面签名时需要。


     6、准备 mobileprovision 文件,可以 iOS Dev Center 中下载,mobileprovision 文件中需要包含目标设备,这个做 iOS 开发的应该都知道。检查方法是:可以使用 emacs 打开 mobileprovision 文件,然后查看设备的 udid 是否在文件中。
     将下载到 mobileprovision 重命名为 embedded.mobileprovision,将重命名后的文件拷贝到 UCWEB.app 中:

在非越狱设备上使用 LLDB 调试第三方 App_第2张图片

     7、运行如下命令重新签名
      
codesign -f -s "iPhone Developer: 你的证书名字" --entitlements Entitlements.plist UCWEB.app

     8、运行如下命令开始调试,调试前请解锁屏幕:
     
ios-deploy -v -d -n -i “设别 UDID" -b UCWEB.app

     说明:安装应用的过程比较长。
     如果成功,状态如下图:

在非越狱设备上使用 LLDB 调试第三方 App_第3张图片
     
     9、设置断点,运行程序:


     10、其他的跟正常的 lldb 远程调试没有什么区别,enjoy。
     
     补充-2015-03-31:
            对于 iOS 8.2 签名时需要增加 Key: application-identifier,且如果第三方应用包含 App Extension,也需要对扩展进行重签名。
          

你可能感兴趣的:(ios,debug,gdb,remote,lldb)