編譯:就是把千千萬(wàn)萬(wàn)行字符串(也叫代碼妓布,或者源文件)堡掏,變成010101010101(機(jī)器碼购城,也叫目標(biāo)代碼)吕座;編譯過(guò)程:預(yù)處理-編譯-匯編-鏈接;混淆代碼的shell腳本運(yùn)行在預(yù)處理階段瘪板。這里主要參考了網(wǎng)上一些比較流程的做法吴趴,對(duì)特定前綴的方法名(比如:hsk_function)進(jìn)行字符串替換。
shell腳本添加的路徑為:
Xcode -> Target -> Build Phases -> 添加Run Script
通過(guò)class-dump 反編譯之后:Appdelegate 效果
程序每次預(yù)處理侮攀,都就會(huì)執(zhí)行confuse.sh,從.m和.h文件中按照"一定的規(guī)則"抽取需要混淆的函數(shù)名史侣,全部寫到func.list臨時(shí)文件中,然后再?gòu)膄unc.list中逐行提取函數(shù)名進(jìn)行宏定義,宏定義使用隨機(jī)字符串,然后寫到codeObfuscation.h文件中。
===============================================
以下為我的shell腳本代碼魏身,是基于HSKConfuse進(jìn)行修改調(diào)整的
===============================================
#!/usr/bin/env bash
########################################
#
#? 將代碼中以scf_開(kāi)頭的方法名進(jìn)行混淆處理 (scf:sensitive confused function)
#
########################################
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
TEM_SYMBOL_FILE="$PROJECT_DIR/***/Supporting-Files/confuse/func.list"#臨時(shí)文件
CONFUSE_FILE="$PROJECT_DIR/***"
HEAD_FILE="$PROJECT_DIR/***/Supporting-Files/confuse/CodeOfConfuseHeader.h"
export LC_CTYPE=C
#####################################################################################################################
#混淆種子數(shù)組,用常規(guī)的單詞替換隨機(jī)生成的字符串蚪腐,避免審核的時(shí)候被拒
confuse_sed_1=("touch""get""upload""push""take""make""send""reach""do""is""has""rest""add""check""pick""comment""change")
confuse_sed_2=("Item""Key""Midea""System""Route""Chat""Commis""Info""User""Direction""Moon""Url""Param""Random""Num")
confuse_sed_3=("Home""Page""Function""Method""Location""Count""Topic""Message""Info""Title""Icon""Image""Text""String")
confuse_sed_4=("At""On""In""Before""After""And""Front""Of""With""By""Without""Start""Max""Min""Level""Exist""Out")
confuse_sed_5=("Xing""Hou""Cation""Prj""Direction""Symbol""Name""Value""Fun""Action""Info""Email""Index""Table""Seed")
# 混淆字符串容器
confuse_string_container=()
# 獲取隨機(jī)數(shù)組下標(biāo),需要傳入數(shù)組長(zhǎng)度作為參數(shù)
# eg:$(randomSenArrayIndex 5)
function randomSenArrayIndex(){
max=$1
num=$RANDOM#系統(tǒng)隨機(jī)數(shù)變量
((retnum=num%max+min))
#進(jìn)行求余數(shù)運(yùn)算即可
echo$retnum
#這里通過(guò)echo 打印出來(lái)值箭昵,然后獲得函數(shù)的,stdout就可以獲得值
#還有一種返回回季,定義全價(jià)變量家制,然后函數(shù)改下內(nèi)容正林,外面讀取
}
# 傳入的字符串是否出現(xiàn)在confuse_string_container中
# eg:(isRandomStringExist "123")
# return: 0:不存在 1:存在
function isRandomStringExist(){
sed=$1
isSedExist=false
for iin${confuse_string_container[@]};do
if[[$i==$sed]];then
isSedExist=true
break
fi
done
echo$isSedExist
}
# 基于混淆種子數(shù)組獲取隨機(jī)字符串,不可重復(fù)
function randomString(){
# 下標(biāo)
idx1=$(randomSenArrayIndex${#confuse_sed_1[*]})
idx2=$(randomSenArrayIndex${#confuse_sed_2[*]})
idx3=$(randomSenArrayIndex${#confuse_sed_3[*]})
idx4=$(randomSenArrayIndex${#confuse_sed_4[*]})
idx5=$(randomSenArrayIndex${#confuse_sed_5[*]})
r="${confuse_sed_1[${idx1}]}${confuse_sed_2[${idx2}]}${confuse_sed_3[${idx3}]}${confuse_sed_4[${idx4}]}${confuse_sed_5[${idx5}]}"
if[[$(isRandomStringExist$r)=false]]
then
confuse_string_container=(${confuse_string_container[@]}$r)
echo$r
else
randomString
fi
}
#####################################################################################################################
#創(chuàng)建list臨時(shí)文件
touch$TEM_SYMBOL_FILE
#取以.m或.h結(jié)尾的文件以+號(hào)或-號(hào)開(kāi)頭的行 |去掉所有+號(hào)或-號(hào)|用空格代替符號(hào)|n個(gè)空格跟著<號(hào) 替換成 <號(hào)|開(kāi)頭不能是IBAction|用空格split字串取第二部分|排序|去重復(fù)|刪除空行|刪掉以init開(kāi)頭的行>寫進(jìn)func.list
grep-h-r-I"^[-+]"$CONFUSE_FILE--include'*.[mh]'|sed"s/[+-]//g"|sed"s/[();,: *\^\/\{]/ /g"|sed"s/[ ]*$TEM_SYMBOL_FILE
#維護(hù)數(shù)據(jù)庫(kù)方便日后作排重,一下代碼來(lái)自念茜的微博
function createTable(){
echo"create table $TABLENAME(src text, des text);"| sqlite3$SYMBOL_DB_FILE
}
function insertValue(){
echo"insert into $TABLENAME values('$1' ,'$2');"| sqlite3$SYMBOL_DB_FILE
}
function query(){
echo"select * from $TABLENAME where src='$1';"| sqlite3$SYMBOL_DB_FILE
}
rm-f$SYMBOL_DB_FILE
rm-f$HEAD_FILE
createTable
touch$HEAD_FILE
echo'#ifndef CodeOfConfuseHeader_h
#define CodeOfConfuseHeader_h'>>$HEAD_FILE
echo"http://confuse string at `date`">>$HEAD_FILE
cat"$TEM_SYMBOL_FILE"|while read-raline;do
if[[!-z"$line"]];then
ramdom=`randomString`
echo$line$ramdom
insertValue$line$ramdom
echo"#define $line $ramdom">>$HEAD_FILE
fi
done
echo"#endif">>$HEAD_FILE
sqlite3$SYMBOL_DB_FILE.dump
#刪除list臨時(shí)文件
rm-f$TEM_SYMBOL_FILE
致謝大牛們的無(wú)私分享:
1、Coder_Hou《iOS代碼混淆----自動(dòng)》
2颤殴、念茜《https://blog.csdn.net/yiyaaixuexi/article/details/29201699》