DYLD_INSERT_LIBRARIES的那些事

KeepYounger發表於2018-04-25

上次分享了使用 DYLD_INSERT_LIBRARIES 環境變數,可以不修改App的任何位元組,實現注入dyld的過程。文章地址Cornerstone 4.0 破解教程

0x00 變數

最近試著用同樣的方案破解 Reveal 14, 但是隻要設定環境變數DYLD_INSERT_LIBRARIES就會報以下錯 dyld: warning: could not load inserted library 'xxx.dylib' into library validated process because no suitable image found. code signature in... 害的我又是谷歌,又是百度的,始終沒有找到解決方案,經過不懈的努力搜尋,看到一篇文章防止tweak依附,App有高招;破解App保護,tweak留一手,恍然大悟,原來環境變數DYLD_INSERT_LIBRARIES是可以被忽略的,但是按照文章說明,並沒有在Reveal中發現__RESTRICT/__restrict欄位。就這樣搞了兩天,問題始終得不到解決。

0x01 方案

根據錯誤提示,可以發現是驗證了簽名什麼的,搜尋關鍵字macos 取消載入 dyld 的簽名驗證發現了端倪。剛接觸 DYLD_INSERT_LIBRARIES 時,覺得這就是一個系統bug啊,果然事實證明這就是一個bug,蘋果在高版本10.12修復了這個bug,具體參見dylib動態庫載入過程分析macOS軟體內幕,有興趣的可以自己閱讀。dyld是蘋果作業系統一個重要組成部分,而且令人興奮的是,它是開源的,任何人可以通過蘋果官網下載它的原始碼來閱讀理解它的運作方式(下載地址:Source Browser),瞭解系統載入動態庫的細節。看到這句話,就覺得還是有轉機的,轉到改網站下載版本dyld-433.5.tar.gz,開啟src->dyld.cpp,搜尋could not load inserted字樣,果然找到了,仔細閱讀,發現gLinkContext.processUsingLibraryValidation這個判斷下面的列印的log和我的很像,搜尋processUsingLibraryValidation,找到一處

if ( flags & CS_REQUIRE_LV ) {
    gLinkContext.processIsRestricted = false;
    //gLinkContext.requireCodeSignature = true;
    gLinkContext.processUsingLibraryValidation = true;
}
複製程式碼

問題就出現在這,發現CS_REQUIRE_LV,搜尋之,找到macos-disable-library-validation下載,安裝。終於不再提示signature類似的錯誤了。

0x02 後記

載入DYLD_INSERT_LIBRARIES的問題是解決了,但是會出現新錯誤Illegal instruction非法指令,看來這軟體還驗證了其他的。最終放棄完美破解Reveal 14,不完美破解可以看這個繞過最新版本Reveal的啟用檢測。或許Illegal instruction就是ud2指令造成的。