iOS代碼混淆

前言

什么!我們的代碼拿去安全掃描啦?什么!還掃描出來問題啦?什么!源碼都別看到啦?

居于上一篇文章iOS簡單逆向之:Class-Dump、Hopper說如何做到把我們的App通過Class-dump導(dǎo)出來我們的頭文件,還有利用Hopper分析我們的代碼邏輯結(jié)果,可知道別人很容易就可以獲取到我們代碼的信息信息!!那么我們?nèi)绾畏乐刮覀兒诵牡拇a被別Hook呢,下面步驟對我們的代碼進行混淆。

一、代碼安全掃描

做安全掃描的同事都應(yīng)該熟練操作class-dump和Hopper這兩款工具了,下面是他們對項目的掃描結(jié)果,心痛自己。

代碼.png
函數(shù).png

每次說要把我們的項目放去掃描,心里都捏了一把汗,每次都能找到一些漏洞,真羞人哈哈哈哈。

二、代碼易讀字符串混淆

混淆分許多思路,比如:
1)花代碼花指令,即隨意往程序中加入迷惑人的代碼指令
2)易讀字符替換

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

首先切換到我們的項目目錄下,創(chuàng)建兩個文件:
confuse.sh: 存放混淆的腳本
func.list: 需要混淆的方法、變量名

創(chuàng)建文件

右鍵項目名稱,把這兩個文件導(dǎo)進來項目中來

添加新建項目到項目中

然后打開 confuse.sh 文件,添加以下腳本:
<pre>

!/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

維護數(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
</pre>

2.2 配置 Build Phase

點擊工程名稱 — > Build Phase — > Run Script

設(shè)置

在里面添加 $PROJECT_DIR/confuse.sh ,這句命令的意思的應(yīng)用每次啟動的時候,都會先去跑我們confuse.sh 腳本

添加運行腳本的本間

這時候,我們編譯一下,會發(fā)現(xiàn)報錯:

錯誤信息

解決辦法:切換到工程目錄下,輸入命令行 chmod 755 confuse.sh 給我們的腳本本間授權(quán)

授權(quán)

此時,我們再編譯一下項目,然后在工程目錄下,我們會多出一個codeObfuscation.h文件

混淆后的代碼

這里面是用來裝混淆前 —> 混淆后的代碼對比

同樣把這個文件拉到項目中,我們再建一個PCH文件來引入這個文件,那么整個項目都可以實現(xiàn),宏的替換了。

配置PCH文件

然后打開PCH文件,導(dǎo)入頭文件:

導(dǎo)入頭文件
2.3 混淆的變量,方法名

下面我們舉例子,比如我想混淆以下的變量和方法:

需要混淆的內(nèi)容

那么打開 func.list 文件,一一把名稱打進去

需要混淆的內(nèi)容

然后點擊編譯,這樣子我們需要混淆的代碼就已經(jīng)混淆成功了。但是也不會印象到我們的閱讀。這里是通過宏定義來修改的:

我們的方法

混淆的代碼,其實就是通過把敏感的變量、代碼通過宏來修改掉:

混淆

注意:

1、 系統(tǒng)的方法
2、XIB中拖線的控件名

這些都不能用這個方法混淆,因為會導(dǎo)致運行的時候出錯。

參考
念茜女神http://blog.csdn.net/yiyaaixuexi/article/details/29201699

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

推薦閱讀更多精彩內(nèi)容