iOS代码混淆

最近在做金融类项目,对项目安全方面比较重视,需要对代码进行防止反编译。
实现思路主要是运用runtime机制
如何进行全局的自动化代码混淆,以下开源项目STCObfuscator详细介绍了如何实现这个目标。
如果你的工程支持cocoapod,你可以直接添加!
pod “STCObfuscator” (注:请用最新版本1.3.0,最好更新下pod repo  update master)
在Appdelegate.m文件中,didFinishLaunchingWithOptions方法里加入代码:
 [[STCObfuscator obfuscatorManager] confuseWithRootPath:[NSString stringWithFormat:@”%s”, STRING(ROOT_PATH)] resultFilePath:[NSString stringWithFormat:@”%@/STCDefination.h”, [NSString stringWithFormat:@”%s”, STRING(ROOT_PATH)]] linkmapPath:[NSString stringWithFormat:@”%s”, STRING(LINKMAP_FILE)]];
项目设置
步骤一:
在 Build Settings->Preprocessor Macros->DEBUG 中添加环境变量。(注:工程尽量不要放在中文路径下)
LINKMAP_FILE=$(TARGET_TEMP_DIR)/$(PRODUCT_NAME)-LinkMap-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt
和ROOT_PATH=”${SRCROOT}”
步骤二:
在 Build Settings 开启Write Link Map File, 设置成 YES。
步骤三:
将下面的脚本添加到 Build Phases
dir=${SRCROOT}
file_count=0
file_list=`ls -R $dir 2> /dev/null | grep -v ‘^$’`
for file_name in $file_list
do
temp=`echo $file_name | sed ‘s/:.*$//g’`
if [ “$file_name” != “$temp” ]; then
cur_dir=$temp
else
if [ ${file_name##*.} = a ]; then
    find -P $dir -name $file_name > tmp.txt
    var=$(cat tmp.txt)
    nm $var > ${file_name}.txt
    rm tmp.txt
fi
if [ ${file_name##*.} = framework ]; then
    find -P $dir -name ${file_name%%.*} > tmp.txt
    var=$(cat tmp.txt)
    nm $var > ${file_name}.txt
    rm tmp.txt
    fi
fi
done
步骤四:
在预编译文件PrefixHeader.pch中添加以下代码:
#if (DEBUG != 1) #import “STCDefination.h” #endif
在DEBUG环境下用模拟器运行工程,在STCDefination.h头文件中生成混淆的宏。
所有的混淆符号会保留在工程目录下的confuse.json。
用于反混淆的文件confuse.json:
步骤六:
把工程目录下STCDefination.h头文件加入工程。
混淆后,如果工程增加代码,需要再次混淆,先删除项目里的STCDefination.h文件,再次在模拟器DEBUG环境下运行,将新生成的STCDefination.h头文件加入工程。
步骤七:
在 RELEASE 环境下运行工程,实现代码混淆。
1、混淆前
2、混淆后
另外,如果采用jenkins集成了项目,在jenkins中有进行pod update 处理,请在pod update 后加上以下脚本,
其中SRCROOT必须在脚本中配置为jenkins打包job中的要混淆的工程的根目录。
dir=${SRCROOT}/Pods headerFile=${SRCROOT}/STCDefination.h file_count=0 file_list=`ls -R $dir 2> /dev/null | grep -v ‘^$’` for file_name in $file_list do temp=`echo $file_name | sed ‘s/:.*$//g’` if [ “$file_name” != “$temp” ]; then cur_dir=$temp else if [ ${file_name##*.} = pch ]; then echo $file_name find -P $dir -name $file_name > tmp1.txt var1=$(cat tmp1.txt) echo $var1 var2=$(cat $headerFile) echo “” > $var1 echo “Pipe” echo “$var2” | while read line do echo “$line” >> $var1 done rm tmp1.txt fi let file_count++ fi done
注:对于大量采用runtime的库比如RAC,RN,尽量不混淆,另外那些采用反射机制映射的类、字段和方法依赖接口的,也不要混淆,这些情况一般自动化的工具很难解决,还是需要手工处理过滤下,比如那些暴露给RN的属性,一旦混淆,RN就崩溃了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注