iOS逆向之砸壳与重签

本文只是为了学习理解整个过程和原理,砸壳和重签都有很多种简单快速的方式,本文不探讨

iPhone配置
越狱,本人使用的是iphone6s plus 12.4(非完美越狱),最好是能完美越狱,因为有些工具可能不支持非完美越狱手机,截止2020年底12.2以下均可完美越狱,可在pp助手、爱思助手查看。

  • 下载爱思助手,安装并打开后找到刷机越狱,选择一键越狱,在右侧找到CheckRa1n越狱,按照提示操作,完成之后手机中会多出一个黑色图标的软件CheckRa1n
  • 打开CheckRa1n,点击安装cydia,本人在安装过程中一直卡在了Downloading Base system界面不动,最后使用科学上网才安装成功。
  • 下载frida,打开越狱手机中应用cydia添加源:https://build.frida.re,然后搜索frida并安装,根据手机选择frida版本,6s选择Frida for pre-A12 devices

Mac配置

  • 安装工具
brew install python  #安装python
brew install wget #安装wget
#安装pip
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py

pip3 install frida  #安装frida
pip3 install firda-tools #安装frida命令行工具
  • 安装脚本依赖环境下载python3脚本,cd到frida-ios-dump目录,并执行,过程中需要输入电脑密码
sudo pip3 install -r requirements.txt --upgrade
  • 安装usbmuxd与手机通信
brew install usbmuxd   #安装usbmuxd

连接

  • 手机与电脑均配置完成,下面开始通过USB使用ssh连接设备,首先可以通过终端命令检查是否可以工作frida-ps -U,若可用会输出PID - Name列表。
  • 使用终端将22映射到电脑上的2222端口,也可使用其他端口,但要保证映射和访问时使用同一个,并且dump.py脚本中也要同步进行修改。
iproxy 2222 22

此时终端会输出➜ waiting for connection,再打开一个终端窗口,使用ssh登录iphone手机

➜  ~ ssh [email protected] -p 2222
[email protected]'s password: #这里密码默认的是alpine
iPhone:~ root#

到了这一步ssh登录成功,下面就可以使用dump.py脚本查看手机里的应用了。

注:我这里使用ssh访问没有成功,折腾半天一直报错ssh_exchange_identification: read: Connection reset by peer最终放弃。采用了第二方案,使用爱思助手 --> 打开SSH通道->弹出提示包含端口,密码,保证dump.py里面一致即可,随后继续后面的步骤


砸壳

  • 如果是新下载的dump脚本,需要在mac用户目录下,先执行一下source dump.py路径
  • 终端查看手机中的应用:/Users/Mac/frida-ios-dump/dump.py -l
  • 在输出的应用中找到要进行砸壳的bundle Id微信 com.tencent.xin
  • 创建一个文件夹dump,在dump文件夹下执行砸壳,砸壳生成的ipa将会保存到当前执行目录
  • 执行砸壳
