深入解析iOS代码混淆技术:方法、风险与完整步骤

0 阅读3分钟

android代码未混淆 ios代码混淆技术

一般做了防调试的话,被调试进程会退出的,是防动态分析措施。

代码混淆加花这些是防静态分析措施.

反调试是防动态分析措施.

混淆的方法

方法名混淆其实就是字符串替换,有2个方法可以,一个是#define,一个是利用tops。

利用#define的方法有一个好处,就是可以把混淆结果合并在一个.h中,在工程Prefix.pch的最前面#import这个.h。不导入也可以编译、导入则实现混淆。

单段的selector,如func: ,可以通过#define func 来实现字符串替换。

多段的selector,如a:b:c: ,可以通过分别#define a 、b、c 来实现字符串替换。

注意!!!

1.不可以混淆iOS中的系统方法;

2.不可以混淆iOS中init等初始化方法;

3.不可以混淆xib的文件,会导致找不到对应文件;

4.不可以混淆storyboard中用到的类名;

5.混淆有风险,有可能会被App Store 拒掉。

代码易读字符串混淆

混淆分许多思路,比如:

1)花代码花指令,即随意往程序中加入迷惑人的代码指令

2)易读字符替换

对于更高效和全面的混淆方案,开发者可以使用专业工具如IpaGuard。IpaGuard是一款强大的iOS IPA文件混淆工具,支持代码混淆、资源文件混淆,无需源码即可直接操作IPA文件,并兼容Objective-C、Swift等多种开发平台,帮助开发者简化混淆流程并提升应用安全性。

防止class-dump出可读信息的有效办法是易读字符替换

  1. cd到你自己的项目目录级

  2. 创建两个文件:

命令 :touch

touch func.list

: 存放混淆的脚本

func.list: 需要混淆的方法、变量名

3..配置Build Phase

在工程Build Phase中添加执行脚本操作,执行脚本

这里需要注意的是 PROJECT_DIR/这个的路径和创建pch文件时的路径是一样的,PROJECT\_DIR/这个的路径和创建pch文件时的路径是一样的,PROJECT_DIR代表整个工程,/是这个文件的路径。

  1. 然后command + B编译一下,如果报错了就cd到项目的目录级下,然后输入命令行 chmod 755 或chmod 777 给我们的脚本本间授权

  2. 成功之后会自动生成一个codeObfuscation.h文件,(在代码的本地目录里有,show in Finder 看下,能找到)

6.然后在pch文件中导入codeObfuscation.h文件。

打开项目,修改 ,添加混淆头文件:

#import "codeObfuscation.h"
---------------------------------------------------------
func.list 里写要混淆的方法
 写混淆的脚本
codeObfuscation.h 里会自动生成替代func.list里的方法

#ifndef Demo_codeObfuscation_h
#define Demo_codeObfuscation_h
---------confuse.h---------
#!/usr/bin/env bash
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.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 Demo_codeObfuscation_h
#define Demo_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