跟著鐵頭幹混淆2 ubuntu20.04 編譯 ollvm4.0
跟著鐵頭幹混淆2 ubuntu20.04編譯ollvm
寫這篇文章之前,我安裝了一波ollvm環境,中間遇到了很多坑爹問題。然後幾乎看完了網上所有的相關
文章。
還把ollvm git上面的幾乎所有編譯報錯的反饋都看了。
終於解決了遇到的所有問題,然後有了這篇文章。
大家好,我是王鐵頭 一個乙方安全公司搬磚的菜雞
持續更新移動安全,iot安全,編譯原理相關原創視訊文章
演示視訊:[https://space.bilibili.com/430241559]
初始環境:
ubuntu20.04
gcc 9.3.0
g++ 9.3.0
cmake 3.16.3
docker方式編譯ollvm分為4步
- 下載ollvm 4.0原始碼 (啥,覺得老?初學者的話 4.0跟12.0對你來說區別不大)
- 配置編譯工具
- 修改ollvm原始碼
- 編譯 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.配置編譯工具
編譯ollvm要用到的工具是
cmake
gcc
g++
1) 安裝cmake
這裡 cmake 直接安裝最新版就可以了
sudo apt-get install cmake -y
2) 安裝 gcc-8 g++-8 降低版本
這裡大佬們的環境 gcc 和 g++的版本如果就是 8.x.x
這裡就可以直接下一步了
這裡有坑的是 gcc g++
這裡大佬們的環境 如果 gcc g++的版本是8.x.x 可以直接忽略這一步,看下一步了
鐵頭實測, gcc-9 g++-9 編譯一定會失敗。
會有這樣的報錯資訊:
make: *** [Makefile:152:all] Error 2
所以,這裡安裝編譯工具的時候,要安裝gcc-8 g++-8
sudo apt-get install gcc-8 g++-8 -y
安裝完之後,配置一下優先順序,好讓我們呼叫gcc g++的時候,預設呼叫的是 gcc8 g++8
下面的命令可以配置軟體的優先順序,可以根據需要去選擇預設的版本
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 9
3) gcc切換版本 預設gcc 8
sudo update-alternatives --config gcc
4) g++切換版本 預設g++ 8
sudo update-alternatives --config g++
成功切換版本
3.修改ollvm原始碼
不修改的話,會有這樣的報錯資訊
bfuscator/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h:696:26: error: could not convert ‘((llvm::orc::remote::OrcRemoteTargetClient*)this)->callBllvm::orc::remote::OrcRemoteTargetRPCAPI::ReadMem(Src, Size)’ from ‘Expected<vector<unsigned char,allocator>>’ to ‘Expected<vector<char,allocator>>’ return callB(Src, Size);
進入 你的ollvm目錄/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h
定位到第690行 把char 改成 uint_8
4.編譯 ollvm
好的 ,到這裡前期環境就配置好了 可以直接編譯了
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ../obfuscator/
make -j7
編譯快慢看配置 2-3個小時正常的
編譯到後面,即使沒有到 100%全部成功, 只要4個關鍵檔案clang clang++ clang-4.0 clang-format 是在的
照樣進行混淆 不用慌,小場面
5.配置 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個檔案
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目錄 也就是編譯好檔案的輸出路徑
搜尋stdarg stddef
至此,環境部分,基本完成,
大吉大利 晚上吃雞
這個時候,大佬們可以嘗試編譯一波了
新建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 下載: