iOS安全/程式碼混淆
APP 一般經常做的網路引數加密解密,加密方法有base64、MD5、AES、RSA、DES等加密方法、這些加密一般都是給資料進行加密、防止資料外漏。但是今天我要介紹的是防範反彙編風險,防止咋們APP的程式碼讓別人反編譯,不過Apple還算安全反編譯過來也只能看到.h檔案。不過為了安全起見我們還是將程式碼進行混淆,這樣比較安全些。
一、先介紹下反編譯工具 class-dump 的使用
class-dump 的安裝這裡就先不介紹了、可以參考網上資料。class-dump的使用很簡單(預設你已經安裝class-dump),現將ipa字尾改為zip:
這裡的ipa包不可以是AppStore上下載的、因為AppStore上下載的ipa包、Apple是又經過加密的、需要自己破殼,想知道怎麼給AppStore下載的ipa進行破殼,看iOS應用逆向工程。
將zip解壓、得到app二進位制檔案,下面就使用class-dump將app進行反編譯:開啟Terminal:輸入命令 class-dump -H app二進位制檔案路徑 -o 反編譯後.h檔案的存放路徑
回車後就得到了反編譯的.h檔案
class-dump 功能很強大,只是在終端輸入一行命令,就可以反編譯app的二進位制檔案,得到所有.h 檔案。以下就是為了防止反編譯,通過分下.h檔案,對咋們的app進行一些操作(外掛就是這麼來的),所以要將我們.h檔案中的程式碼進行混淆,即使反編譯得到.h檔案,也很難分析。
二、將程式碼進行混淆
1.在專案根目錄下新建confuse.sh 和 gbFunc.list 檔案
說明:
confuse.sh 檔案在編譯過程中會執行gbFunc.list 用於自動混淆程式碼時,存放過濾出來需要混淆的方法名
touch confuse.sh
touch gbFunc.list
2.新建PFConfuse.h
說明:
GBConfuse.h 是在自動混淆程式碼時,將會把自動生成的字串定義成巨集,存放在此檔案,也便於檢視。
注意:需要把.h檔案移到專案檔案外,因為放專案檔案中,到時被反編譯過來,還是能得到GBConfuse.h裡面的東西的,就能通過比對,得到方法。(後面用class-dump反編譯過來就明白了...)
3.在confuse.sh中新增如下程式碼、(先看下效果、程式碼在下面)
下面是要複製程式碼:
!/usr/bin/env bash
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
func.list路徑
STRING_SYMBOL_FILE="$PROJECT_DIR/GBFunc.list"
專案檔案路徑
CONFUSE_FILE="$PROJECT_DIR/SafetyTest"
Confuse.h路徑
HEAD_FILE="$PROJECT_DIR/PFConfuse.h"
export LC_CTYPE=C
取以.m或.h結尾的檔案以+號或-號開頭的行 |去掉所有+號或-號|用空格代替符號|n個空格跟著<號 替換成 <號|開頭不能是IBAction|用空格split字串取第二部分|排序|去重複|刪除空行|刪掉以init開頭的行>寫進func.list
grep -h -r -I "^[-+]" $CONFUSE_FILE --include '.[mh]' |sed "s/[+-]//g"|sed "s/[();,: ^/{]/ /g"|sed "s/[ ]</</"| sed "/^[ ]IBAction/d"|awk '{split($0,b," "); print b[2]; }'| sort|uniq |sed "/^$/d"|sed -n "/^PFSAFE_/p" >$STRING_SYMBOL_FILE
維護資料庫方便日後作排重,以下程式碼來自念茜的微博
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 PFConfuse_h
define CodeConfuse' >> $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
需要修改的程式碼在於檔案路徑:
4.新增 Run Script
5.新增 PCH 檔案
引用.h檔案
6.新增以 "PFSAFE_"為字首的方法(以PFSAFE_為字首的方法就是要混淆程式碼的方法)
7.進行測試
執行報錯如下:
原因是.sh檔案沒有許可權,所以需要去開啟許可權。
解決方法:執行終端,在confuse.sh檔案目錄下,執行命令:
chmod 755 confuse.sh
再執行專案即可成功執行
現不進行混淆程式碼,打包一個.ipa包進行測試
使用class-dump(以上步驟"一",介紹內容):看看咋們反編譯後得到的檔案
再看看ViewController.h檔案:
自己寫的方法通過反編譯完全暴露、別人就可以通過判斷這些方法幹什麼用的,再將app注入自己寫的dylib動態庫,對app乾點別的事情,這也是外掛的實現原理。
再將混淆過的程式碼,打包一個.ipa進行測試:
同上,使用 class-dump 將 app 二進位制檔案進行反編譯:
總結:通過.sh 指令碼檔案,將個別方法以隨機生成字串的形式,將方法混淆,以至於反編譯後無法判斷該方法的作用,而達到 APP 更安全。
特別注意(以上、"二"中的2步):將 PFConfuse.h 移動到專案外,別放到專案中,因為放到專案中,到時候被反編譯也可得到,那就通過對比 PFConfuse.h 中的內容,判斷出方法。
三、參考文章
1、 iOS開發/App安全/程式碼自動混淆筆記
2、 iOS自動程式碼混淆
3、 念茜/Objective-C程式碼混淆
3、 class-dump最新安裝方法
如對iOS應用逆向工程感興趣,可以參考以下文章:
1、一步一步實現iOS微信自動搶紅包(非越獄)
2、iOS 逆向 - 微信 helloWorld
相關文章
- ios加固,ios程式碼混淆,ios程式碼混淆工具, iOS原始碼混淆使用說明詳解iOS原始碼
- iOS 初探程式碼混淆(OC)iOS
- 前端程式碼安全與混淆前端
- iOS應用加固--程式碼混淆iOS
- 程式碼混淆工具ipaguard:如何使用ipaguard保護和混淆iOS應用程式程式碼iOS
- 程式碼安全之程式碼混淆及加固(Android)?Android
- Flutter 程式碼混淆 混淆Dart程式碼FlutterDart
- ios-class-guard - iOS程式碼混淆與加固實踐iOS
- 【程式碼混淆】react-native 程式碼混淆React
- js程式碼混淆JS
- 基於多重替換方式的iOS程式碼混淆方案iOS
- Android程式碼混淆&元件化混淆方案Android元件化
- .net程式混淆、安全、保護、加密加密
- 鴻蒙程式碼配置混淆鴻蒙
- Android程式碼混淆Android
- Python程式碼混淆工具,Python原始碼保密、加密、混淆Python原始碼加密
- 程式碼混淆與反混淆學習-第二彈
- powershell程式碼混淆繞過
- 程式碼混淆的規則
- iOS使用shell指令碼注入混淆內容iOS指令碼
- JavaScript混淆安全加固JavaScript
- ArkTS 應用的程式碼混淆策略:提升安全性與效能
- 聊聊如何進行程式碼混淆行程
- Android 程式碼混淆規則Android
- 教你5步搞定程式碼混淆
- Android Studio 程式碼混淆Android
- Android 專案程式碼混淆Android
- Python 程式碼混淆工具概述Python
- SpringBoot程式碼混淆與反混淆加密工具詳解Spring Boot加密
- android 混淆規則作用,Android程式碼混淆詳解Android
- 逆向破解js程式碼加密,程式碼混淆不是難事JS加密
- Python 的控制流程式碼混淆Python
- Spring Boot使用Allatori程式碼混淆Spring Boot
- 使用proguard混淆springboot程式碼Spring Boot
- Java程式碼混淆工具入門——Allatori~Java
- 使用模擬器混淆前端程式碼前端
- MSWord-用欄位程式碼混淆
- 對.net 程式進行原始碼混淆原始碼