淺談安卓開發(fā)代碼混淆技術(shù)

隨著移動(dòng)互聯(lián)網(wǎng)的快速發(fā)展,應(yīng)用的安全問題不斷涌現(xiàn)出來,于是越來越多的應(yīng)用開發(fā)者將核心代碼由java層轉(zhuǎn)到native層,以對(duì)抗成熟的java逆向分析工具,然而如果native層的代碼如果沒有進(jìn)行任何保護(hù)康栈,還是比較容易被逆向分析工作者獲取其運(yùn)行邏輯,進(jìn)而完成應(yīng)用破解或者進(jìn)行其他的操作喷橙。那么提高native代碼的安全性有什么好辦法嗎啥么?答案是肯定的,今天我們就來介紹一種有效對(duì)抗native層代碼分析的方法——代碼混淆技術(shù)贰逾。

那么悬荣,什么是代碼混淆呢?代碼混淆的學(xué)術(shù)定義如下:

代碼混淆(code obfuscation)是指將計(jì)算機(jī)程序的代碼疙剑,轉(zhuǎn)換成一種功能上等價(jià)氯迂,所謂功能上的等價(jià)是指其在變換前后功能相同或相近。其解釋如下:程序P經(jīng)過混淆變換為P‘言缤,若P沒有結(jié)束或錯(cuò)誤結(jié)束嚼蚀,那么P’也不能結(jié)束或錯(cuò)誤結(jié)束;而且P‘程序的結(jié)果應(yīng)與程序P具有相同的輸出管挟。否則P’不是P的有效的混淆轿曙。

目前對(duì)于混淆的分類,普遍是以Collberg的理論為基礎(chǔ)僻孝,分為布局混淆(layout obfuscation)导帝、數(shù)據(jù)混淆(data obfuscation)、控制混淆(control obfuscation)和預(yù)防混淆(preventive obfuscation)這四種類型穿铆。

1.布局混淆

布局混淆是指刪除或者混淆軟件源代碼或者中間代碼中與執(zhí)行無關(guān)的輔助文本信息您单,增加攻擊者閱讀和理解代碼的難度。軟件源代碼中的注釋文本荞雏、調(diào)試信息可以直接刪除虐秦,用不到的方法和類等代碼或數(shù)據(jù)結(jié)構(gòu)也可以刪除,這樣即可以使攻擊者難以理解代碼的語義凤优,也可以減小軟件體積羡疗,提高軟件裝載和執(zhí)行的效率。軟件代碼中的常量名别洪、變量名、類名和方法名等標(biāo)識(shí)符的命名規(guī)則和字面意義有利于攻擊者對(duì)代碼的理解柳刮,布局混淆通過混淆這些標(biāo)識(shí)符增加攻擊者對(duì)軟件代碼理解的難度挖垛。標(biāo)識(shí)符混淆的方法有多種痒钝,例如哈希函數(shù)命名、標(biāo)識(shí)符交換和重載歸納等痢毒。哈希函數(shù)命名是簡單地將原來標(biāo)識(shí)符的字符串替換成該字符串的哈希值送矩,這樣標(biāo)識(shí)符的字符串就與軟件代碼不相關(guān)了;標(biāo)識(shí)符交換是指先收集軟件代碼中所有的標(biāo)識(shí)符字符串哪替,然后再隨機(jī)地分配給不同的標(biāo)識(shí)符栋荸,該方法不易被攻擊者察覺;重載歸納是指利用高級(jí)編程語言命名規(guī)則中的一些特點(diǎn)凭舶,例如在不同的命名空間中變量名可以相同晌块,使軟件中不同的標(biāo)識(shí)符盡量使用相同的字符串,增加攻擊者對(duì)軟件源代碼的理解難度帅霜。布局混淆是最簡單的混淆方法匆背,它不改變軟件的代碼和執(zhí)行過程。

2.數(shù)據(jù)混淆

數(shù)據(jù)混淆是修改程序中的數(shù)據(jù)域身冀,而對(duì)代碼段不作處理钝尸。常用的數(shù)據(jù)混淆方式有合并變量、分割變量搂根、數(shù)組重組珍促、字符串加密等。

合并變量是將幾個(gè)變量合并為一個(gè)數(shù)據(jù)剩愧,原來的每個(gè)變量占據(jù)其中一個(gè)區(qū)域猪叙,類似于一個(gè)大的數(shù)據(jù)結(jié)構(gòu)。分割變量則是將一個(gè)變量分割為兩個(gè)變量隙咸,對(duì)分割前后提供一種映射關(guān)系沐悦,將對(duì)一個(gè)變量的操作轉(zhuǎn)化為對(duì)分割后兩個(gè)變量的操作。

數(shù)組重組有數(shù)組的分割五督、合并藏否、折疊和平滑等幾種方式。分割是將一個(gè)數(shù)組分成2個(gè)或多個(gè)相同維度的數(shù)組充包;合并則相反副签;折疊是增加數(shù)組的維數(shù);平滑則是相反基矮。

在ELF文件中淆储,全局變量和常量字符串存放在數(shù)據(jù)段中,反匯編工具可以輕易查找到字符串與代碼之間的引用關(guān)系家浇。在軟件破解中本砰,通過一些字符串提示可以很方便的找到代碼關(guān)鍵語句,從而破解軟件钢悲。字符串加密則可以對(duì)這些明顯的字符串進(jìn)行加密存儲(chǔ)点额,在需要時(shí)再進(jìn)行解密舔株。

