iOS代码混淆

项目工程中必须有pch 文件

pcth的添加步骤

File > New > File > iOS > Other > PCH File

搜索Prefix Header

添加Prefix Header路径 项目名/Prefix Header名, Precompile Prefix Header 设置为YES

混淆步骤

** 在项目主目录下添加confuse.sh shell脚本和func.list 文件 **

func.list文件是用来存放需要混淆的名字(属性名,方法名) 举个例子:下面是我们需要混淆的属性名和方法名

@property (nonatomic, copy) NSString *name;

+ (void)sayHi; 我们只需要在func.list输入

name
sayHi

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

** 在pch中添加脚本中指定的混淆头文件 codeObfuscation.h **

#ifndef PrefixHeader_pch
#define PrefixHeader_pch

#import "codeObfuscation.h"//混淆头文件引入

#endif

此时产生编译错误,没有找到codeObfuscation.h,没多大关系,因为我们还没有关联脚本运行脚本文件。

** 下面是关联运行confuse.sh的步骤:**

Build Phase 点击左上角的+按钮,选择New Run Script Phrase

在输入框中输入$PROJECT_DIR/confuse.sh

cmd + b 重新编译项目,编译成功。

到编译纪录中可查看到已经为我们的项目生成了很多宏定义。混淆成功。这下class dump 出来的头文件就看不到方法名了。 念茜安全博客 第23篇 简书作者iOS代码混淆

最近的文章

pro git 阅读笔记

继续阅读
更早的文章

gdb/adb/lldb

GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c++程序员,gdb是必不可少的工具;Android 调试桥 (adb) 是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。LLDB是个开源的内置于XCode的具有REPL(read-eval-print-loop)特征的Debugger,其可以安装C++或者Python插件。开发iOS程序的时候常常会用到调试跟踪。xcod...…

继续阅读