編譯OLLVM
git clone https://github.com/heroims/obfuscator.git -b llvm-9.0.1 --depth 1
cd obfuscator
cmake -S ./llvm -B build -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi"
cmake --build build
編譯好後從build/bin/
目錄把下面幾個文件拷貝到/toolchains/llvm/prebuilt/linux-x86_64/bin/
clang
,clang++
,clang-9.0
,clang-format
把以下幾個文件從build/include/
拷貝到/sysroot/usr/include/
Stdarg.h
,Stddef.h
,__stddef_max_align_t.h
,float.h
,stdbool.h
命令和編譯選項簡介
-
fla:控制流扁平化;該選項使用函數級別的混淆來隱藏程序的結構。這通過隨機重命名函數、添加不必要的控制流和刪除調用的函數來實現。
這個模式主要是把一些if-else語句,嵌套成do-while語句,增加了反編譯和分析代碼的難度。-mllvm -fla
:激活控制流扁平化 -
split:該選項使用控制流混淆來增加程序的複雜性。這通過將函數分成幾個基本塊、添加隨機的跳轉指令和在運行時隨機重組這些基本塊來實現。這使得代碼的流程更難以跟蹤,從而增加了破解和反編譯的難度。
-mllvm -split
:激活基本塊分割。在一起使用時改善展平。
-mllvm -split_num=3
:如果激活了傳遞,則在每個基本塊上應用3次。默認值:1 -
sub:指令替換;該選項使用字符串混淆來隱藏代碼中的常量字符串。這通過將字符串分成幾個小塊、將其存儲在數組中並在運行時重新組合來實現。
這個模式主要用功能上等效但更復雜的指令序列替換標準二元運算符(+ , – , & , | 和 ^),使得分析代碼和查找敏感信息更加困難。-mllvm -sub
:激活指令替換
-mllvm -sub_loop=3
:如果激活了傳遞,則在函數上應用3次。默認值:1 -
bcf:虛假控制流程;該選項使用基本塊級別的混淆來隱藏代碼的結構。這通過改變基本塊之間的控制流、添加不必要的基本塊和移除基本塊之間的條件分支來實現。這個模式主要嵌套幾層判斷邏輯,一個簡單的運算都會在外面包幾層if-else,所以這個模式加上編譯速度會慢很多因爲要做幾層假的邏輯包裹真正有用的代碼。
另外說一下這個模式編譯的時候要浪費相當長時間包哪幾層不是鬧得!
-mllvm -bcf
:激活虛假控制流程
-mllvm -bcf_loop=3
:如果激活了傳遞,則在函數上應用3次。默認值:1
-mllvm -bcf_prob=40
:如果激活了傳遞,基本塊將以40%的概率進行模糊處理。默認值:30 -
sobf:源代碼混淆;該選項使用源代碼混淆技術來隱藏代碼的邏輯和結構。這通過使用類似加密的方式對代碼進行變換,使其難以理解和分析。這可以通過運行時解密來執行,從而隱藏代碼的真實功能。
變量名混淆:將變量名更改爲隨機字符串,使其難以理解。
控制流混淆:改變代碼的控制流程,增加條件分支和跳轉,使代碼更難以分析。
字符串加密:將字符串加密,以防止明文字符串在二進制文件中可見。
函數名混淆:將函數名更改爲隨機名稱,增加代碼的複雜性。-mllvm -sobf
:激活源代碼混淆
-mllvm -aesSeed=0xada46ab5da824b96a18409c49dc91dc3
:用於爲 AES 加密提供一個種子值,從而生成隨機數以增加混淆的難度。這有助於保護軟件免受逆向工程的攻擊,因爲它會使得分析混淆後的代碼更加困難。
單個函數混淆:
__attribute((__annotate__("bcf")))
__attribute((__annotate__("fla")))
__attribute((__annotate__("sub")))
__attribute((__annotate__("split")))
__attribute((__annotate__("sobf")))