3.控制混淆

控制混淆也稱流程混淆,它是改變程序的執(zhí)行流程还棱,從而打斷逆向分析人員的跟蹤思路载慈,達(dá)到保護(hù)軟件的目的。一般采用的技術(shù)有插入指令珍手、偽裝條件語句办铡、斷點(diǎn)等。偽裝條件語句是當(dāng)程序順序執(zhí)行從A到B琳要,混淆后在A和B之間加入條件判斷寡具,使A執(zhí)行完后輸出TRUE或FALSE,但不論怎么輸出焙蹭,B一定會(huì)執(zhí)行晒杈。

控制混淆采用比較多的還有模糊謂詞、內(nèi)嵌外聯(lián)孔厉、打破順序等方法拯钻。

模糊謂詞是利用消息不對(duì)稱的原理,在加入模糊謂詞時(shí)其值對(duì)混淆者是已知的撰豺,而對(duì)反混淆者卻很難推知粪般。所以加入后將干擾反匯編者對(duì)值的分析。模糊謂詞的使用一般是插入一些死的或不相關(guān)的代碼(bogus code)污桦,或者是插入在循環(huán)或分支語句中亩歹,打斷程序執(zhí)行流程。

內(nèi)嵌(in-line)是將一小段程序嵌入到被調(diào)用的每一個(gè)程序點(diǎn)凡橱,外聯(lián)(out-line)是將沒有任何邏輯聯(lián)系的一段代碼抽象成一段可被多次調(diào)用的程序小作。

打破順序是指打破程序的局部相關(guān)性。由于程序員往往傾向于把相關(guān)代碼放在一起稼钩,通過打破順序改變程序空間結(jié)構(gòu)顾稀,將加大破解者的思維跳躍。

4.預(yù)防混淆

預(yù)防混淆一般是針對(duì)專用的反編譯器設(shè)計(jì)的坝撑,目的就是預(yù)防被這類反編譯器反編譯静秆。他是利用特定的反編譯器或反混淆器的弱點(diǎn)進(jìn)行專門設(shè)計(jì)。預(yù)防混淆對(duì)于特定的反編譯器非常有效巡李,所以在使用時(shí)要綜合利用各種反編譯器的特點(diǎn)進(jìn)行設(shè)計(jì)抚笔。

市面的安全服務(wù)供應(yīng)商如騰訊御安全,所提供的保護(hù)方案提供了以上所述四種混淆分類的多維度的保護(hù)侨拦;布局混淆方面:提供了針對(duì)native代碼層中的函數(shù)名進(jìn)行了混淆刪除調(diào)試信息等功能殊橙;數(shù)據(jù)混淆方面:提供了針對(duì)常量字符串加密及全局變量的混淆的功能;控制混淆方面:針對(duì)代碼流程上,提供了扁平化蛀柴,插入bogus分支以及代碼等價(jià)變換等功能螃概;預(yù)防混淆方面:在混淆過程中加入了針對(duì)主流反編譯器的預(yù)防混淆的代碼,能夠有效地抵抗其分析鸽疾。此外還對(duì)應(yīng)用開發(fā)者提供不同等級(jí)的保護(hù)力度及多種混淆方式的功能的選擇,用戶可以根據(jù)自己的需求定制不同的混淆功能保護(hù)训貌。

安全保護(hù)方案除了提供代碼混淆保護(hù)方面的技術(shù)制肮,還提供代碼虛擬化技術(shù)及反逆向、反調(diào)試等其他應(yīng)用安全加固方案递沪,綜合使用多種代碼保護(hù)方案可以有效地提高應(yīng)用代碼安全豺鼻。

From:御安全技術(shù)博客http://blog.yaq.qq.com/detail/7

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市款慨,隨后出現(xiàn)的幾起案子儒飒,更是在濱河造成了極大的恐慌,老刑警劉巖檩奠,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桩了,死亡現(xiàn)場離奇詭異,居然都是意外死亡埠戳,警方通過查閱死者的電腦和手機(jī)井誉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來整胃,“玉大人颗圣,你說我怎么就攤上這事∑ㄊ梗” “怎么了在岂?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛮寂。 經(jīng)常有香客問我蔽午,道長,這世上最難降的妖魔是什么共郭? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任祠丝,我火速辦了婚禮,結(jié)果婚禮上除嘹,老公的妹妹穿的比我還像新娘写半。我一直安慰自己,他們只是感情好尉咕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布叠蝇。 她就那樣靜靜地躺著,像睡著了一般年缎。 火紅的嫁衣襯著肌膚如雪悔捶。 梳的紋絲不亂的頭發(fā)上铃慷,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音蜕该,去河邊找鬼犁柜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛堂淡,可吹牛的內(nèi)容都是我干的馋缅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绢淀,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼萤悴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起皆的,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤覆履,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后费薄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硝全,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年义锥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柳沙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拌倍,死狀恐怖赂鲤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柱恤,我是刑警寧澤数初,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站梗顺,受9級(jí)特大地震影響泡孩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寺谤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一仑鸥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧变屁,春花似錦眼俊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春澎灸,著一層夾襖步出監(jiān)牢的瞬間院塞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工性昭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拦止,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓巩梢,卻偏偏與公主長得像创泄,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子括蝠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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