代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。目前已经存在许多种功能各异的代码混淆器。
将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。打乱代码的格式。比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。
工具:https://github.com/chenxiancai/STCObfuscator
STCObfuscator 是用来进行object-c代码混淆的工具,在模拟器DEBUG环境下运行生成混淆宏,混淆的宏可以在其他环境下进行编译,支持Cocoapod代码混淆。
一、使用:
pod 'STCObfuscator'
把下面的代码加入到Appdelegate didFinishLaunchingWithOptions方法里,
#import "STCObfuscator.h"
#if (DEBUG == 1)
[[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)]];
#endif
完成下面配置:
1.在 Build Settings->Preprocessor Macros->DEBUG 中添加环境变量。
LINKMAP_FILE=$(TARGET_TEMP_DIR)/$(PRODUCT_NAME)-LinkMap-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt 和ROOT_PATH="${SRCROOT}"
2.在 Build Settings 开启Write Link Map File, 设置成 YES。
3.将下面的脚本添加到 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
4.在pch文件中添加以下代码:
#if (DEBUG != 1)
#import "STCDefination.h"
#endif
5.在DEBUG环境下用模拟器运行工程,在STCDefination.h头文件中生成混淆的宏。所有的混淆符号会保留在工程目录下的confuse.json。
6.把工程目录下STCDefination.h头文件加入工程。
混淆后,如果工程增加代码,需要再次混淆,先清空STCDefination.h里面的内容,不能留任何空格和换行,然后pod update,再次在模拟器DEBUG环境下运行。
7.在 RELEASE 环境下运行工程,实现代码混淆。
混淆前逆向。
混淆后逆向。
二、iOS逆向工程之class-dump
1.安装:
下载地址:http://stevenygard.com/projects/class-dump/
将dmg文件中的class-dump文件复制到 /usr/local/bin , 终端输入 sudo chmod 777 /usr/local/bin/class-dump 更改权限
显示class-dump的用法和版本:class-dump --help
2.使用方法:
用终端输入命令 class-dump -H [.app文件的路径] -o [输出文件夹路径]
3.问题:Error: Cannot find offset for address 0x200000000100d256 in stringAtAddress:
原因:class-dump是利用Object-C语言的runtime特性,提取头文件,class-dump目前没法作用于Swift,如果项目中用到了OC和Swift混编,class-dump会失败。