天天看點

iOS 代碼混淆

              不過據我後來在網上查詢很多人說,跑腳本的混淆,稽核直接被拒。

    • 混淆分許多思路,比如:
    • 1.cd到你的工程目錄下,建立兩個檔案
    • 2.打開工程,把剛才建立的兩個檔案添加到工程中,在工程中再建立兩個檔案分别是pch檔案和一個.h檔案,并在pch中引入剛一同建立的.h
    • 3.配置Phases
    • 4.向腳本confuse.sh中添加代碼
    • 5.編譯
    • 注意:
    • 附反編譯:
      • 1.1 Class-Dunp 簡介
      • 1.2 Class-Dump 下載下傳位址
      • 1.3 安裝
      • 1.4 使用
      • 2.1 什麼是Hopper
      • 2.2 下載下傳位址
      • 2.3 使用

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

2)易讀字元替換

具體步驟:

confuse.sh: 存放混淆的腳本
func.list:  需要混淆的方法、變量名
           
iOS 代碼混淆

pch不會配置的童鞋看過來,會的童鞋可自動忽略這一步:

iOS 代碼混淆

然後點選4的後邊輸入:$(SRCROOT)然後把pch拖進來,删除前邊多餘路徑。

如圖:

iOS 代碼混淆

(初學者盡量名字用這兩個,否則可能會在後邊的配置中出錯)

iOS 代碼混淆

填寫 $PROJECT_DIR/confuse.sh(注:這兒的confuse.sh的路徑随你建立這個檔案的位置而改變)

iOS 代碼混淆

#!/usr/bin/env bash

TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"

CONFUSE_FILE="$PROJECT_DIR/HXTest"

HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/Confuse.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 "/^hx_/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 Confuse_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
           

其中

STRING_SYMBOL_FILE="func.list"

CONFUSE_FILE="$PROJECT_DIR/HXTest"

HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/Confuse.h"           
#這裡也要做修改
echo '#ifndef Confuse_h           

均需要根據自己的進行修改(如果名字和位置和我的建立的一樣,目前不需要修改)

hx_

是你在代碼中要混淆的方法名和變量的字首,方法變量前增加字首是為了和系統方法區分開,可以根據自己寫的方法自定義。

此時編譯應該會報一個沒有權限的錯誤,此時,切換到工程目錄下,輸入指令行 chmod 755 confuse.sh 給我們的腳本本間授權,如圖:

iOS 代碼混淆

此時應該能順利編譯通過,混淆成功。

iOS 代碼混淆

前邊是混淆前的,後邊是混淆後的名字。

1、 系統的方法

2、XIB中拖線的控件名

這些都不能用這個方法混淆,因為會導緻運作的時候出錯。

參考

念茜女神javascript:void(0)

Class-Dump是一款可以導出頭檔案的指令行工具,改程式用于檢查objective - c運作時資訊存儲在Mach-O檔案,它生成類的聲明,類别和協定。

http://stevenygard.com/projects/class-dump/

輕按兩下.dmg 檔案打開,把裡面的檔案拖到 /usr/local/bin 目錄下,因為是修改了系統的路徑,是以需要輸入本機的密碼,這樣就可以在終端使用 class-dump 指令了。

注意這裡dump的是應用字尾是.app而不是.ipa:

然後打開終端,輸入指令

class-dump -H XXX.app -o XXX

iOS 代碼混淆

-H 後面的内容為需要dump的 .app 檔案路徑

-o 後面的内容為輸出的頭檔案儲存路徑

因為我是儲存到桌面的,是以等指令執行完成之後,我就可以在桌面上找到Dump這個名字的檔案夾了,并且裡面已經裝滿了我們想要的頭檔案了

打開ViewController.h,已經是混淆過的代碼了