iOS非越獄逆向--程式碼注入

weixin_33912445發表於2018-05-16

在iOS逆向過程中程式碼的注入無非是一個最關鍵的步驟。只有把你的程式碼注入到別人的程式碼中才能實現你想實現的目的,才能算實現了逆向。那麼怎麼才能將自己的程式碼注入到別人的ipa 裡邊的?

程式碼注入原理

眾所周知,iOS app 在打包的過程中將程式碼全部轉換成了 可執行檔案 Mach - O 檔案,所以說我們直接改原始碼是萬萬不可能的(除非你拿到的原始碼,話說你原始碼都拿到了你還逆向個?)。那麼我們可不可以以第三方 lib 的(之前的部落格中可以看到 第三方的 lib 是獨立的)方式注入呢?必須可以啊!!

那麼怎麼才能將第三方的lib 注入目標程式呢?這個我們要從二進位制檔案的結構說起,Mach-O檔案的資料主體可分為三大部分,分別是頭部(Header)、載入命令(Load commands)、和最終的資料(Data)。mobileloader會在目標程式啟動時,會根據指定的規則檢查指定目錄是否存在第三方庫,如果有,則會通過修改二進位制的loadCommands,來把自己注入進所有的app當中,然後載入第三方庫。

這樣就結束了麼?遠遠不是的,到這裡我們只是把自己的動態庫注入到了目標程式中,但是我們自己寫的程式碼還沒有執行的入口,所以我們還是不能搞事情。我們還需要一個"main"函式來執行我們自己的程式碼,這個"main"函式在oc裡面稱為建構函式,只要在函式前宣告 "attribute((constructor)) static" 即可,這樣我們就能搞事情了。

程式碼注入的方式

上邊講過了可以通過第三方的lib 來實現程式碼注入,那麼第三方的lib怎麼才能實現注入呢?下邊來講兩種不同的注入方式:Framework 和 dylib:

一下兩種注入的前提是先實現程式碼的重簽名,具體方式可參照:iOS非越獄逆向-- ipa重簽名

Framework

  • 建立一個framework 檔案 並將這個檔案新增引用

建立一個FrameWork檔案


1623468-03433db4fb60c147.png
建立Framework檔案

建立CopyFiles檔案

1623468-a9f1f0b8a4d58f7b.png
新增 Framework 檔案引用 A

匯入建立的FrameWork檔案, Destination屬性 改為FrameWorks

1623468-8d7966b21eaef302.png
新增 Framework 檔案引用 二

  • 在 framework中新增一個要注入的程式碼
  • 在 + load 方法中實現你需要實現的方法

建立需要注入的程式碼檔案,並在 + load 方法中需要實現的方法

1623468-66de47488a299514.png
建立需要注入的程式碼.png

  • 編譯之後找到 可行性檔案 Mach - O ‘Products --> xxxx.app(show in Finder) -- > 顯示包內容’
  • 增加 Mach - O 檔案的執行許可權

chmod +x WeChat (微信為例)

  • 更改 Mach - O 檔案 (將自己寫的framework 加入到 Mach - O中)

yololib WeChat Frameworks/自定義Framework檔名.framework/自定義Framework檔名

  • 重新打包 Payload 檔案 可以直接壓縮重新命名為 .ipa 格式

zip -ry WeChat.ipa Payload

  • 將ipa 包放到 APP 資料夾中 編譯執行 Bingo

dylib

其實dylib 的注入方式幾乎一樣,無非就是建立個lib 然後新增到 targets 裡邊然後命令列注入,但是使用 dylib 需要設定幾個許可權屬性,因為iOS 現在預設不支援 dylib 了需要手動設定屬性。

  • 建立一個 dylib 檔案 並將這個檔案新增引用(新增引用請參考 Framework)
1623468-90eb4e82cbfbf6f6.png
新增新的 dylib 檔案
  • 修改 dylib 的Base SDK 屬性和 Signing 屬性
1623468-6885c7628253e814.png
設定Base SDK 屬性
1623468-3890a68fce379ac9.png
設定 Signing 屬性
  • 編譯 執行注入命令
  • 編譯執行 Bingo

相關文章