iOS逆向——shell重簽名及程式碼注入

403同學發表於2019-10-14

感謝hank老師

上一章我們講了應用簽名原理和重簽名原理,不再贅述,沒有看過的同學可以點這裡——

iOS逆向——應用簽名及重簽名原理。

這章概述shell指令碼重簽名。可能有的同學認為有很多工具都能快速的幫助我們重簽名實現需求,但我更希望在這裡與大家溝通原理性的東西,而不是簡單的使用第三方工具來滿足我們。

shell指令碼

什麼是shell指令碼?

shell是一種特殊的互動式工具,它為使用者提供了啟動程式、管理檔案系統中檔案以及執行在系統上的程式的途徑。Shell一般是指命令列工具。它允許你輸入文字命令,然後解釋命令,並在核心中執行。

Shell指令碼,也就是用各類命令預先放入到一個文字檔案中,方便一次性執行的一個指令碼檔案。

指令碼執行相關命令

$source FileName  複製程式碼

  • 意思:在當前shell環境中讀取並執行FileName中的命令
  • 特點:
        •命令可以強行讓一個指令碼去立即影響當前的環境(一般用於載入配置檔案)。
        •命令會強制執行指令碼中的全部命令,而忽略檔案的許可權。

$bash FileName 、 $zsh FileName複製程式碼

  • 意思:重新建立一個子shell,在子shell中執行指令碼里面的句子。

$./FileName複製程式碼

  • 意思:讀取並執行檔案中的命令。但有一個前提,指令碼檔案需要有可執行許可權。

下面來點乾貨,指令碼重簽名的原始碼。網上搜也有很多,大家開心就好。不知道為什麼,我寫在bash後,程式碼格式總亂,大家可以找到其他文獻原始碼,這裡我貼圖

iOS逆向——shell重簽名及程式碼注入

如果你想要簡單的瞭解shell,參考Andy哥的文獻。共三篇文章,簡明粗暴易懂。

使用者、組、許可權

Unix和Linux都是多使用者、多工的系統,所以這樣的系統裡面就擁有了使用者、組的概念。那麼同樣檔案的許可權也就有相應的所屬使用者和所屬組了。

iOS逆向——shell重簽名及程式碼注入

Mac檔案屬性

iOS逆向——shell重簽名及程式碼注入

                                                                   ↑

[     許可權     ] [連線][所有者] [所屬組]       [檔案大小][最後修改日期][檔名稱]

iOS逆向——shell重簽名及程式碼注入

第一位:檔案型別

常見:

  • [d]目錄(dictionary)
  • [-]檔案

後九位,檔案許可權,每三位一組,

  • 第一組:檔案所有者的許可權 rwx
  • 第二組:這一組其他使用者的許可權 r-x
  • 第三組:非本組使用者的許可權 r-x

檔案許可權

[r]:read,讀

[w]:write,寫

[x]:execute,執行

注意:這三組許可權的位置不會變,依次是rwx,出現[-]對應位置,代表沒有此許可權

改變許可權:chmod

檔案許可權的改變使用chmod命令。設定方法有兩種:數字型別改變 和 符號型別改變。

由於檔案許可權分為三種身份:[user][group][other] 三個許可權:[read] [write] [execute]

數字型別:

各個許可權數字對照:r:4 w:2 x:1

如果一個檔案許可權為 [–rwxr-xr-x ]

User : 4+2+1 = 7

Group: 4+0+1 = 5

Other: 4+0+1 = 5

命令:chmod 755 檔名

iOS逆向——shell重簽名及程式碼注入

符號型別:

chmod [u、g、o、a] [+(加入)、-(除去)、=(設定)] [r、w、x] 檔名稱

[a]代表all,[a]=[u+g+o],在我們加入許可權的時候,沒有新增身份,預設為[a]

程式碼注入

一般修改原始的程式,是利用程式碼注入的方式,注入程式碼就會選擇利用FrameWork或者Dylib等三方庫的方式注入。

在這裡我們先簡單介紹一下DYLD,Dynamical Load,又叫動態連結器,存在於作業系統中。在手機開機的時候,該程式就預設啟動。DYLD在手機記憶體中執行,CPU排程DYLD,DYLD就會把載入的應用(MacO)載入到記憶體中去。當DYLD讀取MacO檔案的時候,首先就會讀取Load Commands欄位,該欄位包含了Foundation \UIKit等庫,例如我們在呼叫NSLog函式,一定會到Foundation這個庫中呼叫,但是誰知道Foundation這個庫的真實地址,DYLD。如果依賴的庫不再記憶體當中,所以就載入該庫。

所以,我們要在Load Commands中插入一個我們自己寫的Framework。


注入步驟

用MacOview查詢ipa資料夾下包內容的二進位制檔案,檢視Load Commands。

iOS逆向——shell重簽名及程式碼注入

iOS逆向——shell重簽名及程式碼注入

iOS逆向——shell重簽名及程式碼注入

  • Framwork注入
       •  通過Xcode新建Framwork,將庫安裝進入APP包

       •  通過yololib注入Framwork庫路徑。命令:$yololib(空格)MachO檔案路徑(空格)庫             路徑

yololib WeChat Frameworks/xxxxHook.framework/xxxxHook //庫載入到MachO中Load Command下的LC_LOAD_DYLIB中複製程式碼

               •  所有的Framwork載入都是由DYLD載入進入記憶體被執行的

               •  注入成功的庫路徑會寫入到MachO檔案的LC_LOAD_DYLIB欄位中

然後將成功注入後的二進位制檔案替換掉前文提到的TARGET_IPA_PATH下的二進位制檔案。

保留Payload資料夾,壓縮Payload。

zip -ry WeChat.ipa Payload複製程式碼

最後生成的ipa,用重籤的方式可以安裝到手機。

  • Dylib注入
       •  通過Xcode新建Dylib庫(注意:Dylib屬於MacOS所以需要修改屬性)
       •  新增Target依賴,讓Xcode將自定義Dylib檔案打包進入APP包。

       •  利用yololib進行注入。

兩種方式都可以實現程式碼的注入。如果我哪裡寫的不對、不清楚,還希望你能提出來,我們共同探討進步,如果你喜歡此文章,就動一動小手點個贊吧。

想要yololib和MachOview的安裝檔案,可以留言。


相關文章