iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

李斌同學發表於2019-10-18

前言:

  • 玩逆向的目的 ?

    • 為了應用安全 , 我們首先要知道 Hackers 都是怎麼做的 , 他們如何做到可以除錯我們的應用 . 在此基礎上我們才能知道如何更有效的進行防護.
  • 在逆向的路上 , 很重要的一步就是應用重簽名 , 以此達到除錯別人應用的目的.

  • 想知道如何重簽名 , 首先要知道 iOS 應用簽名的原理 .

提示 :

本篇文章建立在對加密和簽名有一定了解的基礎上 . 如不太熟悉建議閱讀前一篇部落格 RSA加密原理&密碼學&HASH 或者其他密碼學以及簽名文章.

廢話不多說 , 開始.

iOS 應用簽名原理

簽名

為什麼用簽名這個詞 . 因為老外喜歡用支票 , 支票上面的簽名能夠證明這玩意是你的 . 那麼數字簽名顧名思義 , 就是用於鑑別數字資訊的方法

程式碼簽名

程式碼簽名是對可執行檔案或指令碼進行數字簽名 . 用來確認軟體是被認可的 , 且在簽名後未被修改或損壞的措施。和數字簽名原理一樣 , 只不過簽名的資料是程式碼而已.

其具體驗證措施如下 :

釋出者 將原始碼雜湊後的 HASH 值使用私鑰進行加密然後和原始碼一起產生一個軟體包 . 那麼 驗證端/使用端 收到後使用公鑰解密拿到 HASH , 並使用 HASH 演算法對原始碼進行雜湊 , 將得到的結果進行比對 , 如果一致 , 則說明資料沒有被篡改過 , 並且確實是由釋出者釋出的應用 .

蘋果的應用安裝需求

iOS 出來之前 , 以前的主流作業系統( Mac/Windows ) 軟體隨便從哪裡下載都能執行 , 系統安全存在隱患 , 盜版軟體 , 病毒入侵 , 靜默安裝等等 . 那麼蘋果希望解決這樣的問題,要保證每一個安裝到 iOS 上的 APP 都是經過蘋果官方允許的,怎樣保證呢 ? 就是通過程式碼簽名。

那麼首先怎麼實現呢 ?

  • 蘋果伺服器有一個私鑰 , 每臺裝置上有一個公鑰 . 以此來保證每個安裝的應用都是經過蘋果伺服器的允許的 .

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

這樣確實可以保證 , 但是我們還有開發者 , 需要通過 Xcode 在開發階段就能安裝應用 , 另外還有企業證書 . 所以 實際上 , 蘋果的簽名機制是雙層簽名.

iOS 應用簽名流程

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

整個完整流程如上圖 , 接下來我們結合實際操作來剖析一下其原理 .

1. 開發時期 , 申請證書

在我們希望安裝開發好的程式到 iPhone 上時 , 我們都知道需要去開發者中心配置一下證書 .

  • MAC 通過鑰匙串訪問生成請求 CSR 檔案. 這一步驟其實就是 MAC 生成了一對 公私鑰M , 將 公鑰M 放到請求檔案 CSR 中上傳給蘋果伺服器 .

  • 蘋果伺服器利用 私鑰A公鑰M 進行數字簽名 ( 其實就是對 公鑰M 值進行非對稱加密 , 然後儲存了 公鑰MHASH) , 生成的結果就是 證書 .

  • 然後使用者繼續新增裝置 UDID , 選擇證書 , 配置所需許可權 . 生成描述檔案 .

  • 當使用者下載下來 / Xcode 自動管理把證書下載下來之後 , 鑰匙串訪問就會將證書和 MAC 中的 私鑰M( 就是我們所熟知的 p12 ) 進行關聯 .

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

2. 編譯安裝

Xcode 在我們選擇好了描述檔案和開發者賬戶進行編譯時 :

  • 首先 , Xcode 會利用證書鎖所關聯的 私鑰M , 對 APP 進行程式碼簽名 ( 將原始檔的 HASH 值通過 私鑰M 進行加密 ) . 然後會把描述檔案和簽名 以及可執行檔案 MachO 一起打包 .

  • 當這個步驟完成 . iPhone 手機要對該軟體包進行校驗 .

    • 首先 , 蘋果根據 iOS 系統中的 私鑰A 對描述檔案中的證書進行解密校驗 . 通過則意味著這個證書是蘋果頒發的 , 也就是說是被許可的 .
    • 當第一步完成解密 , 就拿到了 公鑰M , 然後進行 HASH 校驗是否被篡改過 .
    • 拿到 公鑰M 之後 , 使用 公鑰M 去驗證 APP 的簽名 , 以此來驗證 這個證書是不是這個 APP 的. ( 這也就是為什麼別的小夥伴生成的證書需要把 p12 發給其他人來真機除錯的原因 . )
    • 然後校驗 UDID 等等.

