iOS脚本重签名和代码注入

上一篇文章讲述了手动重签名的整个过程,比较繁琐,而且容易出错,这篇文章来探讨一下shell重签名的实现。

一、脚本重签名

  1. 依然是新建工程,然后安装到手机上。
  2. 在工程根目录下新建APP的文件夹,和shell脚本对应即可。将砸壳的ipa包放入APP文件夹内。
  3. 把脚本放在根目录下。脚本如下:
# ${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

  1. 此时项目目录结构如下:


    目录.png
  2. 在项目 build Phase -> Run Script 模块添加shell。可以直接将shell代码复制过去;也可以添加一个命令:./app.sh

    image.png

运行,不出意外项目将完美安装到你的手机。

如果安装被拒绝,可以尝试命令:chmod +x app.sh

二、Framework代码注入

一般修改原始的程序,是利用代码注入的方式,注入代码就会选择利用 framework 或者 Dylib 等三方库的方式注入。
当然,也可以直接修改 Mach-O 文件。对于 iOS 系统应用来说,需要通过 dyld 去读取 Mach-O,从而决定文件包需要加载哪些库,如何去加载等等。
因此我们可以修改 Mach-O 文件的 Load Commands ( 加载指令,就是告诉 dyld 如何去加载 ),往其中添加一条指令让其去加载我们自己生成的 framework

2.1 构建Framework

利用上面重签成功的工程,新建一个framework,新建一个类MMHook,并添加代码。


MMHook.png

编译,显示包内容,查看 Frameworks 文件夹 , 可以看到我们的 framework 已经放进去了。

MMHook.png

但还不行,微信的 Mach-O 加载指令 load Commands 里并不会去加载我的这个库,他们并没有关联起来。

2.2 修改Mach-O

修改Mach-O,添加指令,需要用到工具yololib
yololib 复制到 user/local/bin 中,这样环境变量就可以在任意路径下使用了。

  1. 进入项目根目录,找到APP文件下的ipa包,解压,进入到Mach-O路径下
  2. 执行命令:yololib WeChat Frameworks/MMHook.framework/MMHook
  3. 重新压缩 zip -ry WeChat.ipa Payload,改为ipa,然后将ipa包放到APP目录下。注意:官方的ipa和我们自己打的ipa有差别,这里压缩的是Payload文件夹,不是WeChat文件夹。
    yololib.png

此时可以打开Mach-O查看一下指令是否添加成功:

load_command.png

运行:

hook.png

2.3 shell注入

我们把yololib配置好之后,可以通过shell实现注入,直接在之前的shell最后加一行指令即可:

#framework注入
yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/MMHook.framework/MMHook"
#dylib注入,libiary库
#yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libMMHookDylib.dylib"

你可能感兴趣的:(iOS脚本重签名和代码注入)