iOS 代码混淆

原文链接:http://yupeng.fun/2019/01/08/recode/

简介

class-dump 可以很方便的导出程序头文件,考虑到App安全问题,防止我们核心的代码被别看到,需要对我们的代码进行混淆。

class-dump介绍

  • class-dump可以将 Mach-O 文件中的 OC 运行时的声明信息导出,即编写 OC 代码时的.h文件。class-dump是对"otool -ov"信息的翻译.以一种我们熟悉的易读的方式呈现。

Mach-O(Mach Object File Format)是 macOS 上的可执行文件格式,类似于 Linux 和大部分 UNIX 的原生格式

  • otool工具
    otool(object file displaying tool):目标文件的展示工具。可以用来发现应用中使用到了那些系统库,调用了那些系统方法。使用了库中那些对象及属性,它是Xcode自带的常用工具。
  • class-dump安装和使用
    1、下载 class-dump http://stevenygard.com/projects/class-dump/
    2、将 class-dump 执行文件拖入到 /usr/local/bin 目录下
    3、导出 .h 文件,用终端输入命令class-dump -H [.app文件的路径] -o [输出文件夹路径]
class-dump -H .../xxx.app -o .../file
class-dump -H /System/Library/Frameworks/AppKit.framework -o .../file


Objective-C 代码混淆

我们希望在开发时一直保留清晰可读的程序代码,方便自己。同时,希望编译出来的二进制包含乱七八糟的混淆后的程序代码,防止他人看到。可以在Build Phrase 中设定在编译之前进行方法名的字符串替换。

1、创建混淆脚本 confuse.sh
目的是为了把敏感方法名集中写在一个名叫func.list的文件中,逐一 #define 成随机字符,追加写入.h。

#!/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

2、配置 Build Phase
在工程Build Phase中添加执行脚本操作,执行confuse.sh脚本

3、创建函数名列表func.list,写入待混淆的函数名,并将文件放置于与confuse.sh脚本同级如:
-(void)sample;
-(void)seg1:(NSString *)string seg2:(NSUInteger)num;
这样写:
sample
seg1
seg2

4、build 项目,混淆脚本会在编译前运行,进行字符随机替换,并且每次build的随机字符不同
如有报错:


需要切换到工程目录下,输入命令行 chmod 755 confuse.sh 给我们的脚本本间授权
编译项目成功后,在工程目录下面脚本生成了 codeObfuscation.h 文件
把混淆头文件 codeObfuscation.h 加入 Prefix.pch 中。

5、编译查看结果


codeObfuscation.h
class-dump 导出的头文件

Reference

https://www.desgard.com/iosre-1/
https://blog.csdn.net/yiyaaixuexi/article/details/29201699
https://www.jianshu.com/p/0d42e5c6361c

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