iOS逆向 10:應用重簽名(上)

iOS 底層原理 + 逆向 文章匯總

本文主要介紹重簽名的幾種方式,以及如何對應用進行重簽名,

應用重簽名

iOS逆向 09:應用簽名中可知,簽名是指原始數據的Hash值解密。那么重簽名,顧名思義,就是指將原始數據的Hash值重新加密

本次介紹的應用重簽名方式主要有以下幾種:

  • Codesign重簽名

  • Xcode重簽名

  • Shell腳本重簽名

下面來進行一一介紹

方式1:Codesign重簽名

在iOS中,Xcode為我們提供了簽名工具,即codesign,通過一些命令即可完成重簽名,如下所示

  • $security find-identity -v -p codesigning: 列出鑰匙串里可簽名的證書

  • $Codesign –fs “證書串” 文件名 :強制替換簽名

  • $Chmod +x 可執行文件 : 給文件添加權限

  • $security cms -D -i ../embedded.mobileprovision :查看描述文件

  • $codesign -fs “證書串” --no-strict --entitlements=權限文件.plist APP包

  • $Zip –ry 輸出文件 輸入文件 將輸入文件壓縮為輸出文件

Codesign演示

如何獲取越獄手機的ipa包

  • 1、建立鏈接:sh usbConnect.sh

  • 2、連接手機:sh usbX.sh

  • 3、查看進程:ps -A

  • 4、篩選進程,找到微信進程:ps -A | grep WeChat

  • 5、拷貝:scp -r -P 12345 root@localhost:路徑 ./

  • 6、查看拷貝的app包:cd WeChat.app

  • 7、查看可執行文件:otool -l WeChat | grep crypt (此時的cryptid 是 1,表示加密過的)

  • 8、查看app的權限:codesign -vv -d WeChat.app (有簽名權限)

準備工作

注:所需的資料可在這里獲取鏈接,密碼: ch5c

  • 1、準備一個微信的越獄包,這里準備的是通過MyZip解壓 微信-7.0.8.ipa

    • 其中的WeChat.app包含兩個東西:app + app簽名信息
      準備工作-01
  • 2、查看app包的簽名信息(CMD+G): codesign -vv -d WeChat.app

    準備工作-02

  • 3、查看鑰匙串的證書:security find-identity -v -p codesigning

  • 4、查看可執行文件詳細信息:otool -l WeChat > ~/Desktop/123.txt。其中有cryptid加密id(0表示沒有使用加密算法)

codesign重簽名步驟

給應用重簽名的步驟如下:

  • 1、刪除插件和帶有插件的.app包(例如Watch、plugins)

  • 2、對Frameworks里面的庫進行重簽名

  • 3、給可執行文件 +x(可執行)權限

  • 4、新建一個空工程

  • 5、添加描述文件(4中的空工程通過真機編譯得到,且要運行,因為需要將描述文件安裝到手機)

  • 6、替換.app包中BundleID(.app包中info.plist文件的BundleID要和描述文件中的BundleID保持一致)

  • 7、通過授權文件(Entilements)重簽.app包、

    • 1)查看描述文件:$security cms -D -i embedded.mobileprovision

    • 2)將描述文件中Entilements 拷貝出來,生成plist文件。(文件名稱entitlements.plist

    • 3)用權限文件簽名APP包: $ codesign -fs "Apple Development: XX(XX)" --no-strict --entitlements=entitlements.plist WeChat.app

  • 8、最后通過Xcode安裝

  • 注:mach-o最重要的兩塊:代碼塊 + 數據塊,其中加密主要是加密代碼

codesign重簽名演示
  • 前提:

    • 需要簽名:wechat可執行文件(即Mach-O文件) + Frameworks

    • 需要刪除:plugins(免費普通賬戶無法簽名,可以刪除) + Watch(也無法簽名,刪除)

  • 1、查看Frameworks,也是有簽名信息的:codesign -vv -d andromeda.framework

    codesign重簽名演示-01

  • 2、重簽名Frameworks:codesign -fs "Apple Development: chenjialin1016@foxmail.com (C2893S7GXH)" andromeda.framework

    codesign重簽名演示-02

    然后執行退出 cd ..

  • 3、查看可執行文件:ls -l WeChat

    codesign重簽名演示-03

    • 注:重簽名必須要有可執行權限,即 - x
  • 4、新建一個工程,獲取chenjialin1016@foxmail.com (C2893S7GXH)對應的描述文件 ,例如 xxx xxx(Personal Team) 獲取可執行文件中的描述文件,拷貝至WeChat包

  • 5、描述文件和BundleID有關系,需要修改WeChat的BundleID com.tencent.xinxxx.com.test

  • 6、查看描述文件的權限:security cms -D -i embedded.mobileprovision

    codesign重簽名演示-04

    查看Entitlements(權限),是一個plist文件
    codesign重簽名演示-05

    將其拷貝至一個plist文件(名稱為Entitlements,需要新建)(路徑:propertyList - open sourceCode - 拷貝 <dict></dict>)
    codesign重簽名演示-06

    將其拷貝至payload文件夾中

  • 7、簽名app(即mach-o簽名):codesign -fs "Apple Development: xxxxxx@foxmail.com (C2893S7GXH)" --no-strict --entitlements=Entitlements.plist WeChat.app

  • 8、查看WeChat簽名:codesign -vv -d WeChat.app, 此時簽名信息已經替換

    codesign重簽名演示-07

  • 9、安裝


    codesign重簽名演示-08
  • 10、調試:Debug - Attach to process - WeChat

Codesign重簽名缺點:過程太繁瑣

方式2:Xcode重簽名

下面我們通過Xcode來進行重簽名,步驟如下:

  • 1、刪除Plugins、Watch

  • 2、重簽名Frameworks

  • 3、創建并運行一個空工程

  • 4、修改Info.plist中的BundleID改為 空工程的BundleID

  • 5、利用修改后的app包,替換空工程的app包

  • 6、直接運行

與CodeSign重簽名相比:少了其中的3(執行文件權限)、5(添加描述文件)、7(通過授權文件重簽.app包)

xcode重簽名演示

  • 1、將product中的WeChat替換成 需要我們之前重簽名的WeChat


    xcode重簽名演示-01
  • 2、CMD+R再次運行


    xcode重簽名演示-02

總結

  • 重簽名:將原始數據的Hash值重新加密

  • Codesign重簽名步驟

    • 1、刪除插件和帶有插件的.app包(例如Watch、plugins)

    • 2、對Frameworks里面的庫進行重簽名

    • 3、給可執行文件 +x(可執行)權限

    • 4、新建一個空工程

    • 5、添加描述文件(4中的空工程通過真機編譯得到,且要運行,因為需要將描述文件安裝到手機)

    • 6、替換.app包中BundleID(.app包中info.plist文件的BundleID要和描述文件中的BundleID保持一致)

    • 7、通過授權文件(Entilements)重簽.app包、

      • 1)查看描述文件:$security cms -D -i embedded.mobileprovision

      • 2)將描述文件中Entilements 拷貝出來,生成plist文件。(文件名稱entitlements.plist

      • 3)用權限文件簽名APP包: $ codesign -fs "Apple Development: XX(XX)" --no-strict --entitlements=entitlements.plist WeChat.app

    • 8、最后通過Xcode安裝

  • Xcode重簽名步驟

    • 1、刪除Plugins、Watch

    • 2、重簽名Frameworks

    • 3、創建并運行一個空工程

    • 4、修改Info.plist中的BundleID改為 空工程的BundleID

    • 5、利用修改后的app包,替換空工程的app包

    • 6、直接運行

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容