代码混淆

代码混淆(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会失败。

你可能感兴趣的:(代码混淆)