Objective-C/Swift的方法名、属性名混淆
特点
- 混淆的时机是在编译前
- 混淆后,不影响源代码
- 混淆生成的规则,可以是随机不重复的字符串
混淆后,为了方便后续排查问题,需要使用SQLite3进行记录
集成
将混淆脚本文件路径添加到 ProjectName --> Build Phases --> Run Script中。
使用
- 方法selector,如 无参数函数,直接通过#define funcName
- 方法selector,如 有一个参数,直接通过#define funcName
- 方法selector,如 有多个参数,分别通过#define funcNameA、funcNameB、funcNameC
- 方法属性自动添加func.list中。从.m和.h文件中抽取属性和方法,在自己定义的属性和方法名全部添加一个前缀以此来屏蔽系统的属性和方法名。
批量混淆脚本
#!/bin/bash
#数据表名
#TABLENAME="CodeObfuscationOC"
#数据库名
#SYMBOL_DB_FILE="CodeObfuscation.db"
#要被替换的方法列表文件
STRING_SYMBOL_FILE="$PROJECT_DIR/$PROJECT_NAME/confuse/func.list"
#被替换后的宏定义在此文件里
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/confuse/codeObfuscation.h"
#包含要被替换的所有.h和.m文件的目录
CONFUSE_FILE="$PROJECT_DIR/$PROJECT_NAME"
export LC_CTYPE=C
#取以.m或.h结尾的文件以+号或-号开头的行 |去掉所有+号或-号|用空格代替符号|n个空格跟着<号 替换成 <号|开头不能是IBAction|用空格split字串取第二部分|排序|去重复|删除空行|删掉以init开头的行>写进func.list
#获取以otto_开头的方法,获取后添加到func.list
grep -h -r -I "^[-+]" $CONFUSE_FILE --include '*.[mh]' |sed "s/[+-]//g"|sed "s/[();,: *\^\/\{]/ /g"|sed "s/[ ]*</</"| sed "/^[ ]*IBAction/d"|awk '{split($0,b," "); print b[2]; }'| sort|uniq |sed "/^$/d"|sed -n "/^otto_/p" >$STRING_SYMBOL_FILE
#维护数据库方便日后做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 '\n#ifndef codeObfuscation_h
#define codeObfuscation_h' >> $HEAD_FILE
echo "\n//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 "\n#endif" >> $HEAD_FILE
#sqlite3 $SYMBOL_DB_FILE .dump