Objective-C項(xiàng)目代碼混淆

編譯:就是把千千萬(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》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末觅廓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子涵但,更是在濱河造成了極大的恐慌杈绸,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矮瘟,死亡現(xiàn)場(chǎng)離奇詭異瞳脓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)澈侠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門劫侧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人哨啃,你說(shuō)我怎么就攤上這事烧栋。” “怎么了拳球?”我有些...
    開(kāi)封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵审姓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我醇坝,道長(zhǎng)邑跪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任呼猪,我火速辦了婚禮画畅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宋距。我一直安慰自己轴踱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布谚赎。 她就那樣靜靜地躺著淫僻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壶唤。 梳的紋絲不亂的頭發(fā)上雳灵,一...
    開(kāi)封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音闸盔,去河邊找鬼悯辙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的躲撰。 我是一名探鬼主播针贬,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拢蛋!你這毒婦竟也來(lái)了桦他?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谆棱,失蹤者是張志新(化名)和其女友劉穎快压,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體础锐,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗓节,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了皆警。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拦宣。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖信姓,靈堂內(nèi)的尸體忽然破棺而出鸵隧,到底是詐尸還是另有隱情,我是刑警寧澤意推,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布豆瘫,位于F島的核電站,受9級(jí)特大地震影響菊值,放射性物質(zhì)發(fā)生泄漏外驱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一腻窒、第九天 我趴在偏房一處隱蔽的房頂上張望昵宇。 院中可真熱鬧,春花似錦儿子、人聲如沸瓦哎。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蒋譬。三九已至,卻和暖如春愉适,著一層夾襖步出監(jiān)牢的瞬間犯助,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工维咸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剂买,地道東北人扑媚。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像雷恃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子费坊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • 代碼易讀字符串混淆 混淆分許多思路倒槐,比如: 1)花代碼花指令,即隨意往程序中加入迷惑人的代碼指令 2)易讀字符替換...
    Mikayla321閱讀 7,517評(píng)論 5 13
  • class-dump 可以很方便的導(dǎo)出程序頭文件附井,不僅讓攻擊者了解了程序結(jié)構(gòu)方便逆向讨越,還讓著急趕進(jìn)度時(shí)寫出的欠完善...
    無(wú)灃閱讀 576評(píng)論 1 0
  • APP 一般經(jīng)常做的網(wǎng)絡(luò)參數(shù)加密解密,加密方法有base64永毅、MD5把跨、AES、RSA沼死、DES等加密方法着逐、這些加密一...
    flyrees閱讀 1,237評(píng)論 1 3
  • iOS安全攻防(二十三):Objective-C代碼混淆 轉(zhuǎn)載https://blog.csdn.net/yiya...
    VincentHK閱讀 756評(píng)論 0 1
  • 然后將混淆腳本寫入confuse.sh文件里面 !/usr/bin/env bash TABLENAME=symb...
    莼藍(lán)Oo閱讀 1,526評(píng)論 2 1