➜  dump /Users/Peny/frida-ios-dump/dump.py com.tencent.xin
Start the target app com.tencent.xin
Dumping 微信 to /var/folders/2_/ts8l68y17cncks73d_vjz4vh0000gn/T
[frida-ios-dump]: OpenSSL.framework has been loaded.
[frida-ios-dump]: ProtobufLite.framework has been loaded.
[frida-ios-dump]: andromeda.framework has been loaded.
[frida-ios-dump]: mars.framework has been loaded.
[frida-ios-dump]: marsbridgenetwork.framework has been loaded.
[frida-ios-dump]: matrixreport.framework has been loaded.
start dump /var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/WeChat
WeChat.fid: 100%|███████████████████████████████████████████████████████████████████████████| 144M/144M [00:04<00:00, 33.9MB/s]
start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/mars.framework/mars
mars.fid: 100%|███████████████████████████████████████████████████████████████████████████| 12.7M/12.7M [00:00<00:00, 32.7MB/s]
start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/andromeda.framework/andromeda
andromeda.fid: 100%|██████████████████████████████████████████████████████████████████████| 8.71M/8.71M [00:00<00:00, 31.2MB/s]
start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/OpenSSL.framework/OpenSSL
OpenSSL.fid: 100%|████████████████████████████████████████████████████████████████████████| 2.38M/2.38M [00:00<00:00, 27.1MB/s]
start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/ProtobufLite.framework/ProtobufLite
ProtobufLite.fid: 100%|█████████████████████████████████████████████████████████████████████| 205k/205k [00:00<00:00, 10.0MB/s]
start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/marsbridgenetwork.framework/marsbridgenetwork
marsbridgenetwork.fid: 100%|██████████████████████████████████████████████████████████████| 2.40M/2.40M [00:00<00:00, 27.6MB/s]
start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/matrixreport.framework/matrixreport
matrixreport.fid: 100%|█████████████████████████████████████████████████████████████████████| 469k/469k [00:00<00:00, 17.3MB/s]
network_setting.html: 260MB [00:12, 22.2MB/s]
0.00B [00:00, ?B/s]
Generating "微信.ipa"
➜  dump

重签名方式一

  • 查看电脑安装的所有签名
➜  security find-identity -v -p codesigning
  1) 733B3EBFD4132FB93F8E21ABC93500B89563E212 "Apple Development: [email protected] (HM4asdfads)"
  2) 6A525348B0F4A138E826DF86C15765EC220CAD57 "Apple Development: xxxx (LP48asdfad)"
  3) 1A5BABAD6111FD9C1B947BC7E7B39BF07F28690F "Apple Distribution: Beijing xxxxx (55Wdsasdfadsf)"
     3 valid identities found
  • 解压ipa,cd到Payload目录下,查看wechat的签名信息
➜  codesign -vv -d WeChat.app
Executable=/Users/XXX/Desktop/dump/Payload/WeChat.app/WeChat
Identifier=com.tencent.xin
Format=app bundle with Mach-O thin (arm64)
CodeDirectory v=20500 size=2308891 flags=0x0(none) hashes=36071+7 location=embedded
Signature size=4390
Authority=Apple iPhone OS Application Signing
Authority=Apple iPhone Certification Authority
Authority=Apple Root CA
Info.plist entries=72
TeamIdentifier=88L2Q4487U
Sealed Resources version=2 rules=22 files=1683
Internal requirements count=1 size=96
  • cd到WeChat.app目录,查看machO文件的信息,在Load commond中有一个LC_ENCRYPTION_INFO_64类型用来表示加密的cryptid字段,0表示没有加密,1表示AppStore对整个app包进行对称加密过的(其在运行时的内存中解密,因此它必须要高效率,所以使用的对称加密)。可以使用爱思助手下载其他的app验证一下otool -l WeChat | grep crypt
➜  WeChat.app otool -l WeChat

...
Load command 12
          cmd LC_ENCRYPTION_INFO_64
      cmdsize 24
     cryptoff 16384
    cryptsize 121225216
      cryptid 0   # 0代表没有加密,1代表加密
          pad 0
Load command 13
...
  • 删除插件和带有插件的app包(Watch文件夹)。
  • Frameworks里面的库进行重签名
➜  WeChat.app cd Frameworks
➜  Frameworks codesign -fs "Apple Development: [email protected] (HM4asdfads)"  xxx.frameworks
  • 检查WeChat可执行文件权限,如果它是白色的需要改一下权限chmod -x WeChatchmod 777 WeChat;如果是黑色说明是有执行权限的。
  • 创建一个demo工程,真机运行,将生成的demo.app包内的embedded. mobileprovision复制出来,放到WeChat.app目录下
  • 修改Info.plist文件中的Bundle Id
  • 通过授权文件(Entitlements)重签app
    终端命令:security cms -Di embedded.mobileprovision,提取Entitlements里面的内容并创建一个新的plist文件,命名可随意:如ent.plist
