出于对自己生产出代码的尊重,要对其负责,保护她的隐私,不被别人发现。我们希望在开发时一直保留清晰可读的程序代码,方便自己。同时,希望编译出来的二进制包含乱七八糟的混淆后的程序代码,恶心他人。
不讲了,发现完全控制不住自己,直接上问题。
iOS源码混淆
- 强项目安全性
使用classdump对原程序进行dump,可以dump出所有源程序的函数所有信息:源程序所有函数类型,变量全部泄露。(下期在分享一下如何对源程序进行dump)在安全性的角度来讲,该项目已经处于高风险阶段了。比如:银行的客户端,交易平台等等。
首先需要得到两个文件 confuse.sh 和 func.list,
1)打开终端:cd -> 你工程的路径
2)创建两文件:touch -> confuse.sh and fund.list
-
打开工程加入刚创建好的两个文件
- 当打开confuse.sh文件,里面并没有内容,里面是一个脚本文件,在最下面
- 在.pch中添加代码
#ifdef __OBJC__
#import//添加混淆作用的头文件
#import"codeObfuscation.h"
#endif
6.添加Run Script
$PROJECT_DIR/confuse.sh
- 添加脚本权限,confuse.sh这个脚本默认的权限是关闭的,打开终端到当前文件路径下,添加命令行$:
chmod 755 confuse.sh
-
现在开始源码的混淆,打开func.list
如上图所示,现在要混淆ViewDragController的方法,将这些方法名称粘出来贴到func.list中。如下图:
OK,这个时候已经大功告成了,咱们验证一下结果。
ps:这里有点局限性,大型项目只能对相对重要的方法、属性进行混淆,全部混淆工作量很大,当然这也是一个优点。
感谢阅读!!!
confuse.sh脚本内容
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