重要的
該項目已存檔,不再維護。
一些最常見的問題在常見問題和故障排除中得到了解答。
適用於 Android 應用程式的黑盒混淆工具。
Obfuscapk是一個模組化的 Python 工具,用於在不需要原始程式碼的情況下混淆 Android 應用程序,因為apktool
用於反編譯原始 apk 檔案並在對反編譯的smali
程式碼、資源和清單應用一些混淆技術後建立新的應用程式。混淆後的應用程式保留了與原始應用程式相同的功能,但底層的差異有時使新應用程式與原始應用程式有很大不同(例如,基於簽名的防毒軟體)。
Obfuscapk 透過使用 BundleDecompiler 新增對 Android App Bundles(aab 檔案)的支援(請參閱#121)。為了使用這個新功能,請從這裡下載最新版本的 BundleDecompiler,將其作為BundleDecompiler.jar
保存在PATH
中包含的目錄中(例如,在 Ubuntu 中為/usr/local/bin
或/usr/bin
)並進行make確保它設定了可執行標誌。
重要的
BundleDecompiler 尚無法在 Windows 上執行,因此 Windows 平台上的 Obfuscapk 不支援應用程式套件混淆。此外,應用程式套件支援仍處於早期開發階段,因此,如果您遇到任何問題或想幫助我們改進,請參閱貢獻。
有關Obfuscapk的更多詳細信息,請參閱論文“Obfuscapk:適用於 Android 應用程式的開源黑盒混淆工具”。您可以按如下方式引用該論文:
@article { aonzo2020obfuscapk ,
title = " Obfuscapk: An open-source black-box obfuscation tool for Android apps " ,
journal = " SoftwareX " ,
volume = " 11 " ,
pages = " 100403 " ,
year = " 2020 " ,
issn = " 2352-7110 " ,
doi = " https://doi.org/10.1016/j.softx.2020.100403 " ,
url = " https://www.sciencedirect.com/science/article/pii/S2352711019302791 " ,
author = " Simone Aonzo and Gabriel Claudiu Georgiu and Luca Verderame and Alessio Merlo " ,
keywords = " Android, Obfuscation, Program analysis "
}
Obfucapk 被設計為模組化且易於擴展,因此它是使用插件系統建構的。因此,每個混淆器都是一個繼承自抽象基底類別的插件,並且需要實作obfuscate
方法。當工具開始處理新的 Android 應用程式檔案時,它會建立一個混淆物件來儲存所有需要的資訊(例如,反編譯的smali
程式碼的位置)和操作的內部狀態(例如,已使用的混淆器列表) 。然後,混淆物件作為obfuscate
方法的參數傳遞給所有活動插件/混淆器(按順序)進行處理和修改。活動插件的清單和順序是透過命令列選項指定的。
該工具可以輕鬆地使用新的混淆器進行擴充:只需在src/obfuscapk/obfuscators
目錄中加入實作混淆技術的原始程式碼和外掛程式元資料( <obfuscator-name>.obfuscator
檔案)即可(採用簡單的現有混淆器,例如Nop
作為起始範例)。該工具將自動檢測新插件,因此不需要進一步配置(新插件將像與該工具捆綁的所有其他插件一樣對待)。
有兩種方法可以在您自己的電腦上取得 Obfuscak 的工作副本:使用 Docker 或直接在Python 3
環境中使用原始程式碼。在這兩種情況下,首先要做的就是取得此儲存庫的本機副本,因此在要儲存專案的目錄中開啟一個終端機並複製儲存庫:
$ git clone https://github.com/ClaudiuGeorgiu/Obfuscapk.git
這是安裝 Obfuscak 的建議方法,因為唯一的要求是安裝最新版本的 Docker:
$ docker --version
Docker version 20.10.21, build baeda1f
官方 Obfuscak Docker 映像可在 Docker Hub 上取得(從此儲存庫自動建置):
$ # Download the Docker image.
$ docker pull claudiugeorgiu/obfuscapk
$ # Give it a shorter name.
$ docker tag claudiugeorgiu/obfuscapk obfuscapk
如果你從 Docker Hub 下載了官方映像,那麼你就可以使用該工具了,所以請繼續檢查使用說明,否則在之前創建的Obfuscapk/src/
目錄(包含Dockerfile
的資料夾)中執行以下命令來建立Docker鏡像:
$ # Make sure to run the command in Obfuscapk/src/ directory.
$ # It will take some time to download and install all the dependencies.
$ docker build -t obfuscapk .
當 Docker 映像準備就緒後,進行快速測試以檢查所有內容是否已正確安裝:
$ docker run --rm -it obfuscapk --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscak 現在可以使用了,請參閱使用說明以獲取更多資訊。
確保已安裝最新版本的apktool
、 apksigner
和zipalign
並可透過命令列使用:
$ apktool
Apktool v2.9.0 - a tool for reengineering Android apk files
...
$ apksigner
Usage: apksigner < command > [options]
apksigner --version
apksigner --help
...
$ zipalign
Zip alignment utility
Copyright (C) 2009 The Android Open Source Project
...
為了支援應用程式包混淆,您還需要 BundleDecompiler,因此從此處下載最新的可用版本,將其另存為BundleDecompiler.jar
到PATH
中包含的目錄中(例如,在 Ubuntu 中, /usr/local/bin
或/usr/bin
)並確保它設定了可執行標誌。
要使用 BundleDecompiler 和apktool
您還需要最新版本的 Java。 zipalign
和apksigner
包含在 Android SDK 中。可執行檔的位置也可以透過下列環境變數來指定: APKTOOL_PATH
、 BUNDLE_DECOMPILER_PATH
、 APKSIGNER_PATH
和ZIPALIGN_PATH
(例如,在 Ubuntu 中,在同一終端機中執行 Obfuscapk 之前執行export APKTOOL_PATH=/custom/location/apktool
//
除了上述工具之外,該專案的唯一要求是安裝有效的Python 3
(至少3.7
)(及其套件管理器pip
)。
在專案主目錄( Obfuscapk/
)中執行以下命令來安裝所需的依賴項:
$ # Make sure to run the commands in Obfuscapk/ directory.
$ # The usage of a virtual environment is highly recommended.
$ python3 -m venv venv
$ source venv/bin/activate
$ # Install Obfuscapk's requirements.
$ python3 -m pip install -r src/requirements.txt
安裝要求後,進行快速測試以檢查一切是否正常:
$ cd src/
$ # The following command has to be executed always from Obfuscapk/src/ directory
$ # or by adding Obfuscapk/src/ directory to PYTHONPATH environment variable.
$ python3 -m obfuscapk.cli --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscak 現在可以使用了,請參閱使用說明以獲取更多資訊。
從現在開始, Obfuscapk 將被視為可作為obfuscapk
的可執行文件,因此您需要根據安裝工具的方式來調整指令:
Docker 映像:包含要混淆的應用程式的本機目錄必須安裝到容器中的/workdir
(例如,目前目錄"${PWD}"
),因此命令:
$ obfuscapk [params...]
變成:
$ docker run --rm -it -u $( id -u ) : $( id -g ) -v " ${PWD} " : " /workdir " obfuscapk [params...]
從原始碼:每個指令都必須從Obfuscapk/src/
目錄執行(或透過將Obfuscapk/src/
目錄加入PYTHONPATH
環境變數)和指令:
$ obfuscapk [params...]
變成:
$ python3 -m obfuscapk.cli [params...]
我們先來看看幫助消息:
$ obfuscapk --help
obfuscapk [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB] [-i] [-p] [-k VT_API_KEY]
[--keystore-file KEYSTORE_FILE] [--keystore-password KEYSTORE_PASSWORD]
[--key-alias KEY_ALIAS] [--key-password KEY_PASSWORD] [--use-aapt2]
< APK_OR_BUNDLE_FILE >
有兩個強制參數: <APK_OR_BUNDLE_FILE>
,要混淆的 apk 或應用程式套件檔案的路徑(相對或絕對),以及要套用的混淆技術名稱的清單(使用-o
選項指定,可以多次使用)次,例如-o Rebuild -o NewAlignment -o NewSignature
)。其他可選參數如下:
-w DIR
用於設定保存中間檔案(由apktool
產生)的工作目錄。如果未指定,則會在與輸入應用程式相同的目錄中建立名為obfuscation_working_dir
的目錄。這對於調試目的很有用,但如果不需要,可以將其設定為臨時目錄(例如-w /tmp/
)。
-d OUT_APK_OR_AAB
用於設定目標檔案的路徑:混淆過程產生的apk檔案(例如, -d /home/user/Desktop/obfuscated.apk
或-d /home/user/Desktop/obfuscated.aab
)。如果不指定,最終的混淆檔案將保存在工作目錄中。注意:現有文件將被覆蓋,沒有任何警告。
-i
是一個標誌,用於在混淆過程中忽略已知的第三方庫,以使用更少的資源,提高效能並降低錯誤風險。要忽略的庫列表改編自 LiteRadar 項目。
-p
是在混淆操作期間顯示進度條的標誌。在批次操作/自動建置中使用工具時,停用進度條很方便,否則應啟用此標誌以查看混淆進度。
-k VT_API_KEY
僅在使用VirusTotal
混淆器時才需要,用於設定與 Virus Total 通訊時使用的 API 金鑰。
--keystore-file KEYSTORE_FILE
、 --keystore-password KEYSTORE_PASSWORD
、 --key-alias KEY_ALIAS
和--key-password KEY_PASSWORD
可用來指定自訂金鑰庫(apk 簽章所需)。如果使用--keystore-file
,則必須指定--keystore-password
和--key-alias
,而僅當所選金鑰的密碼與金鑰庫密碼不同時才需要--key-password
。預設情況下(未指定--keystore-file
時),與 Obfuscak 捆綁的金鑰庫用於簽章操作。
--ignore-packages-file IGNORE_PACKAGES_FILE
是包含要忽略的套件名稱的檔案的路徑。使用此選項時,這些包內的所有類別都不會被混淆。該檔案每行應有一個包名稱,如下例所示:
com.mycompany.dontobfuscate
com.mycompany.ignore
...
--use-aapt2
是使用apktool
重建應用程式時使用 aapt2 選項的標誌。
現在讓我們考慮一個簡單的工作範例來了解 Obfuscak 的工作原理:
$ # original.apk is a valid Android apk file.
$ obfuscapk -o RandomManifest -o Rebuild -o NewAlignment -o NewSignature original.apk
執行上述命令時,幕後發生的情況如下:
由於未指定工作目錄,因此會在與original.apk
相同的位置建立新的工作目錄( obfuscation_working_dir
)(這對於在出現錯誤時檢查smali
檔案/清單/資源很有用)
執行一些檢查以確保所有所需的文件/可執行文件均可用並可供使用
實際的混淆過程開始:指定的混淆器被逐一執行(按順序),直到沒有剩餘的混淆器或遇到錯誤
執行第一個混淆器時,使用apktool
反編譯original.apk
,並將結果儲存到工作目錄中
由於第一個混淆器是RandomManifest
,因此反編譯的 Android 清單中的條目會隨機重新排序(不會破壞xml
結構)
Rebuild
混淆器只需使用apktool
重建應用程式(現在使用修改後的清單),並且由於未指定輸出文件,因此生成的 apk 文件將保存在先前建立的工作目錄中
NewAlignment
混淆器使用zipalign
工具來對齊產生的apk文件
NewSignature
obfuscator 使用與 Obfuscapk 捆綁的金鑰庫中包含的自訂憑證對新建立的 apk 檔案進行簽署(儘管可以使用--keystore-file
參數指定不同的金鑰庫)
當所有混淆器都正確無誤地執行後,生成的混淆後的 apk 檔案可以在obfuscation_working_dir/original_obfuscated.apk
中找到,經過簽名、對齊並準備好安裝到設備/模擬器中
如前面的範例所示,始終需要Rebuild
、 NewAlignment
和NewSignature
混淆器來完成混淆操作,以建立最終的混淆 apk。它們不是真正的混淆技術,但在建置過程中需要它們,因此它們包含在混淆器清單中以保持整體架構模組化。
沒有如預期工作?請參閱常見問題和故障排除。
Obfuscapk 中所包含的混淆器可以根據其執行的操作分為不同的類別:
Trivial :顧名思義,此類別包括簡單的操作(不會對原始應用程式進行太多修改),例如使用新簽章對 apk 檔案進行簽署。
重新命名:變更所使用識別碼(類別、欄位、方法)名稱的操作。
加密:打包加密的程式碼/資源並在應用程式執行期間解密它們。當 Obfucapk 啟動時,它會自動產生一個用於加密的隨機金鑰(32 個字元長,使用 ASCII 字母和數字)。
程式碼:所有涉及修改反編譯原始碼的操作。
資源:對資源文件的操作(例如修改清單)。
其他
下面簡要介紹了目前與 Obfuscak 捆綁在一起的混淆器(按字母順序排列)。更多詳情請參閱項目原始碼。
提示
並非所有下面的混淆器都對應於真正的混淆技術(例如, Rebuild
、 NewAlignment
、 NewSignature
和VirusTotal
),但它們被實現為混淆器,以保持架構模組化並易於使用新功能進行擴展。
使用反射呼叫Android框架的危險API。為了找出某個方法是否屬於 Android 框架,Obfuscapk 參考了 Backes 等人發現的映射。
?進階反射原始碼
插入垃圾代碼。在這種情況下,垃圾程式碼由算術計算和取決於這些計算結果的分支指令組成,以永遠不會採用分支的方式精心設計。
?算術分支原始碼
加密資產文件。
?資產加密原始碼
該技術修改控制流程圖而不影響程式碼語義:它添加了呼叫原始方法的新方法。例如,對方法m1 的呼叫將被新的包裝器方法m2替代,當呼叫時,它會呼叫原始方法m1 。
?間接呼叫原始碼
更改包名稱並重新命名類別(甚至在清單檔案中)。
?類別重命名原始碼
加密程式碼中的常數字串。
? ConstStringEncryption原始碼
刪除調試資訊。
?調試刪除原始碼
重命名字段。
?字段重命名原始碼
給定一個方法,它會在第一個
goto
之後插入一條指向該方法末尾的goto
指令和另一個指向該指令的goto
;它透過新增兩個新節點來修改控制流程圖。
?轉到原始碼
加密本機庫。
? LibEncryption原始碼
它利用 Java 程式語言的重載功能,將相同的名稱分配給不同的方法,但使用不同的參數。給定一個已經存在的方法,此技術會建立一個具有相同名稱和參數的新 void 方法,但它也會添加新的隨機參數。然後,新方法的主體填入隨機算術指令。
?方法重載原始碼
重命名方法。
?方法重命名原始碼
重新調整應用程式。
?新對齊原始碼
使用新的自訂簽名重新簽署應用程式。
?新簽名原始碼
插入垃圾代碼。 Nop 是no-operation的縮寫,是一條不執行任何操作的專用指令。該技術只是在每個方法實作中插入隨機
nop
指令。
?諾普原始碼
隨機重新排序清單檔案中的項目。
?隨機清單原始碼
重建應用程式。
?重建原始碼
此技術分析現有程式碼,尋找應用程式的方法調用,忽略對 Android 框架的呼叫(請參閱
AdvancedReflection
)。如果它找到具有合適方法呼叫的指令(即,沒有建構函式方法、公共可見性、足夠的空閒暫存器等),則此類呼叫將被重定向到將使用反射 API 呼叫原始方法的自訂方法。
?反射原始碼
該技術包括更改程式碼中基本區塊的順序。當找到分支指令時,條件被反轉(例如,如果小於則分支,如果大於或等於則變為分支),並且目標基本區塊會相應地重新排序。此外,它還隨機重新排列濫用
goto
指令的程式碼。
?重新排序原始碼
加密資源中的字串(僅那些稱為內部程式碼的字串)。
? ResStringEncryption原始碼
將原始應用程式和混淆後的應用程式發送至 Virus Total。您必須提供 VT API 金鑰(請參閱
-k
選項)。
?病毒總原始碼
您可以根據 MIT 許可證自由使用此代碼。
該軟體是由位於熱那亞大學 DIBRIS 的電腦安全實驗室 (CSecLab) 出於研究目的而開發的。