之前听过代码混淆的概念,但公司不要求这个,所以当时也没有在意,现在有时间就简单看了一下(其实还是纠结于那个公司问的那个问题)。。。真的只是简单的看了一下,虽然看不懂。。。
由于class-dump可以导出程序的头文件,对于APP的安全考虑,我们需要混淆自己的代码。
混淆代码有多种方式:
字符串加密、符号混淆、别名、C重写、脚本处理 等等....
防止class-dump导出可读信息的有效方法是易读字符替换,接下来我们就来看一下吧。
这是念茜女神写的一个脚本,以下代码来自念茜女神的博客
// 数据库名
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
// 存放混淆方法、属性的list的路径
STRING_SYMBOL_FILE="$PROJECT_DIR/项目名/func.list"
CONFUSE_FILE="$PROJECT_DIR/项目名"
// 存放混淆方法、属性的.h的路径
HEAD_FILE="$PROJECT_DIR/项目名/codeObfuscation.h"
// 剩下的代码看不懂啦。。。
export LC_CTYPE=C
以下代码是来自另一位大大的博客,那位大大实现了自动混淆(方法名字不能一个一个的添加到func.list中,所以只能从.m和.h文件中抽取了,但是如何屏蔽系统的方法名,暂行的策略是:将自己定义的方法名全部添加一个前缀例如:sss_),但只是混淆了方法名,我加上了属性名的混淆(因为看不懂Linux命令,只是一个简单的小问题弄了好久)
# 取以.m或.h结尾的文件以+号/-号/@property开头的行 |去掉所有+号或-号|用空格代替符号|n个空格跟着<号 替换成 <号|开头不能是IBAction|用空格split字串取第二部分|排序|去重复|删除空行|删掉以init开头的行>写进func.list
grep -h -r -I "^[-+@property]" $CONFUSE_FILE --include '*.[mh]' |sed "s/[+-]//g"|sed "s/[();,: *\^\/\{]/ /g"|sed "s/[ ]*</</"| sed "/^[ ]*IBAction/d"|awk '{lens=split($0,b," "); print b[lens]; }'| sort|uniq |sed "/^$/d"|sed -n "/^sss_/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
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
1.新建文件,将后缀改为aaa.sh 如图:
image.png
把上面的代码粘贴到aaa.sh中,编译一下报错啦吧
image.png
解决办法:切换到工程目录下,输入命令行:
chmod 755 aaa.sh
给我们的脚本授权
2.我们再编译一下项目,然后在工程目录下,我们会多出一个codeObfuscation.h文件,右键add...加到项目中
3.放到pch文件中
image.png
4.在Xcode-->Target--->Build Phases--->添加Run Script
将aaa.sh拖到下图的黑框中,会自动生成路径
image.png
5.最后打包,用class-dump导出就可以看到效果啦
image.png
image.png
网友评论