跟着鐵頭干混淆3 ubuntu下用docker編譯ollvm(保證成功)
OLLVM(Obfuscator-LLVM) 是一套開源的,基於llvm的混淆工具。
國內的很多加固廠商,很多都使用了ollvm對代碼進行混淆。
想要學習 ollvm去混淆,最好搭建一個環境自己寫一些demo, 就像做滲透的自己搞個靶場去練習,也能學的更快。
大家好,我是王鐵頭 一個乙方安全公司搬磚的菜雞
持續更新移動安全,iot安全,編譯原理相關原創視頻文章
演示視頻:[https://space.bilibili.com/430241559]
在編譯 ollvm的時候,有時候會因為一些,系統版本,編譯器版本,cmake版本,或者另外的一些玄學的原因編譯失敗。
編譯成功的人都是類似的,一次性成功。
編譯失敗,各自有自己的報錯信息。
如果大佬們已經對自己編譯ollvm失去了信心,累覺不愛。
這時候還是可以掙扎下的。
可能生活辜負了你,但是既然你看到了這篇文章,我,口碑好,靠得住,說你成功你就能成功
用這種方式去編譯,基本上是可以保證編譯通過的。
不管你機器上的,gcc ,g++, cmake是啥版本,都不重要。
因為,這一次的編譯,根本就,不依賴任何你自己電腦上的編譯環境。
是用docker鏡像編譯。
驚不驚喜,意不意外?
docker方式編譯ollvm步驟
-
下載ollvm 4.0源碼 (啥,覺得老?初學者的話 4.0跟12.0對你來說區別不大)
-
安裝docker編譯環境
-
編譯 ollvm
-
配置 ndk
1.下載ollvm 4.0源碼
ollvm git地址: https://github.com/obfuscator-llvm/obfuscator
下載 ollvm 4.0代碼
git clone -b llvm-4.0 --depth=1 https://github.com/obfuscator-llvm/obfuscator.git
這里 -b llvm-4.0是選擇 llvm-4.0的分支
--depth=1 表示只下載最后一次提交的版本
這樣的話,項目文件就不會太大。畢竟github連接速度感人。
2.安裝docker編譯環境
這里安裝docker編譯環境 首先要下載docker(已經安裝過就不用了)
sudo apt install docker.io
sudo docker pull nickdiego/ollvm-build
安裝docker
安裝編譯ollvm的docker環境
3.編譯ollvm
編譯這里 本來是這樣用的
為了節省大佬們的時間, docker編譯環境的作者簡化了上面的命令
還專門寫了個腳本
驚不驚喜,意不意外
編譯腳本下載:
git clone --depth=1 https://github.com/nickdiego/docker-ollvm
使用:
sudo ./ollvm-build.sh ollvm源碼目錄
這里我自己的ollvm源碼目錄是 /home/wtt/env/ollvm/src/obfuscator/
所以我這里就應該執行
sudo ./ollvm-build.sh /home/wtt/env/ollvm/src/obfuscator/
如果你直接執行,出現了這種錯誤的話
報錯信息:
CMake Error at cmake/modules/AddLLVM.cmake:1163 (add_custom_target):
add_custom_target cannot create target "check-llvm-bindings-ocaml" because
another target with the same name already exists. The existing target is a
custom target created in source directory "/ollvm/src/test". See
documentation for policy CMP0002 for more details.
Call Stack (most recent call first):
cmake/modules/AddLLVM.cmake:1226 (add_lit_target)
test/CMakeLists.txt:150 (add_lit_testsuites)
這里我也遇到了這種錯誤,為了修正錯誤 我閱讀了 ollvm-build.sh的源碼
害,本來想着一鍵 簡單高效省心,到頭來還得自己上改腳本。
這里加了一句代碼。 在150行 加入
DOCKER_CMD+=" -DLLVM_INCLUDE_TESTS=OFF"
加入這行代碼就大功告成了
這里不用 執行make -j7 這種命令,腳本里面已經自動開始給你編譯了
而且,編譯依賴的各種環境,用的不是你本機的,那種會干啥啥不行,報錯第一名的環境。
這里,用的編譯環境是,靠得住的docker環境,大佬給安排好的環境。
4.配置 ndk
這里,上面那個腳本的作者,其實給了一個解決方案
但是我用了下,這次沒有上一次靠譜。
本來以為會把編譯好的 clang文件直接替換到ndk里面,然而並沒有。
所以,這里不推介使用這個腳本。
這里推介,大佬們自己動手,豐衣足食。
配置ndk分為以下幾步。
1.下載ndk
根據自己需要去選版本,我這里選的是 ndk-16b
ndk下載網址:https://developer.android.google.cn/ndk/downloads/
這個網址只有最新版的ndk,想下載之前的版本,可以手動點擊下面的鏈接,去找自己想要的版本
這里多說一句,如果嫌下載速度慢,除了花錢升級寬帶,還可以復制鏈接去迅雷下。
這里我已經下載並解壓到了本地
2.配置ndk環境變量
執行命令,打開配置文件
gedit ~/.bashrc
把下面這兩行粘貼到文件末尾, 注意,替換路徑成自己下載的ndk路徑
export NDK_HOME=/home/wtt/env/android/ndk/android-ndk-r16b/
export PATH=$NDK_HOME:$PATH
最后執行命令,使配置文件生效
source ~/.bashrc
3.復制編譯好的4個 clang 文件到ndk目錄
好,這里大佬們已經下載完ndk了。這一步是把之前 ollvm編譯好的文件復制到ndk目錄
這一步比較簡單, 直接復制粘貼就可。cv工程師的看家本領。
把olvm剛編譯好的 clang clang-4.0 clang++ clang-format 文件
粘貼到ndk目錄
粘貼到
你自己的ndk目錄/toolchains/llvm/prebuilt/linux-x86_64/bin
4.復制build目錄的 3個頭文件到ndk目錄
同時,為了避免后續的編譯錯誤
就像下圖,會報錯找不到頭文件
fatal error 'Stddef.h' file not found
fatal error 'Stdarg.h' file not found
fatal error '__stddef_max_align_t.h' file not found
在build目錄搜索3個文件 然后繼續發揮大佬們的cv神功。
粘貼到 上面報錯的路徑 就ok了
這個路徑是你ndk目錄下的
sources/cxx-stl/system/include/
找到剛剛的build目錄 也就是編譯好文件的輸出路徑
至此,環境部分,基本完成,
大吉大利 晚上吃雞
這個時候,大佬們可以嘗試編譯一波了
新建jni目錄 目錄下新建3個文件
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := wtt
LOCAL_SRC_FILES := test.cpp
include $(BUILD_EXECUTABLE)
Application.mk
APP_ABI := armeabi armeabi-v7a arm64-v8a
APP_PIE:= true
APP_CPPFLAGS := -frtti -std=c++11 -mllvm -fla -mllvm -bcf -mllvm -sub
test.cpp
#include <cstdio>
int main(int n_argc, char** argv)
{
int n_num = n_argc * 2;
//scanf("%2d", &n_num);
if (20 == n_num)
{
puts("20");
}
if(10 == n_num)
{
puts("10");
}
if(2 == n_num)
{
puts("2");
}
puts("error");
return -1;
}
在jni同級目錄 打開命令行 執行
ndk-build
混淆效果
未混淆前流程圖:
混淆后流程圖:
成功混淆
b站視頻演示:https://space.bilibili.com/430241559
持續更新移動安全,iot安全,編譯原理相關原創視頻文章
相關資料關注公眾號回復 ollvm 下載: