1. 程式人生 > >通過修改Mach-O中Load Commands進行全域性程序劫持

通過修改Mach-O中Load Commands進行全域性程序劫持

Mach-O格式,是Machobject檔案格式的縮寫,是一種可執行檔案、目的碼、共享程式庫、動態載入程式碼和核心DUMP(摘自度娘),類似於Win環境的PE、Linux環境的ELF。  
LoadCommands資料位於MachHeader資料之後,顧名思義為載入器命令。  
Structureoverview  
|--------------------------------  
|MachHeader  
|--------------------------------  
|LoadCommand1  
|LoadCommand2  
|LoadCommandn  
|--------------------------------  
|Data  
|--------------------------------  
LoadCommand定義有諸多,比如LC_SEGMENT、LC_SYMTAB、LC_SYMSEG等等,更多的LC定義可在<mach-o/loader.h>標頭檔案中找到。利用otool-l命令可以檢視一個mach-o檔案的LoadCommands。  
利用LoadCommands進行程序劫持的大致思路如下:  
1.找一個任意程序啟動都會載入的dylib;  
2.為dylib寫入自定義shellcode;  
3.修改/新增此dylib的LC_ROUTINES命令,指向shellcode;  
4.替換原dylib。  
每步驟原理:  
1.找到一個任意程序都會載入的dylib,比如/usr/lib/dyld,這樣就達到了全域性範圍的效果。  
2.寫入shellcode,比如執行一段dlopen的程式碼,開啟指定動態庫,或是什麼。  
3.當連結器加入-init選項時,LC_ROUTINES就會被加入到LoadCommands中,描述該dylib的入口。如此我們將原入口替換為shellcode的地址,在shellcode執行完再跳回原入口來執行自定義程式碼。  
4.替換後開啟任意程序看效果。  
以上是本人的假設,還沒經過實踐。歡迎大家討論