网上查找资料,大致基本都是用 宏定义 替换 方法名。
这种方式主要有几个弱点:
1). 看https://www.jianshu.com/p/0d42e5c6361c 的评论说,这类混淆方式苹果会审核不通过。除非回复苹果这是出于安全需要(比如银行类app)。这是最大的风险。
2)只能把函数名替换,无法替换函数参数比如:
- (void)hsk_start:(NSString*)a andPassword:(NSString*) b
, 只有 has_start
被替换了,其他的未替换。这个应该可以通过改进脚本来支持。。。。
3)只替换方法名,比较弱,没有Control-flow obfuscation强。
总结了几个还不错的,如下所示。
1. Shell替换特定关键字开头的方法
主要参考 https://www.jianshu.com/p/0d42e5c6361c 。
其原理是在预编译阶段,使用shell脚本
1) 先从.h/.m文件中抽取特定前缀的方法名,比如kkk_function1, 将其存到 func.list中;
2) 然后对其编写随机字串,将对应的#define存到 codeObfuscation.h 文件中。由于codeObfuscation.h被放到PrefixHeader.pch中了,因此全局有效。
对其给的confuse.sh脚本有几个改进:
1)没发现所谓的『#维护数据库方便日后作排重』有什么用,猜测是为了防止生成的随机字串出现重复的情况。这里把这部分代码移出掉了。可以通过检查codeObfuscation.h中是否有重复的字串来避免。(自己写个检查工具就好了)
2)fun.list使用后可以删除掉,防止出现在.app包中,泄露信息;
3)将codeObfuscation.h拷贝一份到工程中,暂且命名为 ObfusedMapping.h, 这个头文件需要和打包的版本对应好,用于crashlog的恢复。
修改后的脚本如下:
#!/usr/bin/env bash
STRING_SYMBOL_FILE="$PROJECT_DIR/HSKConfuse/Resource/func.list"
CONFUSE_FILE="$PROJECT_DIR/HSKConfuse"
HEAD_FILE="$PROJECT_DIR/HSKConfuse/Resource/codeObfuscation.h"
export LC_CTYPE=C
touch $STRING_SYMBOL_FILE
#取以.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
ramdomString()
{
openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16
}
rm -f $SYMBOL_DB_FILE
rm -f $HEAD_FILE
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
echo "#define $line $ramdom" >> $HEAD_FILE
fi
done
echo "#endif" >> $HEAD_FILE
#clean
rm -f $STRING_SYMBOL_FILE
cp $HEAD_FILE $"$PROJECT_DIR/ObfusedMapping.h"
2. Python脚本替换方法
主要参考 https://www.jianshu.com/p/c9073d1e06b9
与1.的原理类似,不同的是:
1)用python脚本实现的
2)不是对特定前缀方法,而是对除了特定文件的所有方法都执行混淆
3)随机字串改为了单词拼接,可能不会被苹果拒掉。(未验证)
3. Shell替换的另一个版本
主要参考 https://my.oschina.net/FEEDFACF/blog/1621956
YTTInjectedContentKit
该作者主要想用于游戏马甲包混淆。还未验证。
网友评论