這就是 iOS 應用完整的雙層簽名流程了. 講完簽名原理 , 不急著研究重簽名 , 先打下點基礎知識 , 來看看描述檔案 .

描述檔案

那麼我們來看一下描述檔案到底是個啥東西.

開啟目錄

/Users/**你的名字**/Library/MobileDevice/Provisioning Profiles
複製程式碼

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

隨便選擇一個 , 使用終端檢視

security cms -Di 0b7f1352-7a1e-4800-b52b-f2fc35e550dd.mobileprovision
複製程式碼

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

往下找到一個 entitlementskey 和其 value .

<key>Entitlements</key>
	<dict>
	<key>aps-environment</key>
		 <string>development</string>
	<key>application-identifier</key>
		 <string>4NJV3PZG3A.com.libin.WMXJ</string>
	<key>keychain-access-groups</key>
		 <array>
		    <string>4NJV3PZG3A.*</string>
		 </array>
	<key>get-task-allow</key>
		 <true/>
	<key>com.apple.developer.team-identifier</key>
		 <string>4NJV3PZG3A</string>
	</dict>
複製程式碼

這個 entitlements 就是權力配置 , 在重簽名中會使用到. 描述檔案中還包含了所有 APP 的配置內容 , 大家有興趣可以一一檢視.

那麼 , 蘋果是如何簽名的我們知道了 . 那問題來了 , 如何去做重簽名 ?

iOS 應用重簽名

其實 iOS 應用簽名部分都是利用了 CodeSign 來完成的 . 我們可以利用終端來自己進行簽名 .

目前市面上也有許多應用可以視覺化完成重籤 或者一鍵重籤 . 或者利用寫好的 shell 指令碼來玩 . 對於初學者 . 個人建議還是按照最基礎的方式操作幾遍 , 理解了其原理 , 在使用其他工具碰到為題也比較好處理 , 當然 , 本篇文章會介紹如何手寫 shell 來完成重簽名. .

準備工具 / 包

pp助手

pp助手 for Mac : 用來下載砸完殼的應用.

下載完成開啟 , 被阻攔非 App Stroe 下載的應用開啟的解決辦法就不再介紹了. 設定 - 安全性與隱私 / 或者使用終端都可以 .

找到越獄應用下載微信

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

下載 ipa 完成 , 重新命名為 zip , 解壓縮 找到 Payload - WeChat.

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

檢視檔案

應用簽名

弄了半天 , 我們先來看看這個東西 . Iterm2 / 終端命令:

codesign -vv -d WeChat.app
複製程式碼

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

其中有一項 : Authority , 就是應用簽名 .

那麼我們現在要用我們自己的證書 去重新簽名 .

MachO 檔案

WeChat 檔案顯示包內容 , 找到一個黑框框 WeChat 檔案.

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

這個就是我們經常提到的 MachO 檔案了 . 後續我會專門講解它 以及如何仔細檢視.

現在我們先來簡單檢視一下 , 利用 otool 工具.

命令 : otool -l WeChat .

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

內容比較多 , 我們重定向一下 , 寫到一個檔案裡.

命令 : otool -l WeChat > /Users/libin/Desktop/iOS進階邏輯課程/逆向/WeChatMaCho.txt ( 名稱和路徑隨便 ) .

寫完後我們開啟檔案 , 搜尋 cryptid ,

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

注意 : cryptid0 , 代表你下載的是砸過殼的 , 而一般應用是 1 , 也就是加密過的 , 其實就是 AppStore 使用的對稱性加密 , iPhone 在執行的時後解密 ( 並非安裝時就解密 ) .

寫了這麼多 , 終於要開始重簽名了 . GO -->

步驟1 : 檢視自己電腦上證書

命令: security find-identity -v -p codesigning . 選擇一個 , 複製下來 .

這裡我就不列舉筆者自己的了.

還完全沒有證書的小夥伴

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)
先去申請一個吧 , 另外記得要選擇 iPhone , 不要選成了 Mac.

