Shell基础及相关介绍
在使用shell重签名前,先了解shell及相关知识
shell
shell是一种特殊的交互工具,它为用户提供了启动程序、管理文件系统中文件以及运行在系统上的进程途径。shell一般是是指命令行工具。它允许你输入脚本命令,然后解释命令,并在内核中执行。shell脚本,也就是用各类命令预先放入到一个文本文件中,方便一次执行的一个脚本文件。说白shell脚本就是各类命令的集合文件。
感受下脚本的畅快
eg:我们要在KKK文件夹下用命令行生成一个shell文件夹,并且里面新建一个123.txt文件,一般我们会这么做:
XXXX $ cd /Users/XXXX/Desktop/KKK
XXXX $ ~/Desktop/KKK mkdir shell
XXXX $ ~/Desktop/KKK cd shell
XXXX $ ~/Desktop/KKK/shell touch 123.text
shell脚本做法:
1.新建一个test.sh
XXXX $ cd /Users/baofan/Desktop/KKK
baofan@MacBook-Pro ~/Desktop/KKK vim test.sh
2.vim编辑test.sh内容
mkdir shell2
cd shell2
touch 456.txt
~
:wq
3.使用bash执行脚本test.sh
bash test.sh
或者//zsh是我本地自己安装的shell
zsh test.sh
或者//source 命令会进入文件夹内部
source test.sh
以上三种效果相同;只要执行一个脚本就能做原先需要好几步的事 当然还有更简单的方式:
//chmod +x 获取权限
XXXX $ ~/Desktop/KKK chmod +x test.sh
// ./执行
XXXX ~/Desktop/KKK $ ./test.sh
脚本执行相关命令

MacOS用户权限及修改
用户、组、权限
MacOS(基于Unix)是一种多用户、多任务的系统。这样的系统有用户、组的概念,同样文件的权限也就有相应所属的用户和用户组;
关于操作系统,有兴趣的同学可以看看这篇文章 www.jianshu.com/p/94237b5d7…
先个例子吧,就上面KKK文件夹
$ cd /Users/XXX/Desktop/KKK
~/Desktop/KKK $ ls -l
total 8
drwxr-xr-x 4 XXX staff 128 3 1 15:38 shell
drwxr-xr-x 3 XXX staff 96 3 1 15:50 shell2
-rwxr-xr-x@ 1 XXX staff 37 3 1 15:37 test.sh
以第一个说明:
drwxr-xr-x 4 XXX staff 128 3 1 15:38 shell
d/- :第一个d代表文件夹类型,-代表文件类型。
wxr-xr-x 要分开读 [wxr][-xr][-x],代表[用户的权限][组的权限][其他人的权限]。
w:写,r:读,x:可执行;
XXX: 用户
staff: 用户所在的组
128:文件大小
3 1 15:38:文件创建的时间

权限改变:chmod

1 0001 1<<0
2 0010 1<<1
4 0100 1<<2
用于多种权限叠加,方便位移运算
eg:联系使用,还是上面文件夹
$ cd /Users/baofan/Desktop/KKK
$ ~/Desktop/KKK ls -l
total 8
drwxr-xr-x 4 XXX staff 128 3 1 15:38 shell
drwxr-xr-x 3 XXX staff 96 3 1 15:50 shell2
-rwxr-xr-x@ 1 XXX staff 37 3 1 15:37 test.sh
//不指定某个默认修改全部用户权限
$ ~/Desktop/KKK chmod -r test.sh
$ ~/Desktop/KKK ls -l test.sh//查看权限
--wx--x--x 1 XXX staff 37 3 1 15:37 test.sh
$ ~/Desktop/KKK chmod u+r test.sh//u:指定用户
$ ~/Desktop/KKK ls -l test.sh
-rwx--x--x@ 1 XXX staff 37 3 1 15:37 test.sh
$ ~/Desktop/KKK chmod 777 test.sh//数字法,不需要-+=符号
$ ~/Desktop/KKK ls -l test.sh
-rwxrwxrwx@ 1 XXX staff 37 3 1 15:37 test.sh
脚本自动重签名
Xcode运行脚本
新建工程,添加脚本

test.sh中的内容

command +B;查看工程目录,可以发现脚本已经运行


XXX $ ~/Desktop/KKK/01脚本重签名 master ●✚ ls -l test.sh
-rw-r--r--@ 1 XXX staff 37 3 1 20:38 test.sh
XXX $ ~/Desktop/KKK/01脚本重签名 master ●✚ chmod +x test.sh
XXX $ ~/Desktop/KKK/01脚本重签名 master ●✚ ls -l test.sh
-rwxr-xr-x@ 1 XXX staff 37 3 1 20:38 test.sh
修改xcode中脚本路径

command +B,查看

xcode脚本重签
既然你已经知道了xcode如何运行脚本了,那就运行下自动重签名的脚本,脚本在下面,已经有注释,不再赘述;
# ${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.新建一个工程,先run一次,将其安装到手机上
2.打开文件根目录,添加需要更换的app包(放在APP文件夹中,名字得和脚本里面写的对应上不然脚本找不到),添加需要执行的脚本我这里是app.sh,记得查看下有没有执行权限,没有的就添加下。


shift + command + K清理下,然后重新run;
代码注入
我们在之前的章节讲了加密算法、签名、重签名,那做这些为的是什么呢?为了调试破解别人代码,执行自己的代码。那么如何让别人的应用执行我们的代码呢? 首先你得知道一个应用需要执行哪些代码?
- MachO:这个难度比较大
- Framework :这个难度小,可以再加一个自己写的库
- 系统库 :这个难度更大
使用MachOView可视化MachO中的文件 MachO - LoadCommand:加载应用的时候DYLD一定会去读LoadCommand,看看应用依赖哪些库;而这一个过程称为--链接;顺着这个思路,是不是可以在loadCommand时加载我们的库不就可以做到了执行注入的代码:DYLD会动态加载Frameworks中所有的动态库,那么在Frameworks中加一个自己的动态库,然后在自己动态库中hook和注入代码
framework 注入
1.新建framework



...
...
...
#签名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi
#注入//上面的脚本最后加这句话
yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/RiceFunHook.framework/RiceFunHook"
4.run 你就会在控制台上看到打印了;如果出现安装失败建议 shift + command + K清理下,然后重新run;

dylib 注入
除了可以使用framework注入,还可以使用dylib 1.新建 dylib-LeeHook,注意是macOS;






...
...
...
#签名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi
#注入
yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libLeeHook.dylib"
5.run。如果出现安装失败建议 shift + command + K清理下,然后重新run;
