iOS逆向工程(8)菜鳥也能懂的iOS簽名機制

為了方便廣大網(wǎng)友手動砸殼和鑒于目前 PP 助手已經(jīng)下載不到脫殼的應用還有 itunes 新版本也不支持下載 ipa 了梦重,所以個人跟朋友一起只做了款青,自動化免費砸殼平臺 - www.dumpapp.com ,希望多多支持。

一症脂、iOS 簽名機制的目的


  • 在 iOS 出來之前涝涤,在主流操作系統(tǒng)(Mac/Windows/Linux)上開發(fā)和運行軟件是不需要簽名的媚狰,軟件隨便從哪里下載都能運行,導致平臺對第三方軟件難以控制阔拳,盜版流行崭孤。

  • 蘋果希望解決這樣的問題,在 iOS 平臺對第三方 APP 有絕對的控制權糊肠,一定要保證每一個安裝到 iOS 上的 APP 都是經(jīng)過蘋果官方允許的辨宠,怎樣保證呢?就是通過簽名機制货裹。

二嗤形、iOS 簽名機制的實現(xiàn)


1. iOS 上架 APP,簽名證書的過程

(1)生成 CertificateSigningRequest.certSigningRequest 文件
(鑰匙串 --- 從證書頒發(fā)機構請求證書 ---- 生成)

(2)獲得 ios_development.cer / ios_distribution.cer 證書
(需要上傳 CertificateSigningRequest.certSigningRequest 文件)

(3)注冊設備弧圆,添加 Appid (生成描述文件的準備)

(4)獲得 *.mobileprovision 文件
(需要選擇 appid赋兵,devices笔咽,cer證書 等文件)

2. iOS APP 簽名流程圖

(1)iOS 簽名 通過Mac 公鑰Apple 私鑰 進行加密生成公鑰證書

(2)然后加上 appid霹期,devices叶组,cer 證書entitlements 然后再次用 Apple 私鑰 進行加密 生成 mobileprovision 文件

(3)然后 再加上 APP 二進制的 簽名APP 二進制历造,最后就是最終ipa安裝包的組成甩十。

三、iOS 簽名 APP 的組成


1. cer 證書的生成與組成

(1)生成Mac設備的公私鑰(通過證書助理)

生成 CertificateSigningRequest.certSigningRequest文件
(鑰匙串 --- 從證書頒發(fā)機構請求證書 ---- 生成)

(2)獲得證書

從開發(fā)者平臺 上傳Mac電腦生成的 CSR 文件吭产,獲得 ios_development.cer / ios_distribution.cer 證書

總結 - cer 證書的組成

  • 證書 = 利用 Apple 后臺的私鑰侣监,對 Mac 設備生成的公鑰進行簽名后的生成的 cer 證書文件
  • Mac公鑰 = CertificateSigningRequest.certSigningRequest
  • Apple私鑰 = Apple后臺生成

2. mobileprovision 描述文件的生成

(1)從開發(fā)者平臺 選擇 appid + devices + 證書 生成的 描述文件
(2)mobileprovision 證書的組成

Mobileprovision = 證書 + devices + appid + entitlements + Apple私鑰加密簽名

總結 App 構成

APP = APP + Mac私鑰加密簽名
ipa安裝包 = APP + mobileprivision

AppStore 的下載安裝驗證

如果APP是從AppStore下載安裝的垮刹,你會發(fā)現(xiàn)里面是沒有mobileprovision文件的
它的驗證流程會簡單很多:直接用 Apple的公鑰 去驗證 簽名 然后獲取到 APP达吞。

四、如何手動重簽名一個 APP


1. 為什么需要重簽名

一旦改變了應用的二進制文件荒典,或者增加修改了里面的資源酪劫,或者修改了包名 等,應用本身的簽名就會被破壞寺董。

如果還要想將修改后的 ipa 安裝到手機上覆糟,就需要對應用做重簽名,讓 ipa 包和簽名保持一致遮咖。
(其實就是手動完成 Xcode 簽名)

當然如果是越獄手機在 cydia 中安裝了 appsync 插件后也可以去掉蘋果的簽名驗證滩字,進行隨意安裝 ipa。不過大多數(shù)人的手機都是非越獄的御吞,所以想要修改 ipa 就必須重簽名操作麦箍。

2. ipa 包中 需要重簽名的文件

