1. 程式人生 > 其它 >跟著鐵頭幹混淆2 ubuntu20.04 編譯 ollvm4.0

跟著鐵頭幹混淆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步

  1. 下載ollvm 4.0原始碼 (啥,覺得老?初學者的話 4.0跟12.0對你來說區別不大)
  2. 配置編譯工具
  3. 修改ollvm原始碼
  4. 編譯 ollvm
  5. 配置 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 下載: