iOS逆向實戰--014:應用重簽名

應用重簽名,就是把已經存在的ipa包,重新配置一套證書和描述文件,再簽名生成一個新的ipa

codesign重簽名

Xcode提供了簽名工具codesign,通過幾個命令就可以完成重簽名

終端命令

查看鑰匙串里可簽名的證書

security find-identity -v -p codesigning

強制替換簽名

codesign -fs "證書串" 文件名

給文件添加權限

chmod +x 可執行文件

查看描述文件

security cms -D -i embedded.mobileprovision

用權限文件簽名App

codesign -fs "證書串" --no-strict --entitlements=權限文件.plist App包

將輸入文件壓縮為輸出文件

zip -ry 輸出文件 輸入文件

案例1:

查看應用的簽名信息

從某助手導出砸殼后的wx7.0.8.ipa,將其解壓

使用codesign命令,查看應用的簽名信息

codesign -vv -d WeChat.app
-------------------------
Executable=/Users/zang/Zang/Spark/LG/11/wx7.0.8/Payload/WeChat.app/WeChat
Identifier=com.tencent.xin
Format=app bundle with Mach-O thin (arm64)
CodeDirectory v=20400 size=972531 flags=0x0(none) hashes=30383+5 >location=embedded
Signature size=4864
Authority=iPhone Distribution: Tencent Technology (Shenzhen) Company Limited (88L2Q4487U)
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=Oct 16, 2019 at 17:54:10
Info.plist entries=68
TeamIdentifier=88L2Q4487U
Sealed Resources version=2 rules=10 files=1470
Internal requirements count=1 size=212

案例2:

查看鑰匙串里可簽名的證書

security find-identity -v -p codesigning
-------------------------
 1) E972414310363E12F223F4AB36027459EB2XXXXX "iPhone Distribution: XXX1 (ZH6L374XXX)"
 2) 9671D2A6816E643601A25DE66FA1E7F64F9XXXXX "iPhone Developer: XXX2 (79DN9L6XXX)"
 3) DE19F59CD715AB8E727F492126BA8064E60XXXXX "iPhone Developer: XXX3 (XM33C3GXXX)"
 4) ABD73916998A2CC8FF65BAB19F5C127B66DXXXXX "iPhone Distribution: Beijing XXX XXX Information Technology Co., Ltd. (BD69S49XXX)"
    4 valid identities found

案例3:

查找MachO中的cryptid關鍵字

otool -l WeChat | grep cryptid -A 1 -B 5
-------------------------
Load command 12
         cmd LC_ENCRYPTION_INFO_64
     cmdsize 24
    cryptoff 16384
   cryptsize 101695488
     cryptid 0
         pad 0
  • cryptid為加密算法的idcryptid0表示當前可執行文件是未加密的,俗稱:脫殼

MachO中,最重要的就是代碼段和數據段,而加密和簽名僅針對代碼段

案例4:

在未越獄設備上,直接安裝砸殼后的wx7.0.8.ipa

打開Xcode,選擇Window -> Devices and Simulators

點擊+,選擇安裝wx7.0.8.ipa

提示Unable to install

未越獄設備,安裝App需要進行簽名驗證,直接安裝提示Unable to install。要想成功安裝到設備上,需要對其進行重簽名

codesign重簽名步驟:

