不越狱使用 Xcode 调试第三方应用
在越狱环境我们经常通过 SSH 远程登录,然后在命令行下使用 lldb 调试第三方应用,但是有些情况下手机是没越狱的,但是又想调试第三方应用怎么办?也有办法,原理就是“偷梁换柱”,主要有这下面几个步骤:
(1) 使用 Xcode 建一个和第三方应用一样名称的工程,比如工程名叫 WeChat。
(2) 在 Xcode 上编译工程并运行起来, 同时将 WeChat.app 复制替换我们新建工程生成的 .app。
(3 ) 对 WeChat.app 进行签名。
(4) 最后将签名后的 WeChat.app 安装到手机上,这样 Xcode 就像是在运行我们自己的 APP,想怎么调试就怎么调。
下面我们来具体操作一下,先看一下 AloneMonkey 写的脚本,这个脚本的作用就是完成“偷梁换柱”,将第三方应用替换掉原始的 .app 文件,欺骗 Xcode 以为是在运行原始的 .app,具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
TARGET_APP_PATH="${SRCROOT}/WeChat.app" #需要拷贝的目标应用 BUILD_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app" #build生成的应用 #签名所有framework和动态库 function codesign(){ for file in `ls $1`; do extension="${file#*.}" if [[ -d "$1/$file" ]]; then if [[ "$extension" == "framework" ]]; then /usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$1/$file" else codesign "$1/$file" fi elif [[ -f "$1/$file" ]]; then if [[ "$extension" == "dylib" ]]; then /usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$1/$file" fi fi done } #删除原目录 rm -rf "$BUILD_APP_PATH" || true mkdir -p "$BUILD_APP_PATH" || true #拷贝目标应用替换build生成的应用 cp -rf "$TARGET_APP_PATH/" "$BUILD_APP_PATH/" #删除PlugIns和Watch rm -rf "$BUILD_APP_PATH/PlugIns" || true rm -rf "$BUILD_APP_PATH/Watch" || true codesign "$BUILD_APP_PATH" |
使用之前先将 WeChat.app 复制到和工程文件 .xcodeproj 在同一个目录,如下图所示:
将这个脚本复制到工程里,方法选择 Build Phases,点击 + 号,再点击 New Run Script Phase,将代码复制进去,点击运行就可以,如下图所示:
运行成功之后,点击那个暂停按钮就能将程序断下来,接下来就可以在命令窗口输入 lldb 命令了,就像是在调试自己写的程序一样,如下图所示:
比如来查看一下加载的模块和基地址:
1 2 3 4 5 6 7 8 9 10 |
``` (lldb) image list -o -f [ 0] 0x00000000045ac000 /Users/exchen/Library/Developer/Xcode/DerivedData/WeChat-hlfzuzvsdbkwmocgapuxyfbijmsk/Build/Products/Debug-iphoneos/WeChat.app/WeChat [ 1] 0x000000010922c000 /Users/exchen/Library/Developer/Xcode/iOS DeviceSupport/11.0 (15A372)/Symbols/usr/lib/dyld [ 2] 0x0000000001488000 /Users/exchen/Library/Developer/Xcode/iOS DeviceSupport/11.0 (15A372)/Symbols/System/Library/Frameworks/CallKit.framework/CallKit [ 3] 0x0000000001488000 /Users/exchen/Library/Developer/Xcode/iOS DeviceSupport/11.0 (15A372)/Symbols/System/Library/Frameworks/Accelerate.framework/Accelerate [ 4] 0x0000000001488000 /Users/exchen/Library/Developer/Xcode/iOS DeviceSupport/11.0 (15A372)/Symbols/System/Library/Frameworks/Intents.framework/Intents [ 5] 0x0000000001488000 /Users/exchen/Library/Developer/Xcode/iOS DeviceSupport/11.0 (15A372)/Symbols/usr/lib/libbz2.1.0.dylib ........ ``` |
点击 Debug View Hierarchy,还能查看到应用的 UI 结构,如下图所示: