跟着鐵頭干混淆3 ubuntu下用docker編譯ollvm(保證成功)


跟着鐵頭干混淆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步驟

  1. 下載ollvm 4.0源碼 (啥,覺得老?初學者的話 4.0跟12.0對你來說區別不大)

  2. 安裝docker編譯環境

  3. 編譯 ollvm

  4. 配置 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 

image-20210702201853873

這里 -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

image-20210701231550404

安裝編譯ollvm的docker環境

image-20210701231650054

3.編譯ollvm

編譯這里 本來是這樣用的

image-20210702194634261

為了節省大佬們的時間, docker編譯環境的作者簡化了上面的命令

還專門寫了個腳本

驚不驚喜,意不意外

編譯腳本下載:

git clone --depth=1 https://github.com/nickdiego/docker-ollvm

image-20210702195406366

使用:

sudo ./ollvm-build.sh ollvm源碼目錄

這里我自己的ollvm源碼目錄是 /home/wtt/env/ollvm/src/obfuscator/

所以我這里就應該執行

sudo ./ollvm-build.sh /home/wtt/env/ollvm/src/obfuscator/

如果你直接執行,出現了這種錯誤的話

image-20210703182631462

報錯信息:

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"

image-20210702205936060

加入這行代碼就大功告成了

image-20210702204310084

這里不用 執行make -j7 這種命令,腳本里面已經自動開始給你編譯了

而且,編譯依賴的各種環境,用的不是你本機的,那種會干啥啥不行,報錯第一名的環境。

這里,用的編譯環境是,靠得住的docker環境,大佬給安排好的環境。

image-20210702220609025

image-20210703154654349

4.配置 ndk

這里,上面那個腳本的作者,其實給了一個解決方案

image-20210702223521101

但是我用了下,這次沒有上一次靠譜。

本來以為會把編譯好的 clang文件直接替換到ndk里面,然而並沒有。

所以,這里不推介使用這個腳本。

這里推介,大佬們自己動手,豐衣足食。

配置ndk分為以下幾步。

1.下載ndk

根據自己需要去選版本,我這里選的是 ndk-16b

ndk下載網址:https://developer.android.google.cn/ndk/downloads/

這個網址只有最新版的ndk,想下載之前的版本,可以手動點擊下面的鏈接,去找自己想要的版本

image-20210702224558206

image-20210702224252671

image-20210702224825629

​ 這里多說一句,如果嫌下載速度慢,除了花錢升級寬帶,還可以復制鏈接去迅雷下。

​ 這里我已經下載並解壓到了本地

image-20210703155204978

2.配置ndk環境變量

執行命令,打開配置文件

gedit ~/.bashrc

把下面這兩行粘貼到文件末尾, 注意,替換路徑成自己下載的ndk路徑

export NDK_HOME=/home/wtt/env/android/ndk/android-ndk-r16b/
export PATH=$NDK_HOME:$PATH

image-20210703164128962

最后執行命令,使配置文件生效

source ~/.bashrc

image-20210703164419699

3.復制編譯好的4個 clang 文件到ndk目錄

好,這里大佬們已經下載完ndk了。這一步是把之前 ollvm編譯好的文件復制到ndk目錄

這一步比較簡單, 直接復制粘貼就可。cv工程師的看家本領。

把olvm剛編譯好的 clang clang-4.0 clang++ clang-format 文件

粘貼到ndk目錄

image-20210703155705445

粘貼到

 你自己的ndk目錄/toolchains/llvm/prebuilt/linux-x86_64/bin

image-20210703160931810

image-20210703161123186

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

image-20210704145539397

在build目錄搜索3個文件 然后繼續發揮大佬們的cv神功。

粘貼到 上面報錯的路徑 就ok了

這個路徑是你ndk目錄下的

sources/cxx-stl/system/include/

找到剛剛的build目錄 也就是編譯好文件的輸出路徑

image-20210703173558875

image-20210703175049421

image-20210703175626716

至此,環境部分,基本完成,

大吉大利 晚上吃雞

這個時候,大佬們可以嘗試編譯一波了

新建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;
}

image-20210703172006830

在jni同級目錄 打開命令行 執行

ndk-build

image-20210703181547131

混淆效果

未混淆前流程圖:

image-20210629192742505

混淆后流程圖:

image-20210703182100982

成功混淆

b站視頻演示:https://space.bilibili.com/430241559
持續更新移動安全,iot安全,編譯原理相關原創視頻文章
相關資料關注公眾號回復 ollvm 下載:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM