iOS 代碼混淆

簡介

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é)果


codeObfuscation.h
class-dump 導(dǎo)出的頭文件

Reference

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 代碼易讀字符串混淆 混淆分許多思路,比如: 1)花代碼花指令,即隨意往程序中加入迷惑人的代碼指令 2)易讀字符替換...
    Mikayla321閱讀 7,751評(píng)論 5 13
  • 前言 什么!我們的代碼拿去安全掃描啦?什么!還掃描出來問題啦?什么!源碼都別看到啦? 居于上一篇文章iOS簡單逆向...
    甘邦閱讀 18,279評(píng)論 24 40
  • 推薦 兩個(gè)github的庫,自動(dòng)代碼混淆,不過本人做的時(shí)候生成了codeObfuscation.h 手動(dòng)加 雖然有...
    大佬的世界我不懂閱讀 1,443評(píng)論 6 10
  • 1.4版本 來自猜猜我叫什么_bd1f的技術(shù)支持 來自Stark1937的建議 閱讀本篇文章,需要先會(huì)class-...
    SDBridge閱讀 43,695評(píng)論 118 156
  • 一. 為什么要代碼混淆? 系統(tǒng)安全性很高是iOS一大特征,上傳到appstore的應(yīng)用,雖然已經(jīng)被系統(tǒng)加密,但并非...
    突刺刺閱讀 1,743評(píng)論 1 0

友情鏈接更多精彩內(nèi)容