前言:
玩逆向的目的 ?
- 為了應用安全 , 我們首先要知道
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
值進行非對稱加密 , 然後儲存了公鑰M
的HASH
值) , 生成的結果就是 證書 . -
然後使用者繼續新增裝置
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
複製程式碼
往下找到一個 entitlements
的 key
和其 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
,
注意 : cryptid
是 0
, 代表你下載的是砸過殼的 , 而一般應用是 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 : 給包新增描述檔案
因為我們下載的是上線包 , 肯定是沒有描述檔案這種東西在包裡的 . 因此我們需要自己生成一個 .
-
- 開啟
Xcode
, 新建工程 我這裡取名WeChatDemo
. 然後選擇真機 , 選擇開發者 , 自動 / 手動管理都可以 , 我這裡勾選自動 , 然後執行 , 把這個空工程安裝到手機上.
- 開啟
-
- 安裝成功之後 , 把這個描述檔案放到微信的包中.
步驟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
指令碼自動重籤實現 , 直接更換包實現 , 後續會繼續就程式碼注入 等方面展開 .