➜  WeChat.app security cms -Di embedded.mobileprovision
...
Entitlements
    
        application-identifier
        HM4asdfads.con.xxxx.demo*
        keychain-access-groups
        
        HM4asdfads.*
        com.apple.token
        
        get-task-allow
        
        com.apple.developer.team-identifier
        55WHPN47NF
    
...

中的内容填充到ent.plist文件中,接下来就可以使用ent.plistWeChat.app进行签名了

➜  WeChatDemo ls
AppDelegate.h     AppDelegate.m     Assets.xcassets   Base.lproj        Info.plist        SceneDelegate.h   SceneDelegate.m   ViewController.h  ViewController.m  WeChat.app        ent.plist         main.m
➜  WeChatDemo codesign -fs "Apple Development: [email protected] (HM4asdfads)" --no-strict --entitlements=ent.plist WeChat.app
WeChat.app: replacing existing signature
➜  WeChatDemo

重签名方式二

使用xcode创建同名工程,这里的同名指的是target一致,xcode根据target在run的时候生成app文件。新创建一个WeChat或者在任意一个工程的TARGETS添加WeChat都可以。

  • 运行同名工程,得到一个.app文件
  • 打开砸壳后的app,删除里面的插件和带有插件的app包(Watch文件夹)。
  • Frameworks里面的库进行重签名
  • 不需要改bundle id,描述文件等,直接将上面两步操作之后的app文件替换同名工程中的app文件,然后xcode run。

重签名方式三
借助xcode中Run Script,编写shell脚本,实现自动重签,主要是脚本的编写,引用一下别人写的脚本示例:

# ${SRCROOT} 它是工程文件所在的目录
TEMP_PATH="${SRCROOT}/Temp"
#资源文件夹,我们提前在工程目录下新建一个APP文件夹,里面放ipa包
ASSETS_PATH="${SRCROOT}/APP"
#目标ipa包路径
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
#清空Temp文件夹
rm -rf "${SRCROOT}/Temp"
mkdir -p "${SRCROOT}/Temp"



#----------------------------------------
# 1. 解压IPA到Temp下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解压的临时的APP的路径
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
# echo "路径是:$TEMP_APP_PATH"


#----------------------------------------
# 2. 将解压出来的.app拷贝进入工程下
# BUILT_PRODUCTS_DIR 工程生成的APP包的路径
# TARGET_NAME target名称
TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
echo "app路径:$TARGET_APP_PATH"

rm -rf "$TARGET_APP_PATH"
mkdir -p "$TARGET_APP_PATH"
cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH"



#----------------------------------------
# 3. 删除extension和WatchAPP.个人证书没法签名Extention
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"



#----------------------------------------
# 4. 更新info.plist文件 CFBundleIdentifier
#  设置:"Set : KEY Value" "目标文件路径"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"


#----------------------------------------
# 5. 给MachO文件上执行权限
# 拿到MachO文件的路径
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
#上可执行权限
chmod +x "$TARGET_APP_PATH/$APP_BINARY"



#----------------------------------------
# 6. 重签名第三方 FrameWorks
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do

#签名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi

最新常见问题
在实验过程中,使用新版的weixin,dingding都不成功,提示The application is not built for this device,如下图所示

image.png

解决方案为:这是因为使用了app瘦身功能,砸壳所用的机型与重签之后使用的机型不一致,需要将plist文件中的UISupportedDevices的设备补全,或者直接将这一项删除,在脚本的第4步中添加上

#我这里使用的xs max(A2104),添加`iPhone11,6`即可安装成功
/usr/libexec/PlistBuddy -c "Add :UISupportedDevices: string iPhone11,6" "$TARGET_APP_PATH/Info.plist"
#删除
/usr/libexec/PlistBuddy -c "Delete :UISupportedDevices" "$TARGET_APP_PATH/Info.plist"

PS:本人只是为了学习和研究,如有冒犯请多多见谅~

你可能感兴趣的:(iOS逆向之砸壳与重签)