.app 包內部的所有動態(tài)庫(.framework、.dylib)陶珠、AppExtension(PlugIns文件夾挟裂,拓展名是appex)、WatchApp(Watch文件夾)都需要重新簽名揍诽。

一般 PlugIns 和 Watch 文件夾 可以進行刪除操作诀蓉。

3. 重簽名的步驟 - 概述版

  1. 下載 ipa,對 ipa 進行脫殼暑脆,解壓 ipa 得到 Payload 文件夾(確保 ipa 是脫殼后的才能進行重簽名)
  2. 進入 Payload 中的 .app 文件夾中渠啤,刪除 PlugInsWatch 文件夾(如果有這兩個文件夾的話無法進行簽名,需要進行刪除)
  3. 刪除info.plist中的 UISupportedDevices 字段(如果有此字段會存在安裝 ipa 失敗的情況)
  4. 如果有需要添吗,修改BundleId 或者包名字沥曹,或者針對app 進行逆向hook 注入動態(tài)庫 修改。
  5. 使用 security 命令 獲取當前證書的序號根资,然后獲取對應證書的 mobileprovision文件架专。
  6. 獲取 mobileprovision 文件中 的 entitlements.plist 放到 .app 同級目錄下同窘。
  7. 使用 codesign 命令 對 APP 中資源framework等進行 簽名
  8. 使用 codesign 命令部脚,對整個.app 文件 用 entitlements.plist 進行重簽名想邦。
  9. 使用 zip 命令 打包 Payload.ipa 文件。

使用個人證書重簽名的時候委刘,必須保持 重簽名包 info.plist 里的 bundleid 和 描述文件生成中的 bundleid 一致丧没。

4. 重簽名步驟 - 簡化版

(1)準備一個embedded.mobileprovision文件(appid、device一定要匹配)锡移,并放入.app包中

可以通過 Xcode自動生成呕童,然后在編譯后的APP包中找到∠海或者在開發(fā)者證書網(wǎng)站生成下載夺饲。

(2)從embedded.mobileprovision文件中提取出entitlements.plist權限文件

security cms -D -i embedded.mobileprovision > temp.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist

(3)查看可用的證書

security find-identity -v -p codesigning

(4)對.app內部的動態(tài)庫、AppExtension等進行簽名

codesign -fs   證書ID   xxx.dylib

(5)對.app包進行簽名

codesign -fs 證書ID  --entitlements entitlements.plist xxx.app

五施符、重簽名的步驟 -- 詳細演示操作


下面以 《LIANKS》 這個 app 演示重簽名往声。

脫殼后的 ipa 可從 www.dumpapp.com 進行獲取

1. 準備工作

(1)獲取 ipa,解壓 Payload 文件夾

下載 ipa戳吝,對 ipa 進行 脫殼解壓 ipa 得到 Payload 文件夾(需要確保 ipa 是脫殼后的才能進行重簽名)

(2)刪除無用文件夾

進入 Payload 中的.app 文件夾中浩销,刪除 PlugInsWatch 文件夾。

如果有這兩個文件夾的話無法進行簽名听哭,需要進行刪除慢洋。

rm -r PlugIns
rm -r Watch
(3)刪除APP的 info.plist 中的 UISupportedDevices 字段

如果有此字段會存在安裝 ipa 失敗的情況

/usr/libexec/PlistBuddy -c "Delete :UISupportedDevices" info.plist
(4)對 ipa 進行修改,破壞簽名陆盘。

如果有需要普筹,修改 BundleId 或者包名字,或者針對app 進行逆向 hook 修改注入動態(tài)庫隘马。

/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.lianks.client3" Info.plist 
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName 重簽名 APP" Info.plist 
/usr/libexec/PlistBuddy -c "Set :CFBundleName 重簽名 APP2" Info.plist 

記住斑芜,使用個人證書重簽名的時候,必須保持 重簽名包 info.plist 得到 bundleid 和 描述文件mobileprovision 生成中的 bundleid 一致祟霍。

(5)使用個人證書,新建項目盈包,編譯獲取證書對應 mobileprovision

新建一個新的項目工程沸呐,然后選擇對應的 team 生成對應的個人證書,然后 編譯后進入 Products 下呢燥,找到編譯后的 .app 進入后崭添,獲取對應的 mobileprovision 文件。

獲取對應的 mobileprovision 文件后叛氨,把 mobileprovision 放到 Payload 文件夾下呼渣。

