因为等保2.0中对未作代码混淆的危险评定为中级(爱加密自己提供代码混淆业务),而第三方的加固方案每每是须要收费的。sql
360免费版本须要enable bitcode设置为YES,有可能和一些第三方库冲突,所以决定本身来作代码混淆的事情。
代码混淆即对app进行代码混淆加固,提升逆向难度。数据库
须要注意:苹果如今不容许进行代码混淆,过多的混淆会没法过审bash
代码编译阶段,将符号(方法名、属性名等)替换成随机字符串。
个人作法是利用 #define methodName randomString 来实现方法名替换,由于在编译阶段,randomString 会被直接替换进methodName。markdown
$PROJECT_DIR/confuse.sh
复制代码
#!/usr/bin/env bash
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="$PROJECT_DIR/func.list"
HEAD_FILE="$PROJECT_DIR/codeObfuscation.h"
####这里是全局混淆要查找的内容路径,不须要全局混淆的时候要注释掉
CONFUSE_FILE="$PROJECT_DIR/ProjectName"
export LC_CTYPE=C
####这里是全局混淆要查找的条件,不须要全局混淆的时候要注释掉
#取以.m或.h结尾的文件以+号或-号开头的行 |去掉全部+号或-号|用空格代替符号|n个空格跟着<号 替换成 <号|开头不能是IBAction|用空格split字串取第二部分|排序|去重复|删除空行|删掉以init开头的行>写进func.list
## |sed -n "/^sk_/p" 是特定问方法名的开头,不须要的话能够删掉
#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 "/^IS_/p" >$STRING_SYMBOL_FILE
#维护数据库方便往后做排重
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
复制代码
funcA
funcB
funcC
复制代码
有不少种方法能够获取符号名,这里提供一种思路:
经过 hook UIViewController 的 viewDidLoad: 方法,并增长以下代码:app
NSLog(@"%@",[NSArray getPropertiesFromClass:[self class]]);
NSLog(@"%@",[NSArray getMethodsFromClass:[self class]]);
复制代码
若是咱们所有手动进行混淆,也是一种方法,可是会比较麻烦。dom
自动方法混淆须要提早将咱们要混淆的方法,属性等增长前缀,例如"kx",而后对.sh脚本进行一些修改,便可完成自动代码混淆。ui
上文 .sh 文件中,将 grep 的那行注释放开,便可进行自动混淆。加密
其中spa
sed -n "/^kx_/p"
复制代码
这行是对以“zd”开头的方法或属性进行混淆。code
若是咱们写代码的时候没有提早给方法或属性增长前缀,则没法进行自动方法混淆。
这个时候咱们能够经过半自动的方式,对一系列的方法进行自动混淆后,再手动增长一些方法或属性来达到咱们的目的。
代码混淆如今作的人已经比较少了,其中还有部分公司作这个是为了提升等保2.0的评分,因此这里提供一些方案,具体的操做要根据实际状况来看。
文中若有错误,欢迎指出。