一、前言
逆向过程中,我们有时候需要利用Xcode来调试三方应用,这是应用重签名的目的之一,如果我们改变了应用的二进制文件(可执行文件),或者增加了应用里面的资源,应用本身的签名就会被破坏,要想修改过的应用可以安装在手机上,就需要对其进行重新签名。
二、准备需要重签名的应用ipa
这里我使用的是自己脱壳的微信ipa(当前最新版6.7.4),重签名不能用加密(加壳)的ipa包,所有从App Store上下载的ipa包都经过苹果加密,如何查看是否加密,具体如下:

说明:otool -l 参数 | grep crypt
参数
是当前ipa包解压后的.app目录下的可执行文件,一般与.app包名称同名,其他类推。
三、准备用于签名的证书
做过正向开发的都应该知道,真机调试,打包测试等等都需要经过证书签名,通过命令security find-identity -p codesigning -v
获取本机证书,具体如下:

说明:第2、3行分别是个人开发者证书,普通开发者免费证书,两种均可,只不过用后者重签名应用安装7天之后会失效,这次使用的是免费开发者证书。
四、用免费开发者证书签名三方ipa
1.删掉一些免费开发者证书不能签名的内容
免费开发者证书无法对微信包内的PlugIns目录下的Extension签名(经检验,如果是用非免费开发者证书,可以签名这些插件、Extension),同时Watch目录下也包含PlugIns,由于我们需要签名的是iPhone应用,因此可以删掉这两个文件夹:

2.对包内Frameworks文件夹下的所有framework进行签名
codesign -fs 你的证书 需要签名的framework

3.赋予可执行文件执行权限
有可能.app下的可执行文件没有执行权限,先通过ls -l Wechat
查看一下

可以看到文件所有者没有"x"标记,表示没有可执行权限,通过
chmod +x Wechat
添加权限,再次查看
4.新建空工程,获取embeded.mobileprovision描述文件
新建一个Xcode iOS App项目,编译生成目标App,在该目录下获取embeded.mobileprovision描述文件,复制到WeChat.app包目录下



(1)修改Wechat的Info.plist的BundleID
因为该描述文件是对应我们新空工程的BundleID,因此我们将WeChat.app下Info.plist对应BundleID字段修改与之对应。
(2)从embeded.mobileprovision描述文件提取entitlements.plist授权文件
security cms -D -i embedded.mobileprovision > profile.plist
/usr/libexec/PlistBuddy -x -c 'print :Entitlements' profile.plist > entitlements.plist
(3)对整个.app文件夹进行签名
codesign -f -s CECC797ED99A7943709DF97F215F741CBB8EE7BB --entitlements entitlements.plist /Users/kinken_yuen/Desktop/微信重签名Demo/Payload/WeChat.app
ps:CECC797ED99A7943709DF97F215F741CBB8EE7BB
是证书的另一种表示,在查看本机证书的时候可以看到。

(4)打包ipa
zip -ry WeChatResign.ipa Payload

五、安装测试
使用Xcode安装重新签名后的ipa文件,首次安装可能会出现安装失败,因为新空工程的描述文件尚未安装到手机,切回到新空工程Command + R运行,并且在手机上信任描述文件。

再次安装,成功安装,并且成功运行


这个时候我们就可以进行lldb调试附加,在Xcode -> Debug -> Attach to Process -> WeChat
,效果就是类似于日常开发调试界面,动态调试,寻找你需要逆向的线索、目标。


六过程遇到的问题
1.忘记删除PlugIns与Watch文件夹,安装时出现以下提示

解决:删除之后重新再打包安装
七、总结
-
手动重签名步骤比较繁琐,一般会采用脚本进行重签名,这里主要以理解其过程原理为主。
-
学习重签名之前,需要先了解一下苹果的签名机制,可以参考iOS App 签名的原理,非常详细。
-
获取脱壳应用方法可以查看我前几篇的学习笔记。
网友评论