1、先创建两个文件func.list和confuse.sh,并且用命令行修改这两个文件的权限,不修改权限则会编译报错。
$chmod 777 func.list
$chmod 777 confuse.sh
2、将如下脚本代码复制到confuse.sh文件,并保存
#!/usr/bin/env bash
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"
export LC_CTYPE=C
#维护数据库方便日后作排重
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
}
ramdomString()
{
openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16
}
rm -f $SYMBOL_DB_FILE
rm -f $HEAD_FILE
createTable
touch $HEAD_FILE
echo '#ifndef Demo_codeObfuscation_h
#define Demo_codeObfuscation_h' >> $HEAD_FILE
echo "//confuse string at `date`" >> $HEAD_FILE
cat "$STRING_SYMBOL_FILE" | while read -ra line; do
if [[ ! -z "$line" ]]; then
ramdom=`ramdomString`
echo $line $ramdom
insertValue $line $ramdom
echo "#define $line $ramdom" >> $HEAD_FILE
fi
done
echo "#endif" >> $HEAD_FILE
sqlite3 $SYMBOL_DB_FILE .dump
3、将需要混淆的方法名写入func.list文件,只需要方法名,我定义了一个test方法,然后将方法名test写入func.list文件中(注意有参数的方法不要加冒号)
定义了一个test方法.png
在func.list文件中写入需要混淆的方法名.png
- 注意:只需要写入方法名,如果方法带参数则去掉冒号
比如:
-(void)createView:(CGRect)frame color:(UIColor *)color;
要写成
createView
color
而不是
createView color
更不是
createView: color:
- 事实上上面的脚本会将func.list文件中的方法名生成对应的宏,并用随机的字母序列替换,我们完全可以不用脚本,手动完成这个过程。
#ifndef Demo_codeObfuscation_h
#define Demo_codeObfuscation_h
//confuse string at Fri Sep 28 14:21:29 CST 2018
#define test CaAaWrvilwElJBOY //这就是为test生成的宏
#endif
4、为项目添加pch文件
5、在pch文件中#import "codeObfuscation.h"头文件,添加该头文件就开启了代码混淆,不添加则表示关闭代码混淆。codeObfuscation.h是脚本中定义的。
在pch文件中import codeObFuscation.h头文件.png6、修改工程Build Phases配置运行脚本
修改工程配置.png
7、command+b编译项目即可完成混淆
8、利用class-dump查看混淆后的结果,我这里利用class-dump导出了工程里的头文件,可以看到test被混淆成了euJNUKhcYnuGttSk
[图片上传中...(混淆后的结果.png-f292ef-1538107206323-0)]
混淆后的结果.png
网友评论