玩逆向的目的 ?ios
- 爲了應用安全 , 咱們首先要知道
Hackers
都是怎麼作的 , 他們如何作到能夠調試咱們的應用 . 在此基礎上咱們才能知道如何更有效的進行防禦.在逆向的路上 , 很重要的一步就是應用重簽名 , 以此達到調試別人應用的目的.面試
想知道如何重簽名 , 首先要知道
iOS
應用簽名的原理 .算法
提示 :shell
本篇文章創建在對加密和簽名有必定了解的基礎上 . 如不太熟悉建議閱讀前一篇博客 RSA加密原理&密碼學&HASH 或者其餘密碼學以及簽名文章.安全
廢話很少說 , 開始.bash
爲何用簽名這個詞 . 由於老外喜歡用支票 , 支票上面的簽名可以證實這玩意是你的 . 那麼數字簽名顧名思義 , 就是用於鑑別數字信息的方法服務器
代碼簽名是對可執行文件或腳本進行數字簽名 . 用來確認軟件是被承認的 , 且在簽名後未被修改或損壞的措施。和數字簽名原理同樣 , 只不過簽名的數據是代碼而已.微信
其具體驗證措施以下 :app
發佈者
將源代碼散列後的 HASH
值使用私鑰進行加密而後和源代碼一塊兒產生一個軟件包 . 那麼 驗證端/使用端
收到後使用公鑰解密拿到 HASH
, 並使用 HASH
算法對源代碼進行散列 , 將獲得的結果進行比對 , 若是一致 , 則說明數據沒有被篡改過 , 而且確實是由發佈者發佈的應用 .ide
在 iOS 出來以前 , 之前的主流操做系統( Mac/Windows
) 軟件隨便從哪裏下載都能運行 , 系統安全存在隱患 , 盜版軟件 , 病毒入侵 , 靜默安裝等等 . 那麼蘋果但願解決這樣的問題,要保證每個安裝到 iOS 上的 APP
都是通過蘋果官方容許的,怎樣保證呢 ? 就是經過代碼簽名。
那麼首先怎麼實現呢 ?
這樣確實能夠保證 , 可是咱們還有開發者 , 須要經過 Xcode
在開發階段就能安裝應用 , 另外還有企業證書 . 因此 實際上 , 蘋果的簽名機制是雙層簽名.
整個完整流程如上圖 , 接下來咱們結合實際操做來剖析一下其原理 .
在咱們但願安裝開發好的程序到 iPhone
上時 , 咱們都知道須要去開發者中心配置一下證書 .
MAC
經過鑰匙串訪問生成請求 CSR
文件. 這一步驟其實就是 MAC
生成了一對 公私鑰M , 將 公鑰M
放到請求文件 CSR
中上傳給蘋果服務器 .
蘋果服務器利用 私鑰A 對 公鑰M
進行數字簽名 ( 其實就是對 公鑰M
值進行非對稱加密 , 而後保存了 公鑰M
的 HASH
值) , 生成的結果就是 證書 .
而後用戶繼續添加設備 UDID
, 選擇證書 , 配置所需權限 . 生成描述文件 .
當用戶下載下來 / Xcode
自動管理把證書下載下來以後 , 鑰匙串訪問就會將證書和 MAC
中的 私鑰M
( 就是咱們所熟知的 p12
) 進行關聯 .
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 應用簽名部分都是利用了 CodeSign
來完成的 . 咱們能夠利用終端來本身進行簽名 .
目前市面上也有許多應用能夠可視化完成重籤 或者一鍵重籤 . 或者利用寫好的 shell
腳原本玩 . 對於初學者 . 我的建議仍是按照最基礎的方式操做幾遍 , 理解了其原理 , 在使用其餘工具碰到爲題也比較好處理 , 固然 , 本篇文章會介紹如何手寫 shell 來完成重簽名. .
pp助手 for Mac : 用來下載砸完殼的應用.
下載完成打開 , 被阻攔非 App Stroe
下載的應用打開的解決辦法就再也不介紹了. 設置 - 安全性與隱私 / 或者使用終端均可以 .
找到越獄應用下載微信
下載 ipa
完成 , 重命名爲 zip
, 解壓縮 找到 Payload
- WeChat
.
弄了半天 , 咱們先來看看這個東西 . Iterm2
/ 終端命令:
codesign -vv -d WeChat.app
複製代碼
其中有一項 : Authority
, 就是應用簽名 .
那麼咱們如今要用咱們本身的證書 去從新簽名 .
在 WeChat
文件顯示包內容 , 找到一個黑框框 WeChat
文件.
這個就是咱們常常提到的 MachO
文件了 . 後續我會專門講解它 以及如何仔細查看.
如今咱們先來簡單查看一下 , 利用 otool
工具.
命令 : otool -l WeChat
.
內容比較多 , 咱們重定向一下 , 寫到一個文件裏.
命令 : otool -l WeChat > /Users/libin/Desktop/iOS進階邏輯課程/逆向/WeChatMaCho.txt
( 名稱和路徑隨便 ) .
寫完後咱們打開文件 , 搜索 cryptid
,
注意 : cryptid
是 0
, 表明你下載的是砸過殼的 , 而通常應用是 1
, 也就是加密過的 , 其實就是 AppStore
使用的對稱性加密 , iPhone
在運行的時後解密 ( 並不是安裝時就解密 ) .
寫了這麼多 , 終於要開始重簽名了 . GO
-->
命令: security find-identity -v -p codesigning
. 選擇一個 , 複製下來 .
這裏我就不列舉筆者本身的了.
還徹底沒有證書的小夥伴
先去申請一個吧 , 另外記得要選擇 iPhone , 不要選成了 Mac.打開 WeChat
, 顯示包內容 . 找到 PlugIns
文件夾, 直接刪除 插件普通帳號是籤不了的 .
找到 Watch
文件夾 , 由於這裏也有插件 , 咱們暫時不須要 Watch
, 直接刪掉.
進入 FrameWork
文件夾
利用 CodeSign
, 使用咱們的證書進行重簽名.
codesign -fs "剛剛複製的你本身的證書名字" 要重籤的FrameWork名稱
codesign -fs "iPhone Developer: ha ha (123456)" andromeda.framework
FrameWork
文件夾下全部的庫所有重籤.最簡單的方式就是預覽框中 , 黑色就表明可執行 , 灰色就表明不可執行 .
或者 命令 : ls -l WeChat
, 結果是 -rwxr-xr-x
或者其餘權限.
若是沒有可執行權限 , 也就是 x
權限 , 能夠經過 chmod +x WeChat
添加權限.
( 關於 Linux
權限和命令這塊兒若是你們不是很清楚 , 留言一下 , 我後面補一篇文章詳細講講 , 畢竟有些面試仍是會問 , 不能只知道一個 777 , 由於不少是已經知道了 , 本文就暫不贅述了 )
由於咱們下載的是上線包 , 確定是沒有描述文件這種東西在包裏的 . 所以咱們須要本身生成一個 .
Xcode
, 新建工程 我這裏取名 WeChatDemo
. 而後選擇真機 , 選擇開發者 , 自動 / 手動管理均可以 , 我這裏勾選自動 , 而後運行 , 把這個空工程安裝到手機上.Info.plist
Bundle identifier
com.tencent.xin
改成你本身剛剛新建工程的 Bundle identifier
我這裏爲 com.libin.WeChatDemo
利用上文中咱們說的查看描述文件方法 , 查看咱們剛剛拷貝到微信包裏的描述文件 . 也就是咱們本身空工程生成的描述文件. 找到權力文件部分
打開咱們剛剛新建的 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
腳本自動重籤實現 , 直接更換包實現 , 後續會繼續就代碼注入 等方面展開 .