1. 程式人生 > IOS開發 >iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)

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

前言:

  • 玩逆向的目的 ?

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

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

提示 :

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

廢話不多說,開始.

iOS 應用簽名原理

簽名

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

程式碼簽名

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

其具體驗證措施如下 :

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

蘋果的應用安裝需求

iOS 出來之前,以前的主流作業系統( Mac/Windows ) 軟體隨便從哪裡下載都能執行,系統安全存在隱患,盜版軟體,病毒入侵,靜默安裝等等 . 那麼蘋果希望解決這樣的問題,要保證每一個安裝到 iOS

上的 APP 都是經過蘋果官方允許的,怎樣保證呢 ? 就是通過程式碼簽名。

那麼首先怎麼實現呢 ?

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

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

iOS 應用簽名流程

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

1. 開發時期,申請證書

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

  • MAC 通過鑰匙串訪問生成請求 CSR

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

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

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

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

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
複製程式碼

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

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

往下找到一個 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 下載的應用開啟的解決辦法就不再介紹了. 設定 - 安全性與隱私 / 或者使用終端都可以 .

找到越獄應用下載微信

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

檢視檔案

應用簽名

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

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

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

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

MachO 檔案

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

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

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

命令 : otool -l WeChat .

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

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

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

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

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

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

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

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

還完全沒有證書的小夥伴

先去申請一個吧,另外記得要選擇 iPhone,不要選成了 Mac.

步驟2 : 刪外掛

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

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

步驟3 : 重籤 FrameWork

  • 進入 FrameWork 資料夾

  • 利用 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. 安裝成功之後,把這個描述檔案放到微信的包中.

步驟6 : 更改 Bundle ID

  • 微信包中找到 Info.plist
  • 修改 Bundle identifier
    • com.tencent.xin 改為你自己剛剛新建工程的 Bundle identifier 我這裡為 com.libin.WeChatDemo

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

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

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

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

    為了確保無誤 可再次 Open As Property List 檢視下. 其實就是為了得到一個 plist 檔案備用. 也可以用其它方式.

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

  • 重點 : 重籤命令 --

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

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

見證奇蹟的時刻

  • cmd + shift + 2

  • 點選加號,選擇我們的微信包. (注意這一步之前最好檢查下 微信包中 Bundle ID 有沒有換成自己工程的,防止原版微信被替換了 )

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

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

簡單除錯

開啟附加,注意,如果你跟我一樣有兩個微信,那麼哪個後開,哪個程序數字較大 . 因此自己判定哪個是冒牌的就好.

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

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

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