1.为什么要进行代码混淆?
iOS的任何APP都可以使用class-dump对原程序进行dump,可以dump出所有源程序的函数所有信息:源程序所有函数类型,变量全部泄露。还有利用Hopper分析我们的代码逻辑结果,这样的话,让攻击者,也就是黑客们了解了程序结构方便逆向。因为在工程中,我们这些变量或函数命名都是有一定可读性的,例如跟用户名相关的,那一般里面会有 userName,跟密码相关的一般会有passWord,这样定义也是为了我们自己代码可读性更强,我们修改的时候才更加的方便。这么个定义法,我们只是希望方便我们自己。如何防止核心的代码被别Hook呢,就用到了代码混淆。

2.混淆思路

3)class-dump
class-dump is a command-line utility for examining the Objective-Csegment of Mach-O files. It generates declarations for the classes, categoriesand protocols. This is the same information provided by using 'otool -ov', butpresented as normal Objective-C declarations.
这是class-dump的官方解释,我们用的最多就是做iOS的逆向工程。class-dump,是可以把Objective-C运行时的声明的信息导出来的工具。其实就是可以导出.h文件。用class-dump可以把未经加密的app的头文件导出来。class-dump是一个可以导入其他应用头文件的工具,算是逆向工程中一个入门级的工具
链接地址和下载地址:https://github.com/wg689/Security-And-CodeConfuse
简单使用: 使用class-dump导出其他应用头文件
/user/bin下面添加class-dump 但是实际上/user/bin 在最新的系统下面是没有读写权限的,你可以添加class-dump 到/user/local/bin 下面执行命令:sudo chmod 777/usr/bin/class-dump这样就可以在终端使用 class-dump 命令
终端输入以下命
class-dump -H /Applications/Xcode.app -o/Users/apple/Desktop/heads
/Applications/Xcode.app 这一段的意思是你程序的路径(显示包内容)
/Users/apple/Desktop/heads 这一段是导出头文件存放的路径(这个随意放)
a.使用classdump导出某工程的头文件
可以根据头文件猜出该文件的具体功能,从而进一步分析
b.代码没混淆反编译结果.h.m文件中函数


4)代码混淆的方法
步骤
1. 在工程中添加func.list和confuse.sh两个文件,confuse.sh是混淆相关的脚本,func.list是需要混淆的方法列表。文件名字随便起,不过最后要在工程的pch中导入一下。
自动混淆,方法名字不能一个一个的添加到func.list中,所以方法名只能从.m和.h文件中抽取了,但是如何屏蔽系统的方法名,暂行的策略是:将自己定义的方法名全部添加一个前缀。
例: ayh_configUserAgent 、ayh_login、ayh_mainDelegate…
可以使用脚本进行代码混淆,减少工作量, confuse.sh脚本如下
#!/bin/bash
# 这是Shell脚本,如果不懂shell,自行修炼:http://www.runoob.com/linux/linux-shell.html
# 以下使用sqlite3进行增加数据,如果不了解sqlite3命令,自行修炼:http://www.runoob.com/sqlite/sqlite-tutorial.html
#数据表名
TABLENAME=symbols
#数据库名
SYMBOL_DB_FILE="symbols"
#要被替换的方法列表文件
STRING_SYMBOL_FILE="$PROJECT_DIR/HSKConfuse/Resource/func.list"
#脚本
CONFUSE_FILE="$PROJECT_DIR/Confuse.sh"
HEAD_FILE="$PROJECT_DIR/Confuse/Resource/codeObfuscation.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"/^hsk_/p" >$STRING_SYMBOL_FILE
#维护数据库方便日后做bug排查
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
}
#生成随机16位名称
randomString()
{
openssl rand -base64 64 | tr -cd'a-zA-Z' | head -c 16
}
#删除旧数据库文件
rm -f $SYMBOL_DB_FILE
#删除就宏定义文件
rm -f $HEAD_FILE
#创建数据表
createTable
#touch命令创建空文件,根据指定的路径
touch $HEAD_FILE
echo '#ifndef CodeObfuscation_h
#define CodeObfuscation_h'>> $HEAD_FILE
echo "//confuse string at`date`" >> $HEAD_FILE
#使用cat将方法列表文件里的内容全部读取出来,形成数组,然后逐行读取,并进行替换
cat "$STRING_SYMBOL_FILE"| while read -ra line;
do
if [[ ! -z "$line" ]]
then
random=`randomString`
echo $line $random
#将生成的随机字符串插入到表格中
insertValue $line $random
#将生成的字符串写入到宏定义文件中,变量是$HEAD_FILE
echo "#define $line$random" >> $HEAD_FILE
fi
done
echo "#endif" >>$HEAD_FILE
sqlite3 $SYMBOL_DB_FILE .dump
在Xcode-->Target--->BuildPhases--->添加Run Script


接下来看一下我声明方法名的地方,已经变成了下面的样式
然后使用再使用class_dump获取程序的头文件

接下来再看经过混淆的方法名,相信已经很难从这个方法中读到信息了。
注: 工程中有许多方法名可能是相同的, 在执行方法的时候,可能因通过混淆过的方法,找到不同的方法实现,导致报错,目前的方案是通过类名给方法添加前缀。从而保证每个方法都是唯一的

使用代码混淆有很大概率被苹果发放2.1大礼包,被拒了需要向苹果审核团队说明混淆代码作用,可能会通过审核
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69901781/viewspace-2564585/ ,如需转载,请注明出处,否则将追究法律责任。