花了小半天的时间整了下代码混淆以及反编译...看了那么多帖子很多都是讲的模糊两可,基本都是要在自己去琢磨琢磨。默默的自己补一篇文章吧,新手少走点弯路哈。
代码混淆主要就是不让自己暴露在.h文件中的代码让别人随便看,增加点安全性。当然,还可以遮羞,嘿嘿~代码风格写的不好防止被看到。
1、安装class-dump
先用终端检测一下是否存在
class-dump
安装的就不讲了,推荐一篇帖子写的很赞的哈,class-dump
在本文中主要是用来反编译。
2、创建文件
随意位置创建一个文件夹,反正最后是需要将整个文件夹添加到工程进去的。
终端命令:
cd 文件夹路径
touch confuse.sh //用于存放脚本
touch func.list //用于存放需要混淆的变量或者函数
将文件夹添加到工程,并新建.h文件: codeObfuscation.h
用于存放混淆前后的代码(宏定义) 以及pch文件:PrefixHeader.pch
注意:有的人喜欢把codeObfuscation.h
、PrefixHeader.pch
一次性用终端创建了,但是对应的头需要另外自己写个人嫌麻烦,还是比较喜欢直接在工程里面直接创建哈。
配置PrefixHeader.pch
文件:
导入#import "codeObfuscation.h"
,以及设置pch文件的prefixHeader文件路径
3、confuse.sh脚本
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
#修改成相应的文件路径
STRING_SYMBOL_FILE="$PROJECT_DIR/Ninety/Confuse/func.list"
#修改成相应的文件路径
CONFUSE_FILE="$PROJECT_DIR/Ninety"
HEAD_FILE="$PROJECT_DIR/Ninety/Confuse/codeObfuscation.h"
export LC_CTYPE=C
#取以.m或.h结尾的文件以+号或-号开头的行 |去掉所有+号或-号|用空格代替符号|n个空格跟着<号 替换成 <号|开头不能是IBAction|用空格split字串取第二部分|排序|去重复|删除空行|删掉以init开头的行>写进func.list
#注意:需要将zyg换成你自己的函数前缀
#注意:如果需要自动混淆的请加上对应的前缀,如果只是混淆部分的又没有前缀,请注释此部分代码,否则只会混淆带有前缀的函数
# 也就是所谓的自动混淆了,如果不需要就请注释掉,如果是自动混淆就没法混淆变量,只能混淆函数
#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 "/^zyg_/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 codeObfuscation_h
#define 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
请注意看脚本的内容,里面的路径例如func.list
、codeObfuscation.h
的路径需要修改成相应自己工程的文件路径
以及脚本里面,修改codeObfuscation.h
的代码,也需要修改成相应的文件名
脚本中注意部分#grep请细看那边的解释,有详细注明所谓的自动混淆、以及混淆变量
注意:如果没有修改成相应的文件路径或者文件名的话 在编译的时候会报错:***/no such file or dictory
之类的错误,反正就是找不到func.list
、codeObfuscation.h
文件
5、配置confuse.h路径
配置路径就看图吧,如果没有配置项目没法编译直接报错哈。
当然这边也需要授权,下文会讲到。
6、配置需要混淆的函数或者变量
func.list将需要混淆的函数或者变量放进去,如图:
7、confuse.sh文件授权
完成以上操作后,发现编译或者运行后,报错(贴个网络图,别介意懒得再运行自己的工程):
confuse.sh没有权限,那就给他授权哈,打开终端,进入confuse.sh文件夹:
cd 存放confuse.sh的文件夹路径
ls -l confuse.sh //可以先查看下confuse.sh的权限
chmod a+x confuse.sh // 给权限,a是指所有人
//chmod 755 confuse.sh 用此命令给权限也是可行的
运行成功后的混淆
看图,不说话。
当然也可以查看codeObfuscation.h
文件,每次运行混淆后的方法名都不一样
8、calss-dump反编译
将需要反编译的ipa文件解压(归档),获取到Payload文件夹,显示包内容找到项目名的文件,如图:
打开终端:
class-dump -H /Users/zhouyonggui/Desktop/Ninety\ 2018-07-17\ 17-07-43/Payload/Ninety.app/Ninety -o /Users/zhouyonggui/Desktop/Confuse
注意-H
需要大写 对应的后面是需要反编译的文件路径;-o
需要小写哈,后面跟着反编译后需要存放的文件路径
总结
总的就讲这些吧,demo暂时没有后面会上次,因为我直接把代码混淆直接做到项目上,现在懒...就没弄demo了哈哈。如果在做代码混淆的时候有问题可以留言,互相学习哈。
顺便附上参考的连接,都写的很不错哈,也很类似只是有些没有说明:
iOS 代码混淆基本处理
iOS安全攻防(二十三):Objective-C代码混淆
iOS代码混淆----自动
iOS代码混淆
iOS class-dump反编译和代码混淆
class-dump最新安装方法