接上一篇文章ipa包砸壳,接下来讲一下代码混淆。
混淆代码,我们需要生成两个文件confuse.sh和func.list。
confuse.sh是一个脚本文件,里边定义了混淆的一些算法,以及需要混淆方法的路径。
func.list是我们列举的一些需要混淆的方法。当然系统的方法不能混淆,不然一些库文件方法没办法正确加载。
1、首先,终端cd到文件目录,并且利用指令touch生成这两个文件
touch confuse.sh
touch func.list
不出意外,文件目录里已经有这两个文件了。然后我们将这两个文件放入的项目中。
2、然后,给confuse.sh文件添加脚本如下,可以复制粘贴(记得将里边混淆方法文件路径替换成你自己的)
#!/bin/bash
# 这是Shell脚本,如果不懂shell,自行修炼:http://www.runoob.com/linux/linux-shell.html
# 以下使用sqlite3进行增加数据,如果不了解sqlite3命令,自行修炼:http://www.runoob.com/sqlite/sqlite-tutorial.html
#数据表名
TABLENAME="CodeObfuscationOC"
#数据库名
SYMBOL_DB_FILE="CodeObfuscation.db"
#要被替换的方法列表文件
#=======这里需要将TEST替换给你项目的名称==============
STRING_SYMBOL_FILE="$PROJECT_DIR/TEST/func.list"
#=================================================
#被替换后的宏定义在此文件里
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/CodeObfuscation.h"
#维护数据库方便日后做bug排查
createTable()
{
echo "create table $TABLENAME(src text,des text);" | sqlite3 $SYMBOL_DB_FILE
}
insertValue()
{
echo "insert into $TABLENAME values('$1','$2');" | sqlite3 $SYMBOL_DB_FILE
}
query()
{
echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE
}
#生成随机16位名称
randomString()
{
openssl rand -base64 64 | tr -cd 'a-zA-Z' | head -c 16
}
#删除旧数据库文件
rm -f $SYMBOL_DB_FILE
#删除就宏定义文件
rm -f $HEAD_FILE
#创建数据表
createTable
#touch命令创建空文件,根据指定的路径
touch $HEAD_FILE
echo '#ifndef CodeObfuscation_h
#define CodeObfuscation_h' >> $HEAD_FILE
echo "//confuse string at `date`" >> $HEAD_FILE
#使用cat将方法列表文件里的内容全部读取出来,形成数组,然后逐行读取,并进行替换
cat "$STRING_SYMBOL_FILE" | while read -ra line;
do
if [[ ! -z "$line" ]]
then
random=`randomString`
echo $line $random
#将生成的随机字符串插入到表格中
insertValue $line $random
#将生成的字符串写入到宏定义文件中,变量是$HEAD_FILE
echo "#define $line $random" >> $HEAD_FILE
fi
done
echo "#endif" >> $HEAD_FILE
sqlite3 $SYMBOL_DB_FILE .dump
3、脚本添加完毕后,我们需要设置项目运行该脚本
Targets -> Bulid Phases -> + -> New Run Script Phase
4、然后添加run script指令----$PROJECT_DIR/TEST/confuse.sh
5、然后,在终端给脚本执行权限,一定要注意在confuse.sh文件路径下,添加权限
chmod 777 confuse.sh
我就是执行了几次都报错confuse.sh: Permission denied。就是因为权限目录没有在文件所处路径。
6、然后,给项目添加PCH预编译文件,Xcode生成一个pch文件PrefixHeader.pch
7、配置pch文件执行路径。Targets -> Bulid Settings -> 搜索prefix header -> 双击路径填写$PROJECT_DIR/TEST/PrefixHeader.pch (注意:TEST替换给你的项目名称)
8、添加完成后,我们command+B 编译一下,会在项目目录中多出一个文件CodeObfuscation.h,这个文件内部执行后会生成我们需要混淆方法的宏定义。所以这个混淆代码的方式也是通过的随机字母,生成字符串然后用宏定义的方法改变我们的方法。
9、然后,我们打开之前创建的pch文件,#import "CodeObfuscation.h"引用它。
10、最后一步,我们在之前创建的func.list文件中,写入要混淆的方法列表,注意只写方法的名称即可,不要写方法全部。
如:clickButton needUpdateBread
我在测试的时候发现如果把方法名称写全,如- (void)clickButton:(UIButton *)sender会编译报错。其实也能理解,这种方式就是随机的字母改变,所以如果你全部传递,方法的- ()等也被改动了,导致程序无法编译通过。
写完需要混淆的方法后,我们就可以重新跑一下程序了,然后会发现CodeObfuscation.h文件的内容已经发生变化
已经编译好了两个方法的宏定义。然后我们重新打一个ipa包,进行上一篇文章的砸壳,破解后的方法名称已经不容易分辨了。
混淆前
混淆后
至此,iOS开发的代码方法混淆就大功告成了。
当然,也查找到一些注意事项
1、不能混淆iOS中的系统方法;
2、不能混淆init等初始化方法;
3、不能混淆xib的文件,会导致找不到对应文件;
4、不能混淆storyboard中用到的类名;