iOS Hacker 动态库 dylib 注入
iOS Hacker 動態庫 dylib 注入
很多情況下我們希望自己寫的代碼能夠在其他應用中運行,如果代碼簡單的話,可以寫 Tweak 或者使用 Cycript。但如果代碼多的話,那最好是寫一個動態庫,然后把文件注入到應用中得到代碼的執行。一般有三種方法,本文簡單的講解一下。
一、編寫 dylib
? 首先得先寫一個測試用的動態庫。Xcode 新建 iOS 工程的時候,選擇 Framework 工程,默認文件格式為動態庫,如圖:
? 動態庫的入口函數可以這樣寫
__attribute__((constructor)) static void EntryPoint() {NSLog(@"EntryPoint"); }二、DynamicLibraries
? 注入動態庫的第一種方法可以將 dylib 文件放入 DynamicLibraries 目錄。寫過 Tweak 的朋友,應該知道 Tweak 產生的 dylib 實際會安裝到 /Library/MobileSubstrate/DynamicLibraries 目錄,在這個目錄的 dylib 會被應用加載,里面的 dylib 會有一個 plist 文件,標識哪些進程會加載,如圖:
這樣我們只需要將我們自己的 dylib 放入這個目錄,然后新建一個 plist 把微信的包名加進去,就可以讓微信加載我們的代碼了。
三、修改可執行文件
? 注入動態庫的第二種方法就是修改可執行文件。OSX 和 iOS 應用的可執行文件都屬于 Mach-O 文件格式,只要我們在可執行文件的添加了一條 LoadCommand 為 LC_LOAD_DYLIB,將路徑指定我們的 dylib,不就行了嗎?下面的圖可以看出,LoadCommand 加載系統的動態庫。
使用開源工具 optool 可以添加 LoadCommand,方法如下:
git clone –recursive https://github.com/alexzielenski/optool.git
cd optool
xcodebuild -project optool.xcodeproj -configuration Release ARCHS=”x86_64” build //編譯
/path/to/optool install -c load -p “@executable_path/yourdylib.dylib” -t /yourexefile
因為 optool 添加了 submodule,所以需要使用 –recuresive 選項,將子模塊全部 clone 下來。optool 執行之后的效果如圖:
我們添加的 dylib 的路徑是 executable_path/yourdylib.dylib, 所以需要將 dylib 復制到應用可執行文件自身目錄下,這樣應用打開就能加載我們的動態庫。
如果對文件重簽名,打包成 ipa,就可以安裝到未越獄的手機上,也就是實現了不越獄也能注入動態庫。
四、DYLD_INSERT_LIBRARIES
第三種方法是使用 DYLD_INSERT_LIBRARIES 環境變量啟動進程。
DYLD_INSERT_LIBRARIES=test.dylib /var/mobile/Containers/Bundle/Application/143A710D-4395-4765-872C-148EA6C86936/WeChat.app/WeChat
通過設置 DYLD_INSERT_LIBRARIES 環境變量也可以實現注入,還記得 dumpdecrypted 脫殼嗎?它就是使用 DYLD_INSERT_LIBRARIES 注入進程,然后把文件從內存中給 dump 下來。
有人會奇怪,為什么 DYLD_INSERT_LIBRARIES 能夠注入呢?其實這就是蘋果本身提供的一個功能,我們可以看蘋果開源的 dyld 的源碼,在 main 函數里相關的代碼,判斷了 DYLD_INSERT_LIBRARIES 環境變量,如果有的話就會加載。
// load any inserted libraries if ( sEnv.DYLD_INSERT_LIBRARIES != NULL ) {for (const char* const* lib = sEnv.DYLD_INSERT_LIBRARIES; *lib != NULL; ++lib) loadInsertedDylib(*lib); } // state of all environment variables dyld uses // struct EnvironmentVariables {const char* const * DYLD_FRAMEWORK_PATH;const char* const * DYLD_FALLBACK_FRAMEWORK_PATH;const char* const * DYLD_LIBRARY_PATH;const char* const * DYLD_FALLBACK_LIBRARY_PATH;const char* const * DYLD_INSERT_LIBRARIES;const char* const * LD_LIBRARY_PATH; // for unix conformanceconst char* const * DYLD_VERSIONED_LIBRARY_PATH;const char* const * DYLD_VERSIONED_FRAMEWORK_PATH;bool DYLD_PRINT_LIBRARIES;bool DYLD_PRINT_LIBRARIES_POST_LAUNCH;bool DYLD_BIND_AT_LAUNCH;bool DYLD_PRINT_STATISTICS;bool DYLD_PRINT_OPTS;bool DYLD_PRINT_ENV;bool DYLD_DISABLE_DOFS;bool DYLD_PRINT_CS_NOTIFICATIONS;// DYLD_SHARED_CACHE_DONT_VALIDATE ==> sSharedCacheIgnoreInodeAndTimeStamp// DYLD_SHARED_CACHE_DIR ==> sSharedCacheDir// DYLD_ROOT_PATH ==> gLinkContext.rootPaths// DYLD_IMAGE_SUFFIX ==> gLinkContext.imageSuffix// DYLD_PRINT_OPTS ==> gLinkContext.verboseOpts// DYLD_PRINT_ENV ==> gLinkContext.verboseEnv// DYLD_FORCE_FLAT_NAMESPACE ==> gLinkContext.bindFlat// DYLD_PRINT_INITIALIZERS ==> gLinkContext.verboseInit// DYLD_PRINT_SEGMENTS ==> gLinkContext.verboseMapping// DYLD_PRINT_BINDINGS ==> gLinkContext.verboseBind// DYLD_PRINT_WEAK_BINDINGS ==> gLinkContext.verboseWeakBind// DYLD_PRINT_REBASINGS ==> gLinkContext.verboseRebase// DYLD_PRINT_DOFS ==> gLinkContext.verboseDOF// DYLD_PRINT_APIS ==> gLogAPIs// DYLD_IGNORE_PREBINDING ==> gLinkContext.prebindUsage// DYLD_PREBIND_DEBUG ==> gLinkContext.verbosePrebinding// DYLD_NEW_LOCAL_SHARED_REGIONS ==> gLinkContext.sharedRegionMode// DYLD_SHARED_REGION ==> gLinkContext.sharedRegionMode// DYLD_PRINT_WARNINGS ==> gLinkContext.verboseWarnings// DYLD_PRINT_RPATHS ==> gLinkContext.verboseRPaths// DYLD_PRINT_INTERPOSING ==> gLinkContext.verboseInterposing };蘋果開源的 dyld 源碼地址,里面有各種版本的
https://opensource.apple.com/source/dyld/
蘋果的開源項目,里面東西很多,還有 xun 內核的源碼,方便做內核調試。
https://opensource.apple.com/
https://opensource.apple.com/release/os-x-1011.html
https://opensource.apple.com/source/dyld/dyld-360.14/
總結
以上是生活随笔為你收集整理的iOS Hacker 动态库 dylib 注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS Hacker obfuscato
- 下一篇: iOS socket 套接字编程