程式碼混淆不再愁:一篇掌握核心技巧

雪奈椰子發表於2023-11-22

1. 概述

程式碼混淆是將計算機程式的程式碼轉換成一種功能上等價,但是難以閱讀和理解的形式。

對於軟體開發者來說,程式碼混淆可以在一定程度上保護程式免被逆向。

對於逆向工程師來說,學習程式碼混淆可以幫助我們研究反混淆技術。

2. 常見混淆思路

常見的混淆思路有:符號混淆、控制流混淆、計算混淆和虛擬機器混淆。

2.1 符號混淆

指的是將函式的符號,如函式名、全域性變數名去除或者混淆。對於ELF檔案可以透過strip指令去除符號表完成。

下圖就是一個去除了符號的程式。

下圖則對函式名進行了混淆。

2.2 控制流混淆

指的是混淆程式正常的控制流,使其在功能保持不變的情況下,使其不能清晰地反映原程式的正常邏輯。

常見的有:控制流平坦化、虛假控制流、隨機控制流。

控制流平坦化指的是將正常控制流中基本塊之間的跳轉關係刪除,用一個集中的分發塊來排程基本塊的執行順序,下圖為經過控制流平坦化的控制流圖。

虛假控制流指的是,透過向正常控制流中插入若干不可達基本塊和由不透明謂詞造成的虛假跳轉以產生大量垃圾程式碼干擾攻擊者分析的混淆。

下圖為虛假控制流混淆的控制流圖,它與控制流平坦化不同,呈現出長條狀。

隨機控制流是虛假控制流的一種變體。隨機控制流透過克隆基本塊以及新增隨機跳轉(隨機跳轉到兩個功能相同的基本塊中的一個)來混淆控制流。隨即控制流的控制流圖與虛假控制流類似,都呈長條形。

2.3 計算混淆

指的是混淆程式的計算流程,或計算流程中使用的資料,使分析者難以分辨某一段程式碼所執行的具體計算。一般有指令替代、常量替代。

指令替代將正常的二元運算指令(如加、減、異或等)替換為等效而複雜的指令序列,以達到混淆計算過程的目的。經過指令替代,函式的控制流沒有發生變化,但運算過程變得難以分辨。

常量替代指將二元運算指令(如加、減、異或等)中使用的常數替換為等效而更復雜的表示式,以達到混淆計算過程或某些特殊常量的目的。例如將TEA加密使用的常量0x9e3779b 替換為 12167*16715+18858*32146-643678438。類似於指令替代,函式的控制流沒有發生變化,但是運算過程變得難以分辨。

2.4 虛擬機器混淆

指的是將一組指令集合(如一組x86指令)轉化為一組攻擊者未知的自定義指令集,並用與程式繫結的直譯器解釋執行。虛擬機器混淆代表:VMProtect。

虛擬機器混淆是目前最強力的混淆,但有效能損耗大、容易被防毒軟體報毒等缺點。

3. OLLVM支援的混淆

OLLVM是經典的程式碼混淆工具,在國內移動安全的使用非常廣泛。它提供了三種經典的程式碼混淆:

控制流平坦化

虛假控制流

指令替代

3. 混淆工具推薦

Ipa Guard是一款功能強大的ipa混淆工具,不需要ios app原始碼,直接對ipa檔案進行混淆加密。可對IOS ipa 檔案的程式碼,程式碼庫,資原始檔等進行混淆保護。 可以根據設定對函式名、變數名、類名等關鍵程式碼進行重新命名和混淆處理,降低程式碼的可讀性,增加ipa破解反編譯難度。可以對圖片,資源,配置等進行修改名稱,修改md5。只要是ipa都可以,不限制OC,Swift,Flutter,React Native,H5類app。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026554/viewspace-2996669/,如需轉載,請註明出處,否則將追究法律責任。

相關文章