利用class-dump可以很方便的导出程序头文件,让攻击者了解了程序结构方便逆向,所以混淆方法名,可以一定程度上加大逆向的阅读难度。
混淆的方法
方法名混淆其实就是字符串替换,有2个方法可以,一个是#define,一个是利用tops。
利用#define的方法有一个好处,就是可以把混淆结果合并在一个.h中,在工程Prefix.pch的最前面#import这个.h。不导入也可以编译、导入则实现混淆。
单段的selector,如func: ,可以通过#define func 来实现字符串替换。
多段的selector,如a:b:c: ,可以通过分别#define a 、b、c 来实现字符串替换。
操作步骤
1、创建混淆脚本文件如confuse.sh 和方法列表文件如function.list
切换到项目目录下
touch function.list
touch confuse.sh
chmod 755 confuse.sh //给脚本授权
打开confuse.sh文件,把如下脚本加入文件中。
2、导入脚本
截屏2019-12-10下午5.24.50.png截屏2019-12-10下午5.27.43.png
${SRCROOT}/confuse.sh
3、运行项目
shell脚本会在项目目录中生成一个codeObfuscation.h的文件,将codeObfuscation.h导入项目中,同时将之前创建的function.list文件也导入项目
4、添加需要混淆的方法名
打开function.list文件,把需要混淆的方法名复制进来(这里所说的方法名不单单只是.h文件中的,也可以是.m文件中的)
截屏2019-12-10下午5.49.36.png 截屏2019-12-10下午5.48.54.png
4、将codeObfuscation.h放到.pch文件中,运行项目
项目运行后,混淆的方法名会被替换成宏定义
截屏2019-12-10下午5.46.12.png截屏2019-12-10下午5.51.15.png
通过class-dump查看.h文件得到的方法名是随机的字符串
截屏2019-12-10下午6.41.46.png
混淆方法名的shell脚本
!/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' >> $HEAD_FILE
echo '#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
原文链接:https://blog.csdn.net/yiyaaixuexi/article/details/29201699
网友评论