WINDOWS+CMAKE+VS2017编译OLLVM并整合到VS2017 NDK

46373人阅读 评论(4) 收藏 举报
分类:

        OLLVM全称Obfuscator-LLVM,即基于LLVM框架的源码级别混淆工具,相比机器指令混淆,源码级别混淆无需关心底层指令差异(由编译器生成),因而更具兼容性和拓展性,对程序流程的控制更为全面,同时也易于理论研究的展开。

        本文编译的OLLVM来自Github上的开源项目https://github.com/Qrilee/Obfuscator-LLVM,作者博文https://qtfreet.com/?p=313,该框架基于LLVM 6.0,结合 Ollvm 上海交通大学密码与计算机安全实验室维护的Armariris,支持指令替换、控制流伪造、平展以及字符串混淆等;本文编译环境Windows 10 x64 + VS2017 + CMake

        首先使用CMake生成VS的项目文件,基本没什么问题,但是需要注意的是llvmbuild需要Python 2.x,如果你只有或CMake优先选择了Python 3.x,则会导致以下错误:

ModuleNotFoundError: No module named 'llvmbuild'

        此时手动指定PYTHON_EXECUTABLE变量地址即可。另外由于CMake的VS生成器默认使用x86编译器,建议指定-Thost=x64,否则你可能会遇到以下警告:

Visual Studio generators use the x86 host compiler by default, even for64-bit targets.  This can result in linker instability and out of memoryerrors.  To use the 64-bit host compiler, pass -Thost=x64 on the CMakecommand line.

        打开生成好VS项目,生成解决方案,然后等就是了,LLVM比较庞大,把TEST、DOC、EXAMPLE之类的东西全部取消勾选,只保留ARM、AARCH64、X86等几个target,也有187个项目,需要点时间,最后生成的东西在目录build\release\下面。

        其中有两个项目LLVMObfuscation和LLVMipo会编译失败,看错误源llvm/CryptoUtils.h是大小端未指定造成的(根源是VS中并不会定义__x86_64__),看来生成的项目似乎有点问题,不过问题不大,把__x86_64__加到上述项目的预处理器定义即可。

        此外CryptoUtils.cpp的CryptoUtils::prng_seed并未提供windows版本,对此我发了patch,可以在这里https://github.com/rrrfff/Obfuscator-LLVM/blob/master/lib/Transforms/Obfuscation/CryptoUtils.cpp找到。

        到此就能成功编译出OLLVM了,跑下clang --version应该能得到以下输出:

Obfuscator-LLVM clang version 6.0.0 (trunk) (based on Obfuscator-LLVM 6.0.0)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: E:\android-ndk\r13b\toolchains\llvm\prebuilt\windows-x86_64\bin

  Registered Targets:
    aarch64    - AArch64 (little endian)
    aarch64_be - AArch64 (big endian)
    arm        - ARM
    arm64      - ARM64 (little endian)
    armeb      - ARM (big endian)
    thumb      - Thumb
    thumbeb    - Thumb (big endian)
    x86        - 32-bit X86: Pentium-Pro and above

        为了让VS2017能使用上OLLVM,我们需要拷贝到NDK目录的相应目录,然后新建一个工具链,但是其实OLLVM完全具备LLVM的全套功能,所以更简单的做法是直接替换原有的llvm。以NDK 13b为例,把目录build\release\下面的东西替换到E:\android-ndk\r13b\toolchains\llvm\prebuilt\windows-x86_64\目录下即可。

        随便打开一个Android项目,把编译工具切换到Clang,测试编译,发现找不到jni.h,和之前切换到NDK r14b的现象一致,应该是VS不支持导致的,深究发现是clang对于clang @tmp.rsp形式传入的参数,如果rsp文件中的路径被引号包括,其中的\就会被转义,导致路径出错,解决方案就是自己写一个clang替换,在里面把路径中的\替换成\\,然后传递给真正的clang即可。

        默认情况下,混淆是关闭的,行为和普通编译器一致,开启混淆有两种方式,一种是追加命令行(前缀-mllvm),如-mllvm -sub -mllvm -sub_loop=3 -mllvm -bcf -mllvm -bcf_loop=3 -mllvm -bcf_prob=40 -mllvm -fla -mllvm -split -mllvm -sobf,另一种是函数属性声明

查看评论

win10 下使用 CMake 和 VS2017 配置 Assimp

win10 下使用 CMake 和 VS2017 配置 Assimp
  • Curious_again
  • Curious_again
  • 2017-07-14 00:44:16
  • 3316

cmake+OPENCV3.3 VS2017 安装笔记

cmake+OPENCV3.3 VS2017 报错 could not find python ..at least 2           could not find python ..at le...
  • melone110
  • melone110
  • 2017-11-13 15:26:52
  • 372

使用 CMake + VS2017 ( + Python 3) 配置和编译 OpenCV 3.3

目前(2017.11)OpenCV最新版本为3.3.1,提供了vc14(VS2015)的运行库,但未提供VS2017的运行库。要想在VS2017中使用,可以用CMake + VS2017重新编译源代码...
  • howlclat
  • howlclat
  • 2017-12-12 21:06:46
  • 1373

Windows编译LLVM

使用的编译环境: Win7 64位,vs2013,LLVM3.9.1,CMake3.7.11.下载以下三个源码包:LLVM source code Clang source code co...
  • pl19920614
  • pl19920614
  • 2017-01-06 22:38:11
  • 2018

Visual Studio 2017使用体验

Visual Studio 2017使用体验2017年3月7日,微软发布了Visual Studio的第20个正式版本——VS2017。本人也是迫不及待,第一时间下载安装了社区版,毕竟这是宇宙第一的I...
  • u011507599
  • u011507599
  • 2017-03-25 21:35:28
  • 17489

LLVM、Clang介绍与Visual Studio(VS)下的使用

写在前面 编译与链接 LLVM与Clang等 Visual Studio 下使用LLVM与Clang 写在前面 因项目需要,想在VS中检测内存越界,检索到了AddressSanit...
  • firelx
  • firelx
  • 2018-04-02 16:32:57
  • 60

用Visual Studio实现一个最小的LLVM JIT程序

因项目需要,最近两天刚开始看LLVM,写了一个简单的小例子让LLVM用在VC++项目中。下面是具体步骤。 一、安装配置LLVM 下载并用VS编译安装LLVM,可以参考: http://llvm....
  • DLite
  • DLite
  • 2014-01-11 17:14:54
  • 4849

opencv3.4.0+vs2017+cmake配置 (一)

First,前期准备:到各自的网站下载软件,地址如下    opencv下载地址:https://opencv.org/releases.html    cmake下载地址:https://cmake...
  • qq_36092251
  • qq_36092251
  • 2018-03-19 12:56:43
  • 235

CMake VS工程总结

1.设置输出后缀 set(CMAKE_DEBUG_POSTFIX "d") 2.设置输出目录 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_...
  • wang15061955806
  • wang15061955806
  • 2016-10-23 15:06:27
  • 1742

VS2017 + cmake 3.7 + opencv 3.2 编译

由于各种原因使用了VS2010不支持的功能,需要在VS2017上使用opencv,且opencv release 没有 vc15(VS2017需要的),所以需要编译opencv 固有此文 本文参考...
  • ivandark
  • ivandark
  • 2017-04-10 20:28:12
  • 5916
    最新评论