class-dump可以很方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完善的程序给同行留下笑柄。所以,我们迫切的希望混淆自己的代码。
混淆思路
混淆分许多思路,比如:花代码花指令,即随意往程序中加入迷惑人的代码指令、易读字符替换等等。防止class-dump出可读信息的有效办法是易读字符替换。
混淆时机
希望在开发时一直保留清晰可读的程序代码,方便自己。同时,希望编译出来的二进制包含乱七八糟的混淆后的程序代码,恶心他人。因此,可以在Build Phrase 中设定在编译之前进行方法名的字符串替换。
操作步骤
1.创建项目CodeObfuscation
2.切换到项目下
$ cd desktop/CodeObfuscation
3.在该目录下,执行命令创建两个文件:
confuse.sh: 存放混淆的脚本
func.list: 需要混淆的方法、变量名
touch confuse.sh func.list
4.创建文件,右键项目名称,把这两个文件导进来项目中来
5.打开 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
6.点击工程名称 — > Build Phase — > Run Script,配置 Build Phase
7.添加 $PROJECT_DIR/confuse.sh ,这句命令的意思的应用每次启动的时候,都会先去跑我们confuse.sh 脚本
8.编译脚本出现如下报错信息:
解决办法:切换到工程目录下,输入命令行 chmod 755 confuse.sh 给脚本授权
$ cd Desktop/CodeObfuscation
$ chmod 755 confuse.sh
9.编译项目,在工程目录下,会出现一个codeObfuscation.h文件,导入项目
混淆方法名
1.打开 func.list 文件,把需要混淆的方法名写进去
2.在test所在类中导入头文件#import "codeObfuscation.h",然后编译,打开codeObfuscation.h文件,可以看到test方法被替换为bXZJUdtRaXWCZDZP
3.替换效果如下:
Demo地址
备注:
1.系统的方法
2.XIB中拖线的控件名
3.注意storyboard的类名,如果被混淆,跳转可能会出问题
这些都不能用这种方法混淆,会导致运行的时候出错