iOS相关技术实现第三方工具类iOS Developer

代码混淆&反编译

2018-07-17  本文已影响12人  走着走着就会敲代码了

花了小半天的时间整了下代码混淆以及反编译...看了那么多帖子很多都是讲的模糊两可,基本都是要在自己去琢磨琢磨。默默的自己补一篇文章吧,新手少走点弯路哈。
代码混淆主要就是不让自己暴露在.h文件中的代码让别人随便看,增加点安全性。当然,还可以遮羞,嘿嘿~代码风格写的不好防止被看到。

1、安装class-dump

安装的就不讲了,推荐一篇帖子写的很赞的哈,class-dump在本文中主要是用来反编译。

2、创建文件

随意位置创建一个文件夹,反正最后是需要将整个文件夹添加到工程进去的。
终端命令:

cd 文件夹路径
touch confuse.sh    //用于存放脚本
touch func.list     //用于存放需要混淆的变量或者函数

将文件夹添加到工程,并新建.h文件: codeObfuscation.h用于存放混淆前后的代码(宏定义) 以及pch文件:PrefixHeader.pch
注意:有的人喜欢把codeObfuscation.hPrefixHeader.pch一次性用终端创建了,但是对应的头需要另外自己写个人嫌麻烦,还是比较喜欢直接在工程里面直接创建哈。
配置PrefixHeader.pch文件:
导入#import "codeObfuscation.h",以及设置pch文件的prefixHeader文件路径

pch文件路径配置.png

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.listcodeObfuscation.h的路径需要修改成相应自己工程的文件路径
以及脚本里面,修改codeObfuscation.h的代码,也需要修改成相应的文件名

脚本中注意部分#grep请细看那边的解释,有详细注明所谓的自动混淆、以及混淆变量

注意:如果没有修改成相应的文件路径或者文件名的话 在编译的时候会报错:***/no such file or dictory之类的错误,反正就是找不到func.listcodeObfuscation.h文件

5、配置confuse.h路径

配置路径就看图吧,如果没有配置项目没法编译直接报错哈。


confuse.h路径.png

当然这边也需要授权,下文会讲到。

6、配置需要混淆的函数或者变量

func.list将需要混淆的函数或者变量放进去,如图:


混淆的函数或者变量.png

7、confuse.sh文件授权

完成以上操作后,发现编译或者运行后,报错(贴个网络图,别介意懒得再运行自己的工程):


未授权错误.png

confuse.sh没有权限,那就给他授权哈,打开终端,进入confuse.sh文件夹:

cd 存放confuse.sh的文件夹路径
ls -l confuse.sh    //可以先查看下confuse.sh的权限
chmod a+x confuse.sh    // 给权限,a是指所有人
//chmod 755 confuse.sh 用此命令给权限也是可行的

运行成功后的混淆

看图,不说话。


运行成功图.png

当然也可以查看codeObfuscation.h文件,每次运行混淆后的方法名都不一样

codeObfuscation.h.png

8、calss-dump反编译

将需要反编译的ipa文件解压(归档),获取到Payload文件夹,显示包内容找到项目名的文件,如图:


反编译的文件.png

打开终端:

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最新安装方法

上一篇下一篇

猜你喜欢

热点阅读