工具名稱用途區(qū)別備注
theos、iosOpenDev生成dylib
insert_dylib、optool、yololib向二進(jìn)制文件插入dylib
install_name_tool
修改dylib引用路徑
iResign、sigh resign、codesign等重簽名工具修改后的二進(jìn)制文件是需要重簽名的
二、過程
1、生成dylib
dylib的生成 可采用theos,也可采用iosOpenDev。
theos是越獄專門開發(fā)用的工具,生成的dylib可直接作用于越獄機(jī)器上。
但theos并不是apple源生支持的工具,它在Mac端編譯生成deb包,安裝進(jìn)IOS系統(tǒng),由IOS系統(tǒng)dpkg安裝成插件模式 并隨之生成dylib。theos在Mac端需要調(diào)用IOS開發(fā)SDK,目前無法調(diào)用9.3以上的SDK,theos工具沒有更新。
iosOpenDev則是apple官方支持的插件生成工具,可直接由Xcode生成。
這種dylib由兩種 CaptainHookTweak、Logos Tweak.

不過這兩種沒什么區(qū)別:Logos Tweak的語法較為簡單 同theos的一致,CaptainHookTweak較為復(fù)雜。
2、插入dylib
這三種工具 均可向二進(jìn)制文件插入dylib 不過各有千秋
yololib僅能對64位的二進(jìn)制文件 插入 32位插入也能成功 但是 出現(xiàn)如下

insert_dylib既可以對64位 也可以對32位進(jìn)行插入 同時 還會供選擇 是否刪除掉二進(jìn)制文件原有的簽名 即 LC_CODE_SIGNATURE

optool 則功能更強(qiáng)大 可供選擇 是插入哪種LC LIB。本例暫用不上。
3、修改dylib引用
插入dylib后 需要對它添加cydiaSubstrate dylib的引用。即使用install_name_tool這個工具
之前就是這個地方?jīng)]有做 導(dǎo)致簽名后的文件 一直安裝出現(xiàn)閃退 dylib也沒有調(diào)用
由于目前手頭沒有越獄手機(jī) 之前沒有調(diào)出過cydiaSubstrate dylib 所以這個步驟暫時中斷(最主要 每個越獄版本系統(tǒng)的cydiaSubstrate dylib都是不一樣的 目前沒有可越獄的系統(tǒng) 也就沒有對應(yīng)的dylib)
不過 可細(xì)想 因?yàn)樵姜z手機(jī)上 是自己存在這個cydiaSubstrate dylib的 所以 theos插件本身不必再導(dǎo)入這個dylib,直接對其添加引用即可。
然而 在非越獄手機(jī)上 就需要自己把這個cydiaSubstrate dylib放進(jìn)app包里 并手頭添加它的引用路徑了
既然這樣 那apple 源生的iosOpenDev為什么還要出開發(fā)dylib的工具呢
那是因?yàn)閍pple 推出iosOpenDev生成dylib 根本不是讓你這樣玩的 ?apple是讓你把這個dylib添加進(jìn)IOS工程里 在工程里對其添加引用 如果以后該app有少量的更新 只需要更新這個dylib即可 而不必更新整個app。這個在IOS開發(fā)中 叫做 增量更新。
在完全不使用cydia提供的hook接口的基礎(chǔ)上 也可以使用openDev使用的hook接口
操作如下:
a:將 dylib(如需要調(diào)用cydia substrate 的 MSHOOK函數(shù) 則 還需要添加cydia substrate dylib)到app包里;
b:insert工具插入。注意這里有一個坑 就是凡是復(fù)制到dylib里的包 除了使用install_name_tool對其添加引用外 插入到Mach-O LOAD COMMANDS里的dylib還需要添加可執(zhí)行路徑
首先需要cd進(jìn)app包里
然后/Users/danchen/desktop/diff_hook/insert_dylib@executable_path/ios_hook.dylibhook_demo hook_demo
c:之后重簽名
對app包里每一個修改的添加的文件進(jìn)行簽名
codesign -f -s "iPhone Developer:694708086@qq.com(T4MM3JZDL2)" hook_demo
codesign -f -s "iPhone Developer:694708086@qq.com(T4MM3JZDL2)" ios_hook.dylib

再對整個app包添加簽名權(quán)限
codesign -f -s "iPhone Developer:694708086@qq.com(T4MM3JZDL2)" --entitlements entitlements.plist hook_demo.app
直接安裝app包即可,也可以使用xcrun將其打包成ipa 安裝即可

dylib里的內(nèi)容

4、重簽名
完成這些步驟后
首先 要對 修改過的二進(jìn)制文件、dylib、cydiaSubstrate dylib進(jìn)行重簽名 即把iPhone Developer:694708086@qq.com(T4MM3JZDL2) 寫入進(jìn)去
然后 使用xcrun將app文件 打包成ipa 使用iResign、sigh resign等工具 對ipa包重簽名 再安裝進(jìn)系統(tǒng)
重簽名權(quán)限文件entitlements.plist
可使用ldid -e 二進(jìn)制文件查看entitlements文件內(nèi)容生成
三、區(qū)別
theos與iosOpenDev
區(qū)別theosiosOpenDev備注
來源越獄開發(fā)作者appletheos來自第三方開發(fā),iosOpenDev則是apple官方Xcode支持的
UI無Xcodetheos沒有開發(fā)UI界面,iosOpenDev的開發(fā)界面是Xcode
版本支持目前theos僅支持SDK IOS9.3以下都支持兩者調(diào)用SDK,theos僅支持SDK9.3以下,目前theos作者尚未更新工具
hook 語言方式Logos TweakLogos Tweak、CaptainHookTweak
insert_dylib、optool、yololib工具差別
區(qū)別insert_dyliboptoolyololib備注
支持結(jié)構(gòu)64、32位都支持64、32位都支持僅支持64位
四、總結(jié)
這種方式僅能hook app自身進(jìn)程里所調(diào)用的函數(shù) 無法hook系統(tǒng)級別的進(jìn)程
由于非越獄上的沙盒機(jī)制,本地app僅能訪問本app數(shù)據(jù),無法訪問別的app的數(shù)據(jù),訪問系統(tǒng)數(shù)據(jù)(相冊、地理位置等)也需要向用戶請求權(quán)限。更別說去hook系統(tǒng)級別的進(jìn)程。
當(dāng)然 存在非越獄下 繞過沙盒機(jī)制的技術(shù):http://chuansong.me/n/2248208
比如這個人 非越獄下一個app卸載另一個app、一個app獲取領(lǐng)一個app里的文件內(nèi)容。但這種漏洞技術(shù)沒有公開 僅存在于越獄團(tuán)隊(duì)內(nèi)部。而且這種漏洞技術(shù)也沒能hook系統(tǒng)級進(jìn)程。
理論上來講 非越獄下hook系統(tǒng)級別的進(jìn)程 是有可能的 只不過難度相當(dāng)大(換言之 如果真有這種非越獄下就能hook系統(tǒng)級別的漏洞和技術(shù)的話 越獄團(tuán)隊(duì)干嘛還費(fèi)那大力氣去越獄呢)