題外話:此教程是一篇嚴(yán)肅的學(xué)術(shù)探討類文章罚舱,僅僅用于學(xué)習(xí)研究,也請讀者不要用于商業(yè)或其他非法途徑上绎谦,筆者一概不負(fù)責(zé)喲~~
準(zhǔn)備工作
- 非越獄的iPhone手機(jī)
- 用PP助手下載: 微信6.6.5(越獄應(yīng)用)
- MachOView
MachOView下載地址:http://sourceforge.net/projects/machoview/
MachOView源碼地址:https://github.com/gdbinit/MachOView
- yololib
yololib下載地址https://github.com/KJCracks/yololib?spm=a2c4e.11153940.blogcont63256.9.5126420eAJpqBD
代碼注入思路:
DYLD會(huì)動(dòng)態(tài)加載Frameworks中所有的動(dòng)態(tài)庫管闷,那么在Frameworks中加一個(gè)自己的動(dòng)態(tài)庫,然后在自己動(dòng)態(tài)庫中hook和注入代碼
動(dòng)態(tài)庫存放的位置:Frameworks
image.png
找到可執(zhí)行文件WeChat
image.png
用MachOView打開可執(zhí)行文件WeChat窃肠,在Load Commands里可以查看到動(dòng)態(tài)庫
image.png
image.png
image.png
步驟:
1包个、新建工程,在Build Phases 添加腳本
image.png
image.png
腳本可以參考iOS逆向之自動(dòng)化重簽名,我是用文件XcodeSign.sh存在本地冤留。
2碧囊、在工程目錄添加APP文件夾,將越獄的微信安裝包放入其中
image.png
3纤怒、先編譯運(yùn)行起來
4糯而、添加dylib
iOS現(xiàn)在已經(jīng)不能添加dylib,只能從macOS添加
image.png
image.png
5泊窘、引入WJHook
image.png
image.png
6熄驼、修改Base SDK- 非常重要
image.png
7像寒、修改Signing - 非常重要
image.png
8、在XcodeSign.sh腳本中編寫注入動(dòng)態(tài)庫的代碼谜洽,保存
# 注入我們編寫的動(dòng)態(tài)庫
echo "開始注入"
# 需要注入的動(dòng)態(tài)庫的路徑 這個(gè)路徑我就寫死了!
INJECT_FRAMEWORK_RELATIVE_PATH="Frameworks/libWJHook.dylib"
#
## 通過工具實(shí)現(xiàn)注入
yololib "$TARGET_APP_PATH/$APP_BINARY" "$INJECT_FRAMEWORK_RELATIVE_PATH"
echo "注入完成"
完整的腳本如下:
# ${SRCROOT} 為工程文件所在的目錄
TEMP_PATH="${SRCROOT}/Temp"
#資源文件夾,放三方APP的
ASSETS_PATH="${SRCROOT}/APP"
#ipa包路徑
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
#新建Temp文件夾
rm -rf "$TEMP_PATH"
mkdir -p "$TEMP_PATH"
# --------------------------------------
# 1. 解壓IPA 到Temp下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解壓的臨時(shí)APP的路徑
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
# 這里顯示打印一下 TEMP_APP_PATH變量
echo "TEMP_APP_PATH: $TEMP_APP_PATH"
# -------------------------------------
# 2. 把解壓出來的.app拷貝進(jìn)去
#BUILT_PRODUCTS_DIR 工程生成的APP包路徑
#TARGET_NAME target名稱
TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
echo "TARGET_APP_PATH: $TARGET_APP_PATH"
rm -rf "$TARGET_APP_PATH"
mkdir -p "$TARGET_APP_PATH"
cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH/"
# -------------------------------------
# 3. 為了是重簽過程簡化萝映,移走extension和watchAPP. 此外個(gè)人免費(fèi)的證書沒辦法簽extension
echo "Removing AppExtensions"
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"
# -------------------------------------
# 4. 更新 Info.plist 里的BundleId
# 設(shè)置 "Set :KEY Value" "目標(biāo)文件路徑.plist"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
# 5.給可執(zhí)行文件上權(quán)限
#添加ipa二進(jìn)制的執(zhí)行權(quán)限,否則xcode會(huì)告知無法運(yùn)行
#這個(gè)操作是要找到第三方app包里的可執(zhí)行文件名稱,因?yàn)閕nfo.plist的 'Executable file' key對應(yīng)的是可執(zhí)行文件的名稱
#我們grep 一下,然后取最后一行, 然后以cut 命令分割阐虚,取出想要的關(guān)鍵信息序臂。存到APP_BINARY變量里
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
#這個(gè)為二進(jìn)制文件加上可執(zhí)行權(quán)限 +X
chmod +x "$TARGET_APP_PATH/$APP_BINARY"
# -------------------------------------
# 6. 重簽第三方app Frameworks下已存在的動(dòng)態(tài)庫
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
#遍歷出所有動(dòng)態(tài)庫的路徑
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do
echo "????????????FRAMEWORK : $FRAMEWORK"
#簽名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi
# ---------------------------------------------------
# 7. 注入我們編寫的動(dòng)態(tài)庫
echo "開始注入"
# 需要注入的動(dòng)態(tài)庫的路徑 這個(gè)路徑我就寫死了!
INJECT_FRAMEWORK_RELATIVE_PATH="Frameworks/libWJHook.dylib"
#
## 通過工具實(shí)現(xiàn)注入
yololib "$TARGET_APP_PATH/$APP_BINARY" "$INJECT_FRAMEWORK_RELATIVE_PATH"
echo "注入完成"
9、在WJHook中編寫注入代碼(WJHook也要添加開發(fā)者團(tuán)隊(duì)簽名signing)
image.png
image.png
10实束、編譯運(yùn)行奥秆,成功!
image.png