使用的工具
Otool ——查看程序依赖哪些动态库信息,反编代码段
Ldid ——签名工具,通过plist文件指定了授予一应用的一组特权
debugserver ——手机端调试工具
SSH ——远程控制
Lipo ——合并拆分对支持不同芯片的mach-o
一.定制一个可以调试的debugserver
cd ldid
git submodule update --init
./make.sh
我的xcode 是version7.2(2016年6月7日)
如果你在Mac那双击它,你会看到如下目录:
红色框圈起来的就是我们需要使用到的部分,此时你一定很高兴的看到了debugserver,但是别高兴的太早了,我们还要对这个debugserver做下处理(签名ldid,并用thin瘦一下身),使其能正常的调试起来。
将ARMDisassembler.framework 拷贝到手机上/System/Library/PrivateFrameworks目录下。
很多人一定奇怪为啥要这步骤,你们可以自己试试,去掉ARMDisassembler.framework与存在ARMDisassembler.framework,在LLDB调试的过程看ARM反汇编的质量和效果。
我这边使用scp拷贝到设备上去:
# cd /Volumes/DeveloperDiskImage/Library/PrivateFrameworks
# scp -r -p 22 ARMDisassembler.framework root@192.168.20.21:/System/Library/PrivateFrameworks
3.提取对应设备版本的debugserver,并对其签名授予特权
# mv debugserver /usr/_debugserver
# lipo -thin armv7 s usr/_debugserver -output usr/_debugserver
2) 保存以下授予特权内容为entitlement.xml
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
<key>run-unsigned-code</key>
<true/>
</dict>
</plist>
3) 使用ldid对debugserver签名授予特权
# ldid -Sentitlement.xml debugserver
将签名授予特权的debugserver拷贝到手机/usr/bin目录下
# scp debugserver root@192.168.XX。XXX:/usr/bin/
4) 运用debugserver 开启或附着上待动态调试的进程
Otool ——查看程序依赖哪些动态库信息,反编代码段
Ldid ——签名工具,通过plist文件指定了授予一应用的一组特权
debugserver ——手机端调试工具
SSH ——远程控制
Lipo ——合并拆分对支持不同芯片的mach-o
一.定制一个可以调试的debugserver
1.下载编译ldid
如果安装过,命令行直接敲ldid会有回显。
没有,就用git下载,make安装。
git clone git://git.saurik.com/ldid.gitcd ldid
git submodule update --init
./make.sh
完成以上操作会在ldid目录下生产一个mac 可执行程序 ldid。他是 ios签名工具。
我的xcode 是version7.2(2016年6月7日)
找到/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/8.3 (11D167)/DeveloperDiskImage.dmg
这里的这个8.3是我的测试用机iphone5c的系统版本。
如果你在Mac那双击它,你会看到如下目录:
红色框圈起来的就是我们需要使用到的部分,此时你一定很高兴的看到了debugserver,但是别高兴的太早了,我们还要对这个debugserver做下处理(签名ldid,并用thin瘦一下身),使其能正常的调试起来。
将ARMDisassembler.framework 拷贝到手机上/System/Library/PrivateFrameworks目录下。
很多人一定奇怪为啥要这步骤,你们可以自己试试,去掉ARMDisassembler.framework与存在ARMDisassembler.framework,在LLDB调试的过程看ARM反汇编的质量和效果。
我这边使用scp拷贝到设备上去:
# cd /Volumes/DeveloperDiskImage/Library/PrivateFrameworks
# scp -r -p 22 ARMDisassembler.framework root@192.168.20.21:/System/Library/PrivateFrameworks
3.提取对应设备版本的debugserver,并对其签名授予特权
1) 提取对应的debugserver(由于ldid不支持对FAT文件格式的mach-o签名,所以需要提取对应版本)
我的iphone5c的cpu是armv7s,因此我用
# cd /Volumes/DeveloperDiskImage/usr/bin/# mv debugserver /usr/_debugserver
# lipo -thin armv7 s usr/_debugserver -output usr/_debugserver
2) 保存以下授予特权内容为entitlement.xml
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
<key>run-unsigned-code</key>
<true/>
</dict>
</plist>
3) 使用ldid对debugserver签名授予特权
# ldid -Sentitlement.xml debugserver
将签名授予特权的debugserver拷贝到手机/usr/bin目录下
# scp debugserver root@192.168.XX。XXX:/usr/bin/
4) 运用debugserver 开启或附着上待动态调试的进程
首先ssh登录到目标手机上
如果是开启我们自己的进程,可以这样
./debugserver *:1234 /var/root/hello
其中参数一是手机的ip地址和监听端口 参数二是待调试进程名,这里给的是一个arm上的可执行文件。
如果是要调试一个已运行的进程(通常调试系统进程或者某个第三方app时运用)
第一步,ps aux找到想要调试的进程名称
第二步,
5)mac电脑端直接用lldb连上手机进行调试。