1.新建一个APP工程,先在手机上直接运行一次,信任描述文件。这里我用的是自己账号的免费证书。
2.准备好脚本(文章最后有脚本全文)跟砸过壳的ipa包,这里用的是微信的7.0.8的包。然后为了跟脚本对应上,在工程文件下,新建如下文件夹并把脚本也copy一份进来(大小写需要跟脚本严格对应):
image.png
3.在工程下新建一个framework(用下图的加号创建)
image.png
framework里新创建个obj对象,并实现
+load
方法。然后随便打印点什么
@implementation hookObj
+ (void)load {
NSLog(@"进来了");
}
@end
4.把ipa包拖到刚才创建的APP文件夹下。
5.在如下位置创建脚本模块(路径为:build Pahses
-> +
-> New Run Script
)
image.png
注意(非常重要):
Run Script
模块刚创建的时候,是在Embed Frameworks
模块下方的,你需要手动的把Run Script
模块拖到Embed Frameworks
上方,就如上图所示的位置。否则脚本执行会在编译之后才执行。导致每次运行后,.app
里都没有hookTest.framework
。因为编译虽然把hookTest.framework
放到了.app
里,但是脚本执行后,又把.app
清空了。
脚本写法为:image.png
注意:这里添加脚本的时候,别添加到framework里去了。要添加到自己的工程里。
6.真机运行。看得到,我们的framework里的nslog打印出来了,说明注入成功。image.png
FQ:如果遇到couldn’t be opened because you don’t have permission to view it。可以尝试清理缓存,如果还不行,就把工程删了,上述步骤从新来一遍。
备注:
1.①关于yololib
:yololib
可以在github上下载,下载下来后,把名为yololib的可执行文件,放到/usr/local/bin文件夹下,就可以使用了。②命令yololib WeChat Frameworks/Hankhook.framework/hookTest
(第一个参数是你要写入的目标文件,第二个参数是你想写入的文件,因为.app里WeChat可执行文件与Frameworks文件夹同级,所以直接这样写就行了)。
2.关于压缩文件成ipa:命令为zip -ry WeChat.ipa Payload
,其中的WeChat为你要目标文件的名字。然后把压缩后的ipa文件放在之前创建的APP文件夹下。
脚本如下:(记得最后一行注入的时候,framework名要根据自己实际创建的修改哦)
# ${SRCROOT} 它是工程文件所在的目录
TEMP_PATH="${SRCROOT}/Temp"
#资源文件夹,我们提前在工程目录下新建一个APP文件夹,里面放ipa包
ASSETS_PATH="${SRCROOT}/APP"
#目标ipa包路径
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
#清空Temp文件夹
rm -rf "${SRCROOT}/Temp"
mkdir -p "${SRCROOT}/Temp"
#----------------------------------------
# 1. 解压IPA到Temp下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解压的临时的APP的路径
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
# echo "路径是:$TEMP_APP_PATH"
#----------------------------------------
# 2. 将解压出来的.app拷贝进入工程下
# BUILT_PRODUCTS_DIR 工程生成的APP包的路径
# TARGET_NAME target名称
TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
echo "app路径:$TARGET_APP_PATH"
rm -rf "$TARGET_APP_PATH"
mkdir -p "$TARGET_APP_PATH"
cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH"
#----------------------------------------
# 3. 删除extension和WatchAPP.个人证书没法签名Extention
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"
#----------------------------------------
# 4. 更新info.plist文件 CFBundleIdentifier
# 设置:"Set : KEY Value" "目标文件路径"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
#----------------------------------------
# 5. 给MachO文件上执行权限
# 拿到MachO文件的路径WeChat
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
#上可执行权限
chmod +x "$TARGET_APP_PATH/$APP_BINARY"
#----------------------------------------
# 6. 重签名第三方 FrameWorks
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do
#签名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi
#注入
yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/hookTest.framework/hookTest"