iOS-应用安全04 shell脚本重签名及代码注入

199 阅读2分钟

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运行脚本

新建工程,添加脚本

你可以在上面大红框里面直接写你需要的执行脚本,eg:上面test.sh中的内容
然后command +B;查看工程目录,可以发现脚本已经运行
当然你也可以直接将脚本文件放到工程目录下,也可运行eg:
注意此时xcode是没有执行权限的,你得添加执行权

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,记得查看下有没有执行权限,没有的就添加下。

3.设置脚本路径
3.直接 run,你会发现wechat已经安装到你的手机上了;如果出现安装失败建议 shift + command + K清理下,然后重新run;

代码注入

我们在之前的章节讲了加密算法、签名、重签名,那做这些为的是什么呢?为了调试破解别人代码,执行自己的代码。那么如何让别人的应用执行我们的代码呢? 首先你得知道一个应用需要执行哪些代码?

  • MachO:这个难度比较大
  • Framework :这个难度小,可以再加一个自己写的库
  • 系统库 :这个难度更大

使用MachOView可视化MachO中的文件 MachO - LoadCommand:加载应用的时候DYLD一定会去读LoadCommand,看看应用依赖哪些库;而这一个过程称为--链接;顺着这个思路,是不是可以在loadCommand时加载我们的库不就可以做到了执行注入的代码:DYLD会动态加载Frameworks中所有的动态库,那么在Frameworks中加一个自己的动态库,然后在自己动态库中hook和注入代码

framework 注入

1.新建framework

2.在frmae中新建测试文件InjectCode,并写上调试代码
3.改变loadCommand 这使用脚本;脚本中使用yololib命令,自行百度配置

...
...
...
#签名
/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;

1.1添加调试代码
2.配置dylib环境,改成iOS的
如果绿色的地方证书是MacDeveloper那还需要改成iPhoneDeveloper 3.添加依赖target:要让主工程依赖LeeHook
依赖添加后,需要选择具体依赖目录,选Frameworks
4.修改脚本

...
...
...
#签名
/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;