如果自己手里有 P12 證書 和 對應 mobileprovision 文件棘伴,那么可以直接使用對應的mobileprovision 文件,只要確保 證書 和 mobileprovision 文件對應屁置。

獲取 mobileprovision 文件中 的 entitlements.plist 放到 .app 同級目錄下焊夸。

當對整個 app 進行簽名,所以需要用到 mobileprovision 中的 entitlements 描述蓝角。

下面演示是如何從 mobileprovision 提取 entitlements.plist 的方法

security cms -D -i embedded.mobileprovision > temp.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
(6)使用 security 命令 獲取當前證書的 ID阱穗。然后獲取對應證書的 mobileprovision文件。

例如證書 ID:D575192406813F8C403E9F419F6C7EB59FE5B6B7 "Apple Development: Dasen Zhang (YL8475CD7Q)"

security find-identity -v -p codesigning

2. 正式開始簽名

這個時候我們已經(jīng)拿到 D575192406813F8C403E9F419F6C7EB59FE5B6B7證書 ID 和 entitlements.plist 描述文件使鹅,然后就可以 對 app 內 framework 等資源進行簽名了揪阶。

(1)使用 codesign 命令 對 APP 中資源framework,dylib等進行 簽名患朱。
執(zhí)行簽名命令:
codesign -fs D575192406813F8C403E9F419F6C7EB59FE5B6B7 *.*
(2) 最后使用 codesign 命令鲁僚,對整個.app 文件 用 entitlements.plist 進行重簽名。
codesign -fs D575192406813F8C403E9F419F6C7EB59FE5B6B7 --entitlements entitlements.plist HiFi\ Pro.app
(3)對Payload 文件夾進行壓縮成 ipa裁厅,進行安裝測試

壓縮完成后冰沙,就可以用愛思助手進行安裝

zip -ry hifi.ipa Payload
(4) 使用愛思注入進行導入測試
(5)安裝成功

這個時候發(fā)現(xiàn)能夠安裝成功,并且名字已經(jīng)變了姐直,說明我們已經(jīng)重簽名成功了倦淀。

六、其它簽名方法

對 iOS ipa 進行簽名目前已經(jīng)有很多工具了声畏,其實這些工具底層都是根據(jù)手動簽名的原理進行了封裝和自動化撞叽。

iOS App Signer

https://github.com/DanTheMan827/ios-app-signer

  • 可以對.app重簽名打包成ipa
  • 需要再.app包中提供對應的embedded.mobileprovision文件

iReSign

https://github.com/maciekish/iReSign

  • 可以對ipa進行重簽名
  • 需要提供entitlements.plist、embedded.mobileprovision文件的路徑

LTResign

https://github.com/gltwy/LTResign

  • 可以對ipa進行重簽名插龄,一款基于 Python 寫的腳本
  • 需要提供embedded.mobileprovision文件的路徑·
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末愿棋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子均牢,更是在濱河造成了極大的恐慌糠雨,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徘跪,死亡現(xiàn)場離奇詭異甘邀,居然都是意外死亡,警方通過查閱死者的電腦和手機垮庐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門松邪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哨查,你說我怎么就攤上這事逗抑。” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵邮府,是天一觀的道長荧关。 經(jīng)常有香客問我,道長褂傀,這世上最難降的妖魔是什么忍啤? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮紊服,結果婚禮上檀轨,老公的妹妹穿的比我還像新娘。我一直安慰自己欺嗤,他們只是感情好参萄,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著煎饼,像睡著了一般讹挎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吆玖,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天筒溃,我揣著相機與錄音,去河邊找鬼沾乘。 笑死怜奖,一個胖子當著我的面吹牛,可吹牛的內容都是我干的翅阵。 我是一名探鬼主播歪玲,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掷匠!你這毒婦竟也來了滥崩?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤讹语,失蹤者是張志新(化名)和其女友劉穎钙皮,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顽决,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡短条,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了才菠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慌烧。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鸠儿,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤进每,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布汹粤,位于F島的核電站,受9級特大地震影響田晚,放射性物質發(fā)生泄漏嘱兼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一贤徒、第九天 我趴在偏房一處隱蔽的房頂上張望芹壕。 院中可真熱鬧,春花似錦接奈、人聲如沸踢涌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽睁壁。三九已至,卻和暖如春互捌,著一層夾襖步出監(jiān)牢的瞬間潘明,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工秕噪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钳降,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓腌巾,卻偏偏與公主長得像遂填,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子壤躲,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容