前言:
在8月份的时候写了个关于 class-dump 反编译的文章(使用 Class-dump 反编译),利用 class-dump 工具可以反编译出工程的头文件,这样很方便“坏人”了解工程代码结构,参数传输,严重危及了应用安全。为了应对反编译,需要对工程进行“代码混淆”。
正文:
首先在工程目录下新建个存放反编译文件的文件夹,然后拖进工程。
![iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客 iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客](http://img0.ph.126.net/x6APEd2DmctY9pi3t6H7fQ==/6632205760234301523.png)
![iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客 iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客](http://img1.ph.126.net/GTulWE_r3hmZRAAnP5t3TQ==/6631985857908741586.png)
在 Config 文件目录下新建 .sh 和 .list 文件。
![iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客 iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客](http://img0.ph.126.net/whmY7V_zjpCYBV-6UC_zrg==/6631852817001779496.png)
拖进工程。
![iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客 iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客](http://img1.ph.126.net/MUHlXRz35sScnmA-fBRMVQ==/6632093610048267775.png)
添加 编译脚本代码。
#!/usr/bin/env bash TABLENAME=symbols SYMBOL_DB_FILE="$PROJECT_DIR/$PROJECT_NAME/Config/symbols" STRING_SYMBOL_FILE="$PROJECT_DIR/$PROJECT_NAME/Config/func.list" HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/Config/TestCodeConfuscation.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 TestCodeConfuseUse_TestCodeConfuscation_h #define TestCodeConfuseUse_TestCodeConfuscation_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
添加脚本编译选项。
![iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客 iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客](http://img2.ph.126.net/wulcCwnO47WrxJDFz2-Szg==/6632032037397109211.png)
command + B ,发现运行报错(Permission denied)。
![iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客 iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客](http://img1.ph.126.net/NAQ_GH_m5RXgao0p3RS52w==/6632180471466861547.png)
解决方案:
终端输入进入Config目录,输入 chmod 755 confuse.sh , 回车。
![iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客 iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客](http://img0.ph.126.net/nvltpHMiM31Gd59r94lWsA==/6631723074632765052.png)
![iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客 iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客](http://img1.ph.126.net/ILRXFeaOPVPX_rSNAK9Yew==/6631849518466896685.png)
新建个 prefix header 文件,引入 TestCodeConfuscation.h
![iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客 iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客](http://img2.ph.126.net/_4hLwNJ5CgFQr5pt64MCrQ==/6631971564257584106.png)
重新 build
![iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客 iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客](http://img2.ph.126.net/j4eVuJlh5G1Kqn4XodZqsg==/6631848418955269028.png)
接下来就可以在 func.list 文件中 添加你所需要混淆的代码了。
![iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客 iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客](http://img2.ph.126.net/alcOWUhrJvpwvA5PqVsc3A==/6631717577074626554.png)
![iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客 iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客](http://img1.ph.126.net/xzb0974XmkktLaF-_Vs99A==/6631968265722702358.png)
编译之后,会发现在 TestCodeConfuscation.h 中生成了混淆后的方法或变量名
![iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客 iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客](http://img0.ph.126.net/0_FWikybsszU5InJhXjvmw==/6632177172931976556.png)
此时再用 class-dump 一下,会发现已经完成混淆了。
![iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客 iOS 代码安全之代码混淆实践 - Zach Toby - Zach Toby的博客](http://img2.ph.126.net/g4ZF9QLL7XgseLafLrw3Mw==/6632073818838966551.png)
大功告成。
文章部分参见念茜的博客