標籤:
轉自:http://blog.csdn.net/yiyaaixuexi/article/details/29201699
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 "//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 <UIKit/UIKit.h>
- #import <Foundation/Foundation.h>
- //添加混淆作用的標頭檔(這個檔案名稱是指令碼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的隨機字元不同
Objective-C代碼混淆(轉)