跟着铁头干混淆3 ubuntu2004编译ollvm4.0 解决所有报错

OLLVM(Obfuscator-LLVM) 是一套开源的,基于llvm的混淆工具。

国内的很多加固厂商,很多都使用了ollvm对代码进行混淆。

想要学习 ollvm去混淆,最好搭建一个环境自己写一些demo, 就像做渗透的自己搞个靶场去练习,也能学的更快。

演示视频: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 
ollvm源码

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

ubuntu下载docker

安装编译ollvm的docker环境

ubuntu ollvm混淆搭建docker环境

3.编译ollvm

编译这里 本来是这样用的

编译ollvm的docker环境

为了节省大佬们的时间, docker编译环境的作者简化了上面的命令

还专门写了个脚本

惊不惊喜,意不意外

编译脚本下载:

git clone --depth=1 https://github.com/nickdiego/docker-ollvm
ollvm编译脚本

使用:

sudo ./ollvm-build.sh ollvm源码目录

这里我自己的ollvm源码目录是 /home/wtt/env/ollvm/src/obfuscator/

所以我这里就应该执行

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

如果你直接执行,出现了这种错误的话

ollvm 编译错误

报错信息:

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"
/ollvm/src/test 报错解决

加入这行代码就大功告成了

编译ollvm

这里不用 执行make -j7 这种命令,脚本里面已经自动开始给你编译了

而且,编译依赖的各种环境,用的不是你本机的,那种会干啥啥不行,报错第一名的环境。

这里,用的编译环境是,靠得住的docker环境,大佬给安排好的环境。

ollvm用docker编译
ollvm编译好的

4.配置 ndk

这里,上面那个脚本的作者,其实给了一个解决方案

[图片上传失败...(image-e5f624-1625579578177)]

但是我用了下,这次没有上一次靠谱。

本来以为会把编译好的 clang文件直接替换到ndk里面,然而并没有。

所以,这里不推介使用这个脚本。

这里推介,大佬们自己动手,丰衣足食。

配置ndk分为以下几步。

1.下载ndk

根据自己需要去选版本,我这里选的是 ndk-16b

ndk下载网址:https://developer.android.google.cn/ndk/downloads/

这个网址只有最新版的ndk,想下载之前的版本,可以手动点击下面的链接,去找自己想要的版本

[图片上传失败...(image-69ba86-1625579578177)]

安卓ndk旧版本下载
ubuntu ndk16b

这里多说一句,如果嫌下载速度慢,除了花钱升级宽带,还可以复制链接去迅雷下。
这里我已经下载并解压到了本地

ndk16b ollvm

2.配置ndk环境变量

执行命令,打开配置文件

gedit ~/.bashrc

把下面这两行粘贴到文件末尾, 注意,替换路径成自己下载的ndk路径

export NDK_HOME=/home/wtt/env/android/ndk/android-ndk-r16b/export PATH=$NDK_HOME:$PATH
ollvm搭建ndk环境变量

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

source ~/.bashrc
ollvm教程

3.复制编译好的4个 clang 文件到ndk目录

好,这里大佬们已经下载完ndk了。这一步是把之前 ollvm编译好的文件复制到ndk目录

这一步比较简单, 直接复制粘贴就可。cv工程师的看家本领。

把olvm刚编译好的 clang clang-4.0 clang++ clang-format 文件

粘贴到ndk目录

ollvm编译好的clang clang++

粘贴到

 你自己的ndk目录/toolchains/llvm/prebuilt/linux-x86_64/bin
android ndk16b ollvm
ollvm编译好的clang配置ndk

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
ollvm编译so 报错

在build目录搜索3个文件 然后继续发挥大佬们的cv神功。

粘贴到 上面报错的路径 就ok了

这个路径是你ndk目录下的

sources/cxx-stl/system/include/

找到刚刚的build目录 也就是编译好文件的输出路径

ollvm build路径
ollvm stddef stddef_max_align
ollvm报错头文件 stddef stdarg

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

大吉大利 晚上吃鸡

这个时候,大佬们可以尝试编译一波了

新建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;
}
ollvm代码混淆

在jni同级目录 打开命令行 执行

ndk-build
ollvm混淆elf文件

混淆效果

未混淆前流程图:

ollvm混淆前的流程图

混淆后流程图:

ollvm混淆后的流程图

成功混淆

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容