Objective-C 代碼混淆

class-dump 可以很方便的導出程序頭文件,不僅讓攻擊者了解了程序結構方便逆向,還讓著急趕進度時寫出的欠完善的程序給同行留下笑柄。 所以,我們迫切的希望混淆自己的代碼。

混淆的常規思路

混淆分許多思路,比如:

1)花代碼花指令,即隨意往程序中加入迷惑人的代碼指令

2)易讀字符替換 等等

防止 class-dump 出可讀信息的有效辦法是易讀字符替換。

Objective-C 的方法名混淆

混淆的時機

我們希望在開發時一直保留清晰可讀的程序代碼,方便自己。 同時,希望編譯出來的二進制包含亂七八糟的混淆后的程序代碼,惡心他人。

因此,我們可以在 Build Phrase 中設定在編譯之前進行方法名的字符串替換。

混淆的方法

方法名混淆其實就是字符串替換,有 2 個方法可以,一個是 #define,一個是利用 tops。

利用 #define 的方法有一個好處,就是可以把混淆結果合并在一個 .h 中,在工程 Prefix.pch 的最前面 #import 這個 .h 。不導入也可以編譯、導入則實現混淆。

單段的 selector ,如 func: ,可以通過 #define func 來實現字符串替換。

多段的 selector,如 a:b:c: ,可以通過分別 #define a 、b、c 來實現字符串替換。

我的混淆工具

我寫了個簡易的混淆腳本,主要思路是把敏感方法名集中寫在一個名叫 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 "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


操作步驟

1.將混淆腳本 confuse.sh 放到工程目錄下 mv confuse.sh your_proj_path/

2.修改 Prefix.pch

打開 Xcode,修改 XXX-Prefix.ch ,添加混淆頭文件:


#ifdef __OBJC__? ? ? #import#import//添加混淆作用的頭文件(這個文件名是腳本confuse.sh中定義的)

#import "codeObfuscation.h"

#endif

3.配置 Build Phase

在工程 Build Phase 中添加執行腳本操作,執行 confuse.sh 腳本,如圖:

4.創建函數名列表 func.list ,寫入待混淆的函數名,如:

-(void)sample;

-(void)seg1:(NSString *)string seg2:(NSUInteger)num;

就這樣寫:

sample

seg1

seg2

并將文件放置于與 confuse.sh 腳本同級

mv func.list your_proj_path/

5.編譯查看結果

直接 build,混淆腳本會在編譯前運行,進行字符隨機替換,并且每次 build 的隨機字符不同,如圖:


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 注:原文---念茜的博客 class-dump可以很方便的導出程序頭文件,不僅讓攻擊者了解了程序結構方便逆向,還讓...
    richar_閱讀 533評論 0 0
  • 參考原文:iOS安全攻防(二十三):Objective-C代碼混淆 混淆本質就是進行宏替換,讓別人使用class-...
    耳獨閱讀 681評論 0 0
  • 前言: 在iOS移動端開發中很多時候在考慮安全問題的時候只是單純的請求體加密,但是在一個用戶量級很大的App上就會...
    退役程序猿閱讀 6,251評論 2 17
  • 1.終端 cd Desktoptouch confuse.sh 隨便找個編輯器打開 confuse.sh文件??截?..
    客三消閱讀 1,980評論 2 50
  • 然后將混淆腳本寫入confuse.sh文件里面 !/usr/bin/env bash TABLENAME=symb...
    莼藍Oo閱讀 1,538評論 2 1