一、利用class-dump来查看源文件
class-dump是一个逆向工具,可以用来查看未加固的APP的方法名和属性名
安装class-dump
从class-dump下载地址将dmg文件下载下来,将class-dump复制到/usr/bin目录,并在终端执行下面命令赋予权限
sudo chmod 777 /usr/bin/class-dump
如果没有办法复制到根目录,则先要开启系统权限
重启 Mac,按住 Command+R 键直到 Apple logo 出现,进入 Recovery Mode 点击 Utilities > Terminal 在 Terminal 中输入 csrutil disable,之后回车 重启 Mac
在终端中输入class-dump看到如下就说明安装成功了
查看头文件
将ipa改名为zip并解压能看到一个.app结尾的文件,执行
class-dump -H /Users/imac/Desktop/Payload/test.app -o /Users/imac/Desktop/heads
其中/Users/imac/Desktop/Payload/test.app是源文件路径, /Users/imac/Desktop/heads是要导出的头文件的路径
可以在head文件夹里看到包含第三方库的头文件,里面可以看到属性名和方法名
二、混淆代码
在项目里添加两个文件confuse.sh、func.list
在funlist里写上你要混淆的字符串;
在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"
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
用终端给confuse.sh添加权限
chmod 755 confuse.sh
并且在Build Phase里添加运行脚本
并且在pch文件中加入
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
//添加混淆作用的头文件(这个文件名是脚本confuse.sh中定义的)
#import "codeObfuscation.h"
#endif
再次打包用class-dump测试一下,会发现代码乱了