iOS自动代码混淆

前言:

因为公司要做一个金融类型的app,安全措施是必不可少的,代码混淆便是其中一种。(这里只对方法名进行混淆)

一、什么是代码混淆

简单来说,就是别人通过class-dump反编译你的应用后,不会显示你自定义的方法名(系统方法名除外),增加其对你应用的理解难度。注意:这样并不能阻止别人反编译你的应用。

二、如何自动进行代码混淆

以下内容均取自
iOS代码混淆----自动 感谢大神的分享

步骤
1. 创建一个新的工程,打开终端,cd 到你的项目目录中

image.png

分别创建confuse.shfunc.list这两个文件

image.png

之后还要创建PCH和一个Confuse.h文件

image.png

将这两个文件添加到项目中,都是空文件,下面开始往里面加东西。

2.confuse.sh文件中添加以下代码

#!/usr/bin/env bash

TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="$PROJECT_DIR/CodeConfuse/confuse/func.list"

CONFUSE_FILE="$PROJECT_DIR/CodeConfuse"

HEAD_FILE="$PROJECT_DIR/CodeConfuse/confuse/CodeConfuse.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 "/^nhb_/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 CodeConfuse_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


对代码中的一些地方进行说明

image.png

在Xcode-->Target--->Build Phases--->添加Run Script

image.png
image.png

3. 首先,你要学会class-dump,安装class-dump
class-dump 下载安装包,将下面的文件复制到/usr/local/bin目录下

image.png

然后再终端输入class-dump,显示下面的界面就说明安装正确
image.png

在viewController写入一些方法,前缀带nhb_和不带前缀的方法,方便class-dump后进行比较
image.png

运行程序,可能会报错,有两种情况:

No such file or directory 这种是因为你文件的路径没有找到,通过在项目中New Group创建文件夹在Show in Finder中是找不到这个文件的,要在项目的Show in Finder中创建文件夹,然后拖到项目中

Permission Denied sh文件权限被拒绝,解决办法:打开终端,cdconfuse.sh文件夹目录下,输入命令 chomd 755 confuse.sh

运行程序,然后找出程序的执行文件
Products -> Show in Finder -->显示包内容

image.png

image.png

找到这个文件,CodeConfuse

image.png

此时我们就可以在终端输入命令
class-dump -H CodeConfuse的文件路径 -o 导出的.h文件存放文件夹路径

image.png

执行完成之后我们可以在文件夹中找到dump的.h文件,右面是class-dump后的.h文件,结果很明显,你通过class-dump后的方法名变成毫无意义的字符串,这样给别人反编译我们的应用增加了很大的难度。

image.png

在文章的最开始,我就说了,这种方法只是增加编译后的阅读难度,毕竟反编译有很多办法,没有绝对的安全!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 📣本文内容 一)为什么要进行代码混淆 二)代码混淆的两种方法(①宏替换 ②脚本实现替换)本文github地址,敬请...
    wg689阅读 5,171评论 17 65
  • 前言 什么!我们的代码拿去安全扫描啦?什么!还扫描出来问题啦?什么!源码都别看到啦? 居于上一篇文章iOS简单逆向...
    甘邦阅读 18,160评论 24 40
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,947评论 25 708
  • 之所以混淆代码是为了防止别人反编译代码后,根据方法名称来窥探你的APP。从而了解APP内部实现或者破解APP。 混...
    申铭阅读 5,476评论 8 17
  • 7.2号,在阿里就待满5年了 看到很多同届进来的,已经p7了 哎,心里很受挫
    Yann在简书阅读 215评论 0 0