关闭

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

42105人阅读 评论(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,另一种是函数属性声明

1
0
查看评论

win10 下使用 CMake 和 VS2017 配置 Assimp

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

CMake VS工程总结

1.设置输出后缀 set(CMAKE_DEBUG_POSTFIX "d") 2.设置输出目录 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_LIBRARY_OUTPUT_DIREC...
  • wang15061955806
  • wang15061955806
  • 2016-10-23 15:06
  • 1572

cmake+OPENCV3.3 VS2017 安装笔记

cmake+OPENCV3.3 VS2017 报错 could not find python ..at least 2           could not find python ..at least 3 .. 解决方法: 安装python2....
  • melone110
  • melone110
  • 2017-11-13 15:26
  • 234

VS2017——50G超豪华IDE套餐酸爽体验!

遥想当年,VS出2015的时候,那年的九日哥还没有自己的电脑。 为了知识,为了技术,九日哥给好几个同学的笔记本都装了VS2015~然后他们就都重装系统了 而如今,时光荏苒,微软已经推出了Visual Studio2017,作为一个有情怀的菜逼程序员。九日哥自然要体验一番的。 https://...
  • sm9sun
  • sm9sun
  • 2017-03-31 15:31
  • 9542

VS2017 + cmake 3.7 + opencv 3.2 编译

由于各种原因使用了VS2010不支持的功能,需要在VS2017上使用opencv,且opencv release 没有 vc15(VS2017需要的),所以需要编译opencv 固有此文 本文参考: http://blog.csdn.net/maize1111/article/details/6...
  • ivandark
  • ivandark
  • 2017-04-10 20:28
  • 5267

windows平台下基于VisualStudio的Clang安装和配置

LLVM 是一个开源的编译器架构,它已经被成功应用到多个应用领域。Clang是 LLVM 的一个编译器前端,它目前支持 C, C++, Objective-C 以及 Objective-C++ 等编程语言。Clang 对源程序进行词法分析和语义分析,并将分析结果转换为 AST ( 抽象语法树 ) ...
  • talentedlas
  • talentedlas
  • 2016-06-27 22:38
  • 5603

Visual Studio 2017使用体验

Visual Studio 2017使用体验2017年3月7日,微软发布了Visual Studio的第20个正式版本——VS2017。本人也是迫不及待,第一时间下载安装了社区版,毕竟这是宇宙第一的IDE啊,关于VS2017相对于VS2015的改进,请移步开源中国,这里重点说一说本人的作为C++开发...
  • u011507599
  • u011507599
  • 2017-03-25 21:35
  • 12424

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

目前(2017.11)OpenCV最新版本为3.3.1,提供了vc14(VS2015)的运行库,但未提供VS2017的运行库。要想在VS2017中使用,可以用CMake + VS2017重新编译源代码。 同时,OpenCV官方也只提供了Python2.7版本可以调用的库,若想在python 3.6....
  • howlclat
  • howlclat
  • 2017-12-12 21:06
  • 676

2017年6月版NDK开发入门

咳咳,虽然现在ADT有点土埋半截的意思,但是在某些特殊情况下还是要用到它,其中NDK的开发是避免不了的。 今日为了某些特殊的理由,本人要做NDK开发,AndroidStudio的NDK又有点不适用。在跌跌撞撞两天后终于搞清楚了现时在Eclipse下创建NDK项目的方法。 开发环境: Window...
  • starcat2002
  • starcat2002
  • 2017-06-13 02:41
  • 709

使用O-LLVM和NDK对Android应用进行混淆

Android开发中经常需要对敏感信息进行加密,避免不了要将密钥存放在终端设备上,那么如何防止密钥被逆向出来呢?这是一个先有鸡还是先有蛋的悖论。相比较将密钥写在Java层,将其下移到NDK层是个更好的选择,本文就来介绍如何对NDK层代码进行混淆,以更好的保护我们的密钥。 混淆是一种用来隐藏程序意图的...
  • ACE1985
  • ACE1985
  • 2015-07-31 21:09
  • 9722
    联系作者
    通过QQ与我联系(全天候7*24小时基本不在线)
    最新评论
    免责声明
    如果转载的文章侵犯了您的版权,请务必告知,我将立刻删除;
    博客所有文章允许转载,原创类不要求注明出处,随意就好;
    如果是转载的文章,建议直接转载原始来源,因为原作者极可能有更新