1、刪除插件和帶有插件的.app包(比如Watch

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

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

4、新建工程,真機編譯并運行,將描述文件安裝到手機。將描述文件拷貝到.app包中

5、info.plist文件中替換BundleIDBundleID要和描述文件中的ID保持一致

6、通過授權文件(Entitlements)重簽.app

  • 查看描述文件
security cms -D -i embedded.mobileprovision
  • 將描述文件中Entitlements拷貝出來,生成plist文件。文件名稱entitlements.plist
  • 用權限文件簽名App
codesign -fs "Apple Development: XX(XX)" --no-strict --entitlements=entitlements.plist WeChat.app

7、最后通過Xcode安裝

案例5:

使用codesignApp重簽名

右鍵.app文件,選擇顯示包內容,進入App目錄

刪除插件和帶有插件的.app包,刪除PlugIns目錄和Watch目錄

Frameworks里面的庫進行重簽名

進入Frameworks目錄

cd Frameworks

.framework文件依次重簽名

codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" andromeda.framework
codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" mars.framework
codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" marsbridgenetwork.framework
codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" matrixreport.framework
codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" OpenSSL.framework
codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" ProtobufLite.framework
-------------------------
andromeda.framework: replacing existing signature
mars.framework: replacing existing signature
marsbridgenetwork.framework: replacing existing signature
matrixreport.framework: replacing existing signature
OpenSSL.framework: replacing existing signature
ProtobufLite.framework: replacing existing signature

回到上級目錄

cd ..

對應用重簽名,可執行文件必須有可執行權限

chmod +x WeChat

添加描述文件。使用重簽名的賬號新建工程

真機編譯并運行,將描述文件安裝到手機

將描述文件拷貝到.app包中

info.plist文件中替換BundleIDBundleID要和描述文件中的ID保持一致

在項目中創建授權文件(Entitlements

命名entitlements.plist

查看描述文件,找到權限信息

security cms -D -i embedded.mobileprovision

<dict>...</dict>的內容,復制到entitlements.plist文件中

將項目中的entitlements.plist文件,拷貝到.app文件的平級目錄下

使用重簽名的賬號和權限文件簽名App

codesign -fs "iPhone Developer: XXX2 (79DN9L6XXX)" --no-strict --entitlements=entitlements.plist WeChat.app
-------------------------
WeChat.app: replacing existing signature

使用codesign命令,查看應用的簽名信息

codesign -vv -d WeChat.app
-------------------------
Executable=/Users/zang/Zang/Spark/LG/11/wx7.0.8/Payload/WeChat.app/WeChat
Identifier=com.feng.drivingtrain
Format=app bundle with Mach-O thin (arm64)
CodeDirectory v=20400 size=972537 flags=0x0(none) hashes=30383+5 location=embedded
Signature size=4793
Authority=iPhone Developer: XXX2 (79DN9L6XXX)
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=Apr 21, 2021 at 13:38:17
Info.plist entries=68
TeamIdentifier=ZH6L37455T
Sealed Resources version=2 rules=10 files=1143
Internal requirements count=1 size=184
  • 確認簽名已成功替換

將重簽名后的App安裝到手機

案例6:

勾選Automatically manage signing選項的差異

當項目勾選Automatically manage signing選項,查看描述文件中的權限信息

security cms -D -i embedded.mobileprovision
  • application-identifierZH6L37455T.*
  • 案例5中,未勾選Automatically manage signing,顯示為ZH6L37455T.com.feng.drivingtrain

繼續后面的流程,將重簽名后的App安裝到手機

  • 問題出現了,覆蓋安裝,提示Unable to install

這種情況,需要先刪除手機中的App

再次安裝,重簽名后的App可以順利的安裝到手機上

復制權限信息的步驟,一定要檢查application-identifier

  • ZH6L37455T.*:無法覆蓋安裝
  • ZH6L37455T.com.feng.drivingtrain:可覆蓋安裝

案例7:

Debug重簽名App

在手機上運行App

選擇Debug -> Attach to Process,找到對應App

  • 出現重復App,選擇進程號較大的

使用Debug View Hierarchy開始調試

Xcode重簽名

Xcode重簽名步驟:

1、刪除插件和帶有插件的.app包(比如Watch

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

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

4、info.plist文件中替換BundleIDBundleID要和描述文件中的ID保持一致

5、將App包拷貝到Xcode工程目錄中,剩下的交給Xcode

案例1:

利用Xcode重簽名

創建和重簽名App同名工程

真機編譯并運行

刪除插件和帶有插件的.app包,刪除PlugIns目錄和Watch目錄

Frameworks里面的庫進行重簽名

給可執行文件+x可執行權限

info.plist文件中替換BundleID

將修改后的App包,替換項目中的包

直接通過Xcode運行項目即可

Shell腳本

Shell是一種特殊的交互式工具,它為用戶提供了啟動程序、管理文件系統中文件以及運行在系統上的進程的途徑。Shell一般是指命令行工具。它允許你輸入文本命令,然后解釋命令,并在內核中執行。

Shell腳本,也就是用各類命令預先放入到一個文本文件中,方便一次性執行的一個腳本文件。

.bashrc.bash_profile.zshrc作用與區別

在使用命令行工具時,我們可能會遇到一些教程,可能需要你把一些配置寫入到.bashrc.bash_profile或者.zshrc等。那么這幾個文件到底有什么作用和區別?

從文件名稱判斷.bashrc.bash_profile是給bash來使用的。而.zshrc是給zsh來使用的

查看bash版本:

bash
-------------------------
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
bash-3.2$

查看zhs的安裝路徑:

which zsh
-------------------------
/bin/zsh

查看bash的安裝路徑:

which bash
-------------------------
/bin/bash

zsh切換bash,重新打開終端即可

chsh -s /bin/bash

bash切換zsh,重新打開終端即可

chsh -s /bin/zsh

配置建議

bash

  • 將配置選項放到~/.bashrc中,然后在~/.bash_profile中通過source調用

zsh

  • 建議仍然將配置選項放到~/.bashrc~/.bash_profile中通過source調用,最后在~/.zshrcsource調用~/.bash_profile

運行方式

$source x.sh

  • 在當前Shell環境中讀取并執行x.sh中的命令
  • 命令可以強行讓一個腳本去立即影響當前的環境(一般用于加載配置文件)
  • 命令會強制執行腳本中的全部命令,而忽略文件的權限

$bash x.sh$zsh x.sh

  • 重新建立一個子Shell,在子Shell中執行腳本里面的句子

$./x.sh

  • 讀取并執行文件中的命令。但有一個前提,腳本文件需要有可執行權限
用戶、組、權限

UnixLinux都是多用戶、多任務的系統,所以這樣的系統里面就擁有了用戶、組的概念。那么同樣文件的權限也就有相應的所屬用戶和所屬組了。

windowsmacOS,不同系統的目錄結構

  • windows,偽多用戶模式,目錄分為不同磁盤,所有用戶都可以訪問到
  • macOS,真正的多用戶模式,在home目錄下分為不同的用戶,每個用戶都有自己獨立的桌面、文檔、下載

macOS下不同用戶還可以進行分組,所以它的文件權限設置就會相對復雜

查看文件屬性

ls -l
-------------------------
total 412368
-rw-r--r--@ 1 zang  staff  210766049 11 26  2019 wx7.0.8.ipa
drwxr-xr-x  2 zang  staff         64  4 21 17:21 未命名文件夾
  • [權限] [連接] [所有者] [所屬組] [文件大小] [最后修改日期] [文件名稱]

文件類型與權限(permission

第一個字母:文件類型,常見:

  • d:目錄(directory
  • -:文件

一個文件的完整權限,總共分為三組:

  • 第一組:文件所有者的權限
  • 第二組:這一組其他用戶的權限
  • 第三組:非本組用戶的權限

每一組文件權限的rwx-表示:

  • r:讀(read
  • w:寫(write
  • x:執行(execute
  • 這三個權限的位置不會變,依次是rwx
  • 出現-在對應位置,代表沒有此權限

修改權限

文件權限的改變使用chmod命令

設置方法有兩種:

  • 數字類型
  • 符號類型

文件權限分為三種身份:[user] [group] [other]

三種權限分別為:[read] [write] [execute]


數字類型:

各個權限數字對照:

  • r41左移2
  • w21左移1
  • x11左移0

轉為二進制:

  • r0100
  • w0010
  • x0001

使用這種設計方式,不同權限可以按位或,哪一位為1表示有該權限存在。在開發中,適用于多個選項的位移枚舉,使用按位或就能得到最終結果

例如:一個文件權限為-rwxr-xr-x

  • User4 + 2 + 1 = 7
  • Group4 + 0 + 1 = 5
  • Other4 + 0 + 1 = 5

使用命令:

chmod 755 file

例如:刪除所有用戶組的所有權限

chmod 000 file

符號類型:

chmod `[u、g、o、a]` `[+、-、=]` `[r、w、x]` file

用戶組:

  • uUser
  • gGroup
  • oOther
  • aAll,不設置默認為a

操作:

  • +:加入
  • -:除去
  • =:設置

權限:

  • r:讀
  • w:寫
  • x:執行

例如:對文件所有用戶組增加可執行權限

chmod a+x file

例如:刪除其他用戶的所有權限

chmod o=- file

例如:當前用戶具有所有權限,組用戶有讀寫權限,其他用戶只有讀權限

chmod u=rwx,g=rw,o=r file
腳本自動重簽名

案例1:

搭建WeChat項目,使用真機運行一次空項目

在項目根目錄,創建rsign.sh文件

rsign.sh文件增加可執行權限

chmod a+x rsign.sh

在項目根目錄,創建APP文件夾

wx7.0.8.ipa拷貝到APP文件夾

打開rsign.sh文件,寫入以下代碼:

【準備工作】:定義變量

TEMP_PATH="${SRCROOT}/Temp"
ASSETS_PATH="${SRCROOT}/APP"
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
  • ${SRCROOT}:工程文件所在的目錄
  • TEMP_PATH:臨時目錄,將ipa包解壓到Temp目錄
  • ASSETS_PATH:資源文件夾,提前在工程目錄下新建一個APP文件夾,里面放ipa
  • TARGET_IPA_PATH:目標ipa包路徑

清空Temp文件夾

rm -rf "${SRCROOT}/Temp"
mkdir -p "${SRCROOT}/Temp"

【第一步】:解壓ipa包到Temp目錄

unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"

拿到解壓的臨時的App的路徑

TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")

【第二步】:將解壓出來的.app拷貝進入工程下

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"
  • $BUILT_PRODUCTS_DIR:工程生成的App包的路徑
  • $TARGET_NAMEtarget名稱

【第三步】:刪除ExtensionWatchApp

rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"
  • 個人證書無法簽名Extention

【第四步】:更新info.plist文件CFBundleIdentifier

/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
  • 格式:"Set :KEY Value" "目標文件路徑"

【第五步】:給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"
  • APP_BINARY:拿到MachO文件的路徑

【第六步】:重簽名第三方FrameWorks

TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do

【第七步】:用權限文件簽名App

/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"

來到項目,點擊Target,選擇Build Phases,在Run Script中輸入:./rsign.sh

真機運行項目,App安裝成功

Xcode配合腳本實現自動重簽名,App在非越獄設備上也能正常運行

案例2

安裝更高版本App

從某人越獄設備上導出砸殼后的wx8.0.2.ipa,拷貝到APP文件夾

真機運行項目,App安裝成功,但運行時報錯

解壓ipa包,進入App目錄,打開info.plist文件

  • 由于砸殼后ipa做了瘦身,一些支持的設備在info.plist里顯示不全,只需要刪除info.plistUISupportedDevices節點即可

刪除UISupportedDevices節點后,將解壓后的Payload文件夾,重新打包成ipa

zip -ry wx8.0.2.ipa Payload

再次運行項目,App運行成功

總結

codesign重簽名

  • 刪除不能簽名的文件:ExtentionWatch(包含了Extention
  • 重簽名Frameworks里面的庫
  • 給可執行文件+x可執行權限
  • 新建工程,真機編譯并運行,將描述文件安裝到手機。將描述文件拷貝到.app包中
  • 修改info.plist文件的BundleID
  • 通過授權文件重簽.app
  • 最后通過Xcode安裝

Xcode重簽名

  • 刪除不能簽名的文件:ExtentionWatch(包含了Extention
  • 重簽名Frameworks里面的庫
  • 給可執行文件+x可執行權限
  • 修改info.plist文件的BundleID
  • App包拷貝到Xcode工程目錄中,剩下的交給Xcode

Shell

  • 切換Shell使用chsh -s Shell路徑命令
  • 現在macOS中默認Shellzsh,早期是bash
  • Shell啟動時初始化的配置文件:
    zsh.zshrc
    bash.bash_profile

文件權限和用戶組

  • 每個文件都有所屬的用戶、組、其他
  • 文件權限歸屬:用戶、組、其他
  • 權限:寫、讀、執行

修改權限

  • 使用chmod命令
  • 數字類型:
    r4
    w2
    x1
  • 符號類型:
    用戶組:u:用戶,g:組,o:其他,a:所有
    操作:+:添加,-:去掉,=:設置
    權限:r:讀,w:寫,x:執行
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容