步驟2 : 刪外掛

  • 開啟 WeChat , 顯示包內容 . 找到 PlugIns 資料夾, 直接刪除 外掛普通賬號是籤不了的 .

  • 找到 Watch 資料夾 , 因為這裡也有外掛 , 我們暫時不需要 Watch , 直接刪掉.

步驟3 : 重籤 FrameWork

  • 進入 FrameWork 資料夾

    iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

  • 利用 CodeSign , 使用我們的證書進行重簽名.

    • codesign -fs "剛剛複製的你自己的證書名字" 要重籤的FrameWork名稱
    • 例如: codesign -fs "iPhone Developer: ha ha (123456)" andromeda.framework
    • FrameWork 資料夾下所有的庫全部重籤.

步驟4 : 確保 MachO 執行許可權

最簡單的方式就是預覽框中 , 黑色就代表可執行 , 灰色就代表不可執行 .

或者 命令 : ls -l WeChat , 結果是 -rwxr-xr-x 或者其他許可權.

如果沒有可執行許可權 , 也就是 x 許可權 , 可以通過 chmod +x WeChat 新增許可權.

( 關於 Linux 許可權和命令這塊兒如果大家不是很清楚 , 留言一下 , 我後面補一篇文章詳細講講 , 畢竟有些面試還是會問 , 不能只知道一個 777 , 因為很多是已經知道了 , 本文就暫不贅述了 )

步驟5 : 給包新增描述檔案

因為我們下載的是上線包 , 肯定是沒有描述檔案這種東西在包裡的 . 因此我們需要自己生成一個 .

    1. 開啟 Xcode , 新建工程 我這裡取名 WeChatDemo . 然後選擇真機 , 選擇開發者 , 自動 / 手動管理都可以 , 我這裡勾選自動 , 然後執行 , 把這個空工程安裝到手機上.
    1. 安裝成功之後 , 把這個描述檔案放到微信的包中.
      iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)
      iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

步驟6 : 更改 Bundle ID

  • 微信包中找到 Info.plist
    iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)
  • 修改 Bundle identifier
    • com.tencent.xin 改為你自己剛剛新建工程的 Bundle identifier 我這裡為 com.libin.WeChatDemo

步驟7 : 通過授權檔案(Entilements)重籤.app包

  • 利用上文中我們說的檢視描述檔案方法 , 檢視我們剛剛拷貝到微信包裡的描述檔案 . 也就是我們自己空工程生成的描述檔案. 找到權力檔案部分

    iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

  • 開啟我們剛剛新建的 Xcode 工程 , 新建一個 Plist 檔案 , Open As Source Code

    iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

  • 把上上圖中描述檔案的權利檔案部分複製 , 貼上到新建的 Plist 中 ,

    iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)
    為了確保無誤 可再次 Open As Property List 檢視下. 其實就是為了得到一個 plist 檔案備用. 也可以用其它方式.

  • 新建的 Plist 寫好後 , Show In Finder . 將其放到微信包同路徑中 , 方便操作.

    iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

  • 重點 : 重籤命令 --

codesign -fs "iPhone Developer: haha (123456)" --no-strict --entitlements=ent.plist WeChat.app

(注意替換自己的證書 , 檔案)

見證奇蹟的時刻

  • cmd + shift + 2

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

  • 點選加號 , 選擇我們的微信包. (注意這一步之前最好檢查下 微信包中 Bundle ID 有沒有換成自己工程的 , 防止原版微信被替換了 )
    iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

注意看 , 手機上之前那個空工程變成了微信了 . ( 注意如果有安裝失敗的同學 , 先檢查自己步驟有無錯誤 , 如沒有 可嘗試不使用 Xcode 自動生成證書以及描述檔案 , 自己去開發者中心配置 , 選擇.)

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

點選冒牌微信開啟 , 微信專案啟動了.

簡單除錯

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)
開啟附加 , 注意 , 如果你跟我一樣有兩個微信 , 那麼哪個後開 , 哪個程式數字較大 . 因此自己判定哪個是冒牌的就好.

選擇之後 注意看上方狀態列 , 變成 running 就好

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

然後就可以使用 view debug / LLDB , 新增符號斷點等等除錯方法了 .

iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

由於篇幅問題 , 本文不多贅述了 , 後面會補充 shell 指令碼自動重籤實現 , 直接更換包實現 , 後續會繼續就程式碼注入 等方面展開 .

相關文章