APP 一般经常做的网络参数加密解密,加密方法有base64、MD5、AES、RSA、DES等加密方法、这些加密一般都是给数据进行加密、防止数据外漏。但是今天我要介绍的是防范反汇编风险,防止咋们APP的代码让别人反编译,不过Apple还算安全反编译过来也只能看到.h文件。不过为了安全起见我们还是将代码进行混淆,这样比较安全些。
一、先介绍下反编译工具 class-dump 的使用
class-dump 的安装这里就先不介绍了、可以参考网上资料。class-dump的使用很简单(默认你已经安装class-dump),现将ipa后缀改为zip:
这里的ipa包不可以是AppStore上下载的、因为AppStore上下载的ipa包、Apple是又经过加密的、需要自己破壳,想知道怎么给AppStore下载的ipa进行破壳,看iOS应用逆向工程。
将zip解压、得到app二进制文件,下面就使用class-dump将app进行反编译:打开Terminal:输入命令 class-dump -H app二进制文件路径 -o 反编译后.h文件的存放路径
回车后就得到了反编译的.h文件
class-dump 功能很强大,只是在终端输入一行命令,就可以反编译app的二进制文件,得到所有.h 文件。以下就是为了防止反编译,通过分下.h文件,对咋们的app进行一些操作(外挂就是这么来的),所以要将我们.h文件中的代码进行混淆,即使反编译得到.h文件,也很难分析。
二、将代码进行混淆
1.在项目根目录下新建confuse.sh 和 gbFunc.list 文件
说明:
confuse.sh 文件在编译过程中会执行gbFunc.list 用于自动混淆代码时,存放过滤出来需要混淆的方法名
touch confuse.sh
touch gbFunc.list
2.新建PFConfuse.h
说明:
GBConfuse.h 是在自动混淆代码时,将会把自动生成的字符串定义成宏,存放在此文件,也便于查看。
注意:需要把.h文件移到项目文件外,因为放项目文件中,到时被反编译过来,还是能得到GBConfuse.h里面的东西的,就能通过比对,得到方法。(后面用class-dump反编译过来就明白了...)
3.在confuse.sh中添加如下代码、(先看下效果、代码在下面)
下面是要复制代码:
!/usr/bin/env bash
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
func.list路径
STRING_SYMBOL_FILE="$PROJECT_DIR/GBFunc.list"
项目文件路径
CONFUSE_FILE="$PROJECT_DIR/SafetyTest"
Confuse.h路径
HEAD_FILE="$PROJECT_DIR/PFConfuse.h"
export LC_CTYPE=C
取以.m或.h结尾的文件以+号或-号开头的行 |去掉所有+号或-号|用空格代替符号|n个空格跟着<号 替换成 <号|开头不能是IBAction|用空格split字串取第二部分|排序|去重复|删除空行|删掉以init开头的行>写进func.list
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 "/^PFSAFE_/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 PFConfuse_h
define CodeConfuse' >> $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
需要修改的代码在于文件路径:
4.添加 Run Script
5.添加 PCH 文件
引用.h文件
6.添加以 "PFSAFE_"为前缀的方法(以PFSAFE_为前缀的方法就是要混淆代码的方法)
7.进行测试
运行报错如下:
原因是.sh文件没有权限,所以需要去开启权限。
解决方法:运行终端,在confuse.sh文件目录下,执行命令:
chmod 755 confuse.sh
再运行项目即可成功运行
现不进行混淆代码,打包一个.ipa包进行测试
使用class-dump(以上步骤"一",介绍内容):看看咋们反编译后得到的文件
再看看ViewController.h文件:
自己写的方法通过反编译完全暴露、别人就可以通过判断这些方法干什么用的,再将app注入自己写的dylib动态库,对app干点别的事情,这也是外挂的实现原理。
再将混淆过的代码,打包一个.ipa进行测试:
同上,使用 class-dump 将 app 二进制文件进行反编译:
总结:通过.sh 脚本文件,将个别方法以随机生成字符串的形式,将方法混淆,以至于反编译后无法判断该方法的作用,而达到 APP 更安全。
特别注意(以上、"二"中的2步):将 PFConfuse.h 移动到项目外,别放到项目中,因为放到项目中,到时候被反编译也可得到,那就通过对比 PFConfuse.h 中的内容,判断出方法。
三、参考文章
1、 iOS开发/App安全/代码自动混淆笔记
2、 iOS自动代码混淆
3、 念茜/Objective-C代码混淆
3、 class-dump最新安装方法
如对iOS应用逆向工程感兴趣,可以参考以下文章:
1、一步一步实现iOS微信自动抢红包(非越狱)
2、iOS 逆向 - 微信 helloWorld