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

前言:

  • 玩逆向的目的 ?ios

    • 爲了應用安全 , 咱們首先要知道 Hackers 都是怎麼作的 , 他們如何作到能夠調試咱們的應用 . 在此基礎上咱們才能知道如何更有效的進行防禦.
  • 在逆向的路上 , 很重要的一步就是應用重簽名 , 以此達到調試別人應用的目的.面試

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

提示 :shell

本篇文章創建在對加密和簽名有必定了解的基礎上 . 如不太熟悉建議閱讀前一篇博客 RSA加密原理&密碼學&HASH 或者其餘密碼學以及簽名文章.安全

廢話很少說 , 開始.bash

iOS 應用簽名原理

簽名

爲何用簽名這個詞 . 由於老外喜歡用支票 , 支票上面的簽名可以證實這玩意是你的 . 那麼數字簽名顧名思義 , 就是用於鑑別數字信息的方法服務器

代碼簽名

代碼簽名是對可執行文件或腳本進行數字簽名 . 用來確認軟件是被承認的 , 且在簽名後未被修改或損壞的措施。和數字簽名原理同樣 , 只不過簽名的數據是代碼而已.微信

其具體驗證措施以下 :app

發佈者 將源代碼散列後的 HASH 值使用私鑰進行加密而後和源代碼一塊兒產生一個軟件包 . 那麼 驗證端/使用端 收到後使用公鑰解密拿到 HASH , 並使用 HASH 算法對源代碼進行散列 , 將獲得的結果進行比對 , 若是一致 , 則說明數據沒有被篡改過 , 而且確實是由發佈者發佈的應用 .ide

蘋果的應用安裝需求

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 腳本自動重籤實現 , 直接更換包實現 , 後續會繼續就代碼注入 等方面展開 .

相關文章
相關標籤/搜索