iOS逆向二-代码注入
脚本自动重签
补一下上一篇的尾巴!
重签过程其实完全可以通过脚本完成,我们啥都不用干的
下面这个脚本就是重签某信的
# ${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文件的路径
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/SuperFoolHook.framework/SuperFool"
有了这个脚本我们的会变得很轻松
- 新建同名工程(跟要调试的包的包名相同)运行一下项目先把空的包安装到手机,并信任一下描述文件(这一步的目的是安装项目的描述文件到手机)
-
直接复制脚本代码粘贴到一个文件中(比如粘贴到shell.sh中)然后把脚本放到工程的根目录下
image.png
-
在工程根目录下新建新建/APP文件夹把砸过壳的待重签的ipa放进去
image.png
-
添加脚本运行,在Run Script中添加${SRCROOT}/shell.sh
image.png
image.png
- 运行项目就ok了
我们费老劲学加密学应用签名原理,现在又学了重签到底是图个啥,有这时间我打两局LOL他不香吗?学这些当然有用了,首先学这些可以提高
- 我们对iOS底层原理的了解,让我们写出更高质量的代码,遇到bug也能更好的解决
- 重签之后我们能调试别人的应用,学习优秀app的布局方法,研究他们的牛逼功能
- 分析竞品的app,分析他们的业务逻辑
- 破解应用(比如给微信添加自动抢红包功能,我可是瞎嘞嘞能不能加反正我没加过这个功能)
装了一波逼😄 ,爽~~~
言归正传重签之后我们肯定是要干点啥的,首先就是注入我们自己的代码,该怎么注入呢,这里有两个方向:
- 在MachO文件中添加自己的代码(这个比较难)
- 我们自己写代码打成包让别人的MachO调用我们的代码
第一种方式比较难一些,我们先来用第二种方式玩玩
首先我们来稍微了解一下MachO文件,用MachOView来看下MachO文件

把MachO文件放到MachOView中如上图可以看到Load Commands(加载命令)段

Load Commands段中从这很多信息其中LC_LOAD_DYLIB(XXX)动态加载,LC_LOAD_WEAK_DYLIB(XXX)静态加载 Load Commands里依赖的库再连接的时候会被DYLD(动态连接器)加载到内存里,既然这样我们只要在Load Commands中添加一个对我们自己Framework的依赖,我们的framework就会被加载。
首先我们在工程的TARGETS里添加一个Framework



在TARGETS中添加完framework后运行,这个framework会自动被打包进.app包中

但是MachO的Load Commands中并不会添加这个Framework的依赖也就是说运行的时候并不会加载我们的Framework到内存,想要我们的代码执行这里还需要一步操作,就是把我们的Framework添加到Load Commands依赖中
这里用到yololib工具(这个是大神封装好的工具可以直接操作MachO二进制文件)
命令如下:
yololib XXX(MachO文件名) Frameworks/SuperFoolHook.framework/SuperFoolHook
这里要注意后面的“Frameworks/SuperFoolHook.framework/SuperFoolHook”这个路径是我们要添加的Framework的machO跟app的machO的相对路径
运行完成后Load Commands中就会添加我们的依赖

然后到工程跟目录下的APP文件夹下把.ipa文件解压缩替换.app包中的可执行文件然后再打包成ipa文件运行项目(因为我的脚本里是到APP文件夹下找ipa文件所以需要这一步)这时候我们的代码就可以运行了。至此Framework注入就成功了。
只要我们的代码能够运行了 通过runtime、hook技术我们就可以干很多事情了,具体怎么玩儿呢咱们下一篇文章见。
dylib注入
除了framework注入也可以使用dylib注入(由于Framework注入比这个好用多了,所以这种方法就简单记录下怎么用)
1、到TARGETS中创建dylib

2、修改编译设置到Build Settings->Base SDK 改为iOS、Code Signing Identity 改为iOS Developer、到Build Phases 添加Copy Files (由于dylib默认是MacOS的配置所以需要修改成iOS的)



3、修改脚本
上面脚本的最后一行需要改成
#注入
yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/HankHook.framework/HankHook"
#换成
yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/dylibHook.dylib"
注意:Xcode可能对dylib签名失败 那么我们就需要手动给dylib签名了
网友评论