簡介
class-dump 可以很方便的導(dǎo)出程序頭文件,考慮到App安全問題,防止我們核心的代碼被別看到,需要對(duì)我們的代碼進(jìn)行混淆。
class-dump介紹
- class-dump可以將 Mach-O 文件中的 OC 運(yùn)行時(shí)的聲明信息導(dǎo)出,即編寫 OC 代碼時(shí)的.h文件。class-dump是對(duì)"otool -ov"信息的翻譯.以一種我們熟悉的易讀的方式呈現(xiàn)。
Mach-O(Mach Object File Format)是 macOS 上的可執(zhí)行文件格式,類似于 Linux 和大部分 UNIX 的原生格式
- otool工具
otool(object file displaying tool):目標(biāo)文件的展示工具??梢杂脕戆l(fā)現(xiàn)應(yīng)用中使用到了那些系統(tǒng)庫,調(diào)用了那些系統(tǒng)方法。使用了庫中那些對(duì)象及屬性,它是Xcode自帶的常用工具。
- class-dump安裝和使用
1、下載 class-dump http://stevenygard.com/projects/class-dump/
2、將 class-dump 執(zhí)行文件拖入到 /usr/local/bin 目錄下
3、導(dǎo)出 .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 代碼混淆
我們希望在開發(fā)時(shí)一直保留清晰可讀的程序代碼,方便自己。同時(shí),希望編譯出來的二進(jìn)制包含亂七八糟的混淆后的程序代碼,防止他人看到??梢栽贐uild Phrase 中設(shè)定在編譯之前進(jìn)行方法名的字符串替換。
1、創(chuàng)建混淆腳本 confuse.sh
目的是為了把敏感方法名集中寫在一個(gè)名叫func.list的文件中,逐一 #define 成隨機(jī)字符,追加寫入.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
#維護(hù)數(shù)據(jù)庫方便日后作排重
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 "http://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中添加執(zhí)行腳本操作,執(zhí)行confuse.sh腳本
3、創(chuàng)建函數(shù)名列表func.list,寫入待混淆的函數(shù)名,并將文件放置于與confuse.sh腳本同級(jí)如:
-(void)sample;
-(void)seg1:(NSString *)string seg2:(NSUInteger)num;
這樣寫:
sample
seg1
seg2
4、build 項(xiàng)目,混淆腳本會(huì)在編譯前運(yùn)行,進(jìn)行字符隨機(jī)替換,并且每次build的隨機(jī)字符不同
如有報(bào)錯(cuò):

需要切換到工程目錄下,輸入命令行 chmod 755 confuse.sh 給我們的腳本本間授權(quán)
編譯項(xiàng)目成功后,在工程目錄下面腳本生成了 codeObfuscation.h 文件
把混淆頭文件 codeObfuscation.h 加入 Prefix.pch 中。
5、編譯查看結(jié)果



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