代码混淆和dump
首先是安装和使用dump:
1.选择class-dump-3.5.dmg 下载;
2.下载之后,点击打开,复制class-dump文件,
3.shift+command+G 打开finder 的路径,输入/usr/local,并把class-dump粘贴到 /bin 这个文件中,(这个文件是隐藏的文件夹)
这样就可以开始玩dump了,
4.找个项目(跑过真机的)拿到app包(或包里的可执行文件),
5.在桌面创建一个文件夹,用于存放反编译出来的头文件;
6.终端:class-dump -H 项目包路径 -o 解析出来的文件路径
7.之后就会见到有多个.h文件被解析出来,如果没有做代码混淆的话,可以看到项目中的很多属性/方法都可以看到,
再来说一下代码混淆:
1.创建一个新的项目,Class-dump-Test
2.为项目创建一个 .pch文件,并为pch文件配置路径,$(SRCROOT)/Class-dump-Test/pch文件名.pch
3.终端:cd 项目路径;
4:touch confuse.sh
5:touch func.list 为项目创建2个文件,并添加到项目中,
6:为脚步文件confuse.sh设置路径,
7.创建codeObfuscation.h 在这个文件中可以看到混淆后的代码,并声明到.pch文件中
其中如果手动选择要混淆的方法或属性,就把方法/属性写到func.list中,例如:
其中confuse.sh文件文件需要写上脚步代码:
#!/usr/bin/env bash
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"
#/* 针对特殊字符的代码混淆**/
CONFUSE_FILE="$PROJECT_DIR/Class-dump-Test"
HEAD_FILE="$PROJECT_DIR/Class-dump-Test/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 "/^wq_/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 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
编译一下:
这就算是成功了,自己可以反编译一下,看看还能不能开到明文的方法/属性
遇到的问题:在为脚本文件设置好路径后,编译出错:Permission Denied。要获取脚步权限,
终端:chmod 755 scriptname.sh 再次编译就没事了!
如果有什么不对的,可一定要告诉我一下哈!