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的类名,如果被混淆,跳转可能会出问题

这些都不能用这种方法混淆,会导致运行的时候出错

参考链接

iOS安全攻防(二十三):Objective-C代码混淆

posted on 2018-10-08 16:03  广坤山货  阅读(133)  评论(0编辑  收藏  举报