构建含有ollvm功能的LLVM(clang-cl)供Microsoft Visual Studio 2022使用

序言

OLLVM是一种在编译时对代码进行混淆的好东西,具体有啥好可以看后面

因为Microsoft Visual Studio 2022目前官方支持就是clang17

因此本次的例子使用的llvm版本为17.0.6

各pass详细使用方法可以看这里

https://github.com/HikariObfuscator/Hikari/wiki/Usage

安装Microsoft Visual Studio 2022

这个有啥说的,没有的不存在的

自行构建含有OLLVM的Clang

安装cmake

https://cmake.org/download/

这里以cmake-3.29.5-windows-x86_64.msi为例

没啥好说的,一路next,不过记得

这一步要点第二个,不然它不会加path,你cmd或者是powershell就找不到cmake

克隆仓库

找个剩余空间够大的地方git clone https://github.com/GreenDamTan/llvm-project_ollvm.git -b llvmorg-17.0.6_ollvm --depth 1 --recursive

然后等它克隆完成

  • PS E:\git\GreenDamTan> git clone https://github.com/GreenDamTan/llvm-project_ollvm.git -b llvmorg-17.0.6_ollvm --depth 1 --recursive
  • Cloning into 'llvm-project_ollvm'...
  • remote: Enumerating objects: 138974, done.
  • remote: Counting objects: 100% (138974/138974), done.
  • remote: Compressing objects: 100% (107074/107074), done.
  • remote: Total 138974 (delta 31204), reused 88081 (delta 27760), pack-reused 0
  • Receiving objects: 100% (138974/138974), 200.01 MiB | 11.08 MiB/s, done.
  • Resolving deltas: 100% (31204/31204), done.
  • Updating files: 100% (132112/132112), done.

 

使用cmake进行configuration

https://clang.llvm.org/get_started.html

按照官方文档指引,在目录下创建build文件夹

随后启动x64 Native Tools Command Prompt for VS 2022  这玩意在开始菜单里面

CD到build目录,执行以下命令

cmake -DLLVM_ENABLE_PROJECTS="clang;lld;" -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF -G "Visual Studio 17 2022" -A x64 -Thost=x64 ..\llvm

这里解释一下,我们只需要clang,不需要的可以去掉,但我这里有个人需求所以保留,至于那些OFF掉的,你们有需求可以删了保持默认ON

下面的输出仅供参考,尤其是那个plug支持,建议你抄上面的作业就好了

  • **********************************************************************
  • ** Visual Studio 2022 Developer Command Prompt v17.11.0-pre.2.0
  • ** Copyright (c) 2022 Microsoft Corporation
  • **********************************************************************
  • [vcvarsall.bat] Environment initialized for: 'x64'
  • C:\Program Files\Microsoft Visual Studio\2022\Preview>cd /d E:\git\GreenDamTan\llvm-project_ollvm\build
  • E:\git\GreenDamTan\llvm-project_ollvm\build>cmake -DLLVM_ENABLE_PROJECTS="clang;lld;" -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_EXPORT_SYMBOLS_FOR_PLUGINS=ON -G "Visual Studio 17 2022" -A x64 -Thost=x64 ..\llvm
  • CMake Deprecation Warning at E:/git/GreenDamTan/llvm-project_ollvm/cmake/Modules/CMakePolicy.cmake:6 (cmake_policy):
  • The OLD behavior for policy CMP0114 will be removed from a future version
  • of CMake.
  • The cmake-policies(7) manual explains that the OLD behaviors of all
  • policies are deprecated and that a policy should be set to OLD only under
  • specific short-term circumstances. Projects should be ported to the NEW
  • behavior and not rely on setting a policy to OLD.
  • Call Stack (most recent call first):
  • CMakeLists.txt:6 (include)
  • CMake Deprecation Warning at E:/git/GreenDamTan/llvm-project_ollvm/cmake/Modules/CMakePolicy.cmake:11 (cmake_policy):
  • The OLD behavior for policy CMP0116 will be removed from a future version
  • of CMake.
  • The cmake-policies(7) manual explains that the OLD behaviors of all
  • policies are deprecated and that a policy should be set to OLD only under
  • specific short-term circumstances. Projects should be ported to the NEW
  • behavior and not rely on setting a policy to OLD.
  • Call Stack (most recent call first):
  • CMakeLists.txt:6 (include)
  • -- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.19045.
  • -- The C compiler identification is MSVC 19.41.33923.0
  • -- The CXX compiler identification is MSVC 19.41.33923.0
  • -- The ASM compiler identification is MSVC
  • -- Found assembler: C:/Program Files/Microsoft Visual Studio/2022/Preview/VC/Tools/MSVC/14.41.33923/bin/Hostx64/x64/cl.exe
  • -- Detecting C compiler ABI info
  • -- Detecting C compiler ABI info - done
  • -- Check for working C compiler: C:/Program Files/Microsoft Visual Studio/2022/Preview/VC/Tools/MSVC/14.41.33923/bin/Hostx64/x64/cl.exe - skipped
  • -- Detecting C compile features
  • -- Detecting C compile features - done
  • -- Detecting CXX compiler ABI info
  • -- Detecting CXX compiler ABI info - done
  • -- Check for working CXX compiler: C:/Program Files/Microsoft Visual Studio/2022/Preview/VC/Tools/MSVC/14.41.33923/bin/Hostx64/x64/cl.exe - skipped
  • -- Detecting CXX compile features
  • -- Detecting CXX compile features - done
  • -- bolt project is disabled
  • -- clang project is enabled
  • -- clang-tools-extra project is disabled
  • -- compiler-rt project is disabled
  • -- cross-project-tests project is disabled
  • -- libc project is disabled
  • -- libclc project is disabled
  • -- lld project is enabled
  • -- lldb project is disabled
  • -- mlir project is disabled
  • -- openmp project is disabled
  • -- polly project is disabled
  • -- pstl project is disabled
  • -- flang project is disabled
  • -- Found Python3: C:/Program Files/Python310/python.exe (found suitable version "3.10.8", minimum required is "3.0") found components: Interpreter
  • -- Looking for dlfcn.h
  • -- Looking for dlfcn.h - not found
  • -- Looking for errno.h
  • -- Looking for errno.h - found
  • -- Looking for fcntl.h
  • -- Looking for fcntl.h - found
  • -- Looking for link.h
  • -- Looking for link.h - not found
  • -- Looking for malloc/malloc.h
  • -- Looking for malloc/malloc.h - not found
  • -- Looking for signal.h
  • -- Looking for signal.h - found
  • -- Looking for sys/ioctl.h
  • -- Looking for sys/ioctl.h - not found
  • -- Looking for sys/mman.h
  • -- Looking for sys/mman.h - not found
  • -- Looking for sys/param.h
  • -- Looking for sys/param.h - not found
  • -- Looking for sys/resource.h
  • -- Looking for sys/resource.h - not found
  • -- Looking for sys/stat.h
  • -- Looking for sys/stat.h - found
  • -- Looking for sys/time.h
  • -- Looking for sys/time.h - not found
  • -- Looking for sys/types.h
  • -- Looking for sys/types.h - found
  • -- Looking for sysexits.h
  • -- Looking for sysexits.h - not found
  • -- Looking for termios.h
  • -- Looking for termios.h - not found
  • -- Looking for unistd.h
  • -- Looking for unistd.h - not found
  • -- Looking for valgrind/valgrind.h
  • -- Looking for valgrind/valgrind.h - not found
  • -- Looking for fenv.h
  • -- Looking for fenv.h - found
  • -- Looking for FE_ALL_EXCEPT
  • -- Looking for FE_ALL_EXCEPT - found
  • -- Looking for FE_INEXACT
  • -- Looking for FE_INEXACT - found
  • -- Performing Test HAVE_BUILTIN_THREAD_POINTER
  • -- Performing Test HAVE_BUILTIN_THREAD_POINTER - Failed
  • -- Looking for mach/mach.h
  • -- Looking for mach/mach.h - not found
  • -- Looking for CrashReporterClient.h
  • -- Looking for CrashReporterClient.h - not found
  • -- Looking for pfm_initialize in pfm
  • -- Looking for pfm_initialize in pfm - not found
  • -- Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)
  • -- Could NOT find LibXml2 (missing: LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR)
  • -- Looking for xar_open in xar
  • -- Looking for xar_open in xar - not found
  • -- Looking for arc4random
  • -- Looking for arc4random - not found
  • -- Looking for backtrace
  • -- Looking for backtrace - not found
  • -- Could NOT find Backtrace (missing: Backtrace_LIBRARY Backtrace_INCLUDE_DIR)
  • -- Performing Test C_SUPPORTS_WERROR_UNGUARDED_AVAILABILITY_NEW
  • -- Performing Test C_SUPPORTS_WERROR_UNGUARDED_AVAILABILITY_NEW - Failed
  • -- Looking for __register_frame
  • -- Looking for __register_frame - not found
  • -- Looking for __deregister_frame
  • -- Looking for __deregister_frame - not found
  • -- Looking for __unw_add_dynamic_fde
  • -- Looking for __unw_add_dynamic_fde - not found
  • -- Looking for _Unwind_Backtrace
  • -- Looking for _Unwind_Backtrace - not found
  • -- Looking for getpagesize
  • -- Looking for getpagesize - not found
  • -- Looking for sysconf
  • -- Looking for sysconf - not found
  • -- Looking for getrusage
  • -- Looking for getrusage - not found
  • -- Looking for setrlimit
  • -- Looking for setrlimit - not found
  • -- Looking for isatty
  • -- Looking for isatty - not found
  • -- Looking for futimens
  • -- Looking for futimens - not found
  • -- Looking for futimes
  • -- Looking for futimes - not found
  • -- Looking for sigaltstack
  • -- Looking for sigaltstack - not found
  • -- Looking for mallctl
  • -- Looking for mallctl - not found
  • -- Looking for mallinfo
  • -- Looking for mallinfo - not found
  • -- Looking for mallinfo2
  • -- Looking for mallinfo2 - not found
  • -- Looking for malloc_zone_statistics
  • -- Looking for malloc_zone_statistics - not found
  • -- Looking for getrlimit
  • -- Looking for getrlimit - not found
  • -- Looking for posix_spawn
  • -- Looking for posix_spawn - not found
  • -- Looking for pread
  • -- Looking for pread - not found
  • -- Looking for sbrk
  • -- Looking for sbrk - not found
  • -- Looking for strerror_r
  • -- Looking for strerror_r - not found
  • -- Looking for strerror_s
  • -- Looking for strerror_s - found
  • -- Looking for setenv
  • -- Looking for setenv - not found
  • -- Looking for _chsize_s
  • -- Looking for _chsize_s - found
  • -- Looking for _alloca
  • -- Looking for _alloca - not found
  • -- Looking for __alloca
  • -- Looking for __alloca - not found
  • -- Looking for __chkstk
  • -- Looking for __chkstk - found
  • -- Looking for __chkstk_ms
  • -- Looking for __chkstk_ms - not found
  • -- Looking for ___chkstk
  • -- Looking for ___chkstk - not found
  • -- Looking for ___chkstk_ms
  • -- Looking for ___chkstk_ms - not found
  • -- Looking for __ashldi3
  • -- Looking for __ashldi3 - not found
  • -- Looking for __ashrdi3
  • -- Looking for __ashrdi3 - not found
  • -- Looking for __divdi3
  • -- Looking for __divdi3 - not found
  • -- Looking for __fixdfdi
  • -- Looking for __fixdfdi - not found
  • -- Looking for __fixsfdi
  • -- Looking for __fixsfdi - not found
  • -- Looking for __floatdidf
  • -- Looking for __floatdidf - not found
  • -- Looking for __lshrdi3
  • -- Looking for __lshrdi3 - not found
  • -- Looking for __moddi3
  • -- Looking for __moddi3 - not found
  • -- Looking for __udivdi3
  • -- Looking for __udivdi3 - not found
  • -- Looking for __umoddi3
  • -- Looking for __umoddi3 - not found
  • -- Looking for __main
  • -- Looking for __main - not found
  • -- Looking for __cmpdi2
  • -- Looking for __cmpdi2 - not found
  • -- Performing Test HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC
  • -- Performing Test HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC - Failed
  • -- Performing Test HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
  • -- Performing Test HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC - Failed
  • -- Looking for __GLIBC__
  • -- Looking for __GLIBC__ - not found
  • -- Looking for proc_pid_rusage
  • -- Looking for proc_pid_rusage - not found
  • -- Performing Test LLVM_HAS_ATOMICS
  • -- Performing Test LLVM_HAS_ATOMICS - Success
  • -- Performing Test SUPPORTS_VARIADIC_MACROS_FLAG
  • -- Performing Test SUPPORTS_VARIADIC_MACROS_FLAG - Failed
  • -- Performing Test SUPPORTS_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS_FLAG
  • -- Performing Test SUPPORTS_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS_FLAG - Failed
  • -- Native target architecture is X86
  • -- Threads enabled.
  • -- Doxygen disabled.
  • -- Could NOT find OCaml (missing: OCAMLFIND OCAML_VERSION OCAML_STDLIB_PATH)
  • -- OCaml bindings disabled.
  • -- Could NOT find Python module pygments
  • -- Could NOT find Python module pygments.lexers.c_cpp
  • -- Could NOT find Python module yaml
  • -- LLVM host triple: x86_64-pc-windows-msvc
  • -- LLVM default target triple: x86_64-pc-windows-msvc
  • -- Looking for os_signpost_interval_begin
  • -- Looking for os_signpost_interval_begin - not found
  • -- Performing Test HAS_WERROR_GLOBAL_CTORS
  • -- Performing Test HAS_WERROR_GLOBAL_CTORS - Failed
  • -- Looking for _M_X64
  • -- Looking for _M_X64 - found
  • -- The ASM_MASM compiler identification is MSVC
  • -- Found assembler: C:/Program Files/Microsoft Visual Studio/2022/Preview/VC/Tools/MSVC/14.41.33923/bin/Hostx64/x64/ml64.exe
  • -- Found Git: D:/msys64/usr/bin/git.exe (found version "2.45.1")
  • -- Targeting AArch64
  • -- Targeting AMDGPU
  • -- Targeting ARM
  • -- Targeting AVR
  • -- Targeting BPF
  • -- Targeting Hexagon
  • -- Targeting Lanai
  • -- Targeting LoongArch
  • -- Targeting Mips
  • -- Targeting MSP430
  • -- Targeting NVPTX
  • -- Targeting PowerPC
  • -- Targeting RISCV
  • -- Targeting Sparc
  • -- Targeting SystemZ
  • -- Targeting VE
  • -- Targeting WebAssembly
  • -- Targeting X86
  • -- Targeting XCore
  • CMake Deprecation Warning at E:/git/GreenDamTan/llvm-project_ollvm/cmake/Modules/CMakePolicy.cmake:6 (cmake_policy):
  • The OLD behavior for policy CMP0114 will be removed from a future version
  • of CMake.
  • The cmake-policies(7) manual explains that the OLD behaviors of all
  • policies are deprecated and that a policy should be set to OLD only under
  • specific short-term circumstances. Projects should be ported to the NEW
  • behavior and not rely on setting a policy to OLD.
  • Call Stack (most recent call first):
  • E:/git/GreenDamTan/llvm-project_ollvm/clang/CMakeLists.txt:6 (include)
  • CMake Deprecation Warning at E:/git/GreenDamTan/llvm-project_ollvm/cmake/Modules/CMakePolicy.cmake:11 (cmake_policy):
  • The OLD behavior for policy CMP0116 will be removed from a future version
  • of CMake.
  • The cmake-policies(7) manual explains that the OLD behaviors of all
  • policies are deprecated and that a policy should be set to OLD only under
  • specific short-term circumstances. Projects should be ported to the NEW
  • behavior and not rely on setting a policy to OLD.
  • Call Stack (most recent call first):
  • E:/git/GreenDamTan/llvm-project_ollvm/clang/CMakeLists.txt:6 (include)
  • -- Looking for sys/resource.h
  • -- Looking for sys/resource.h - not found
  • -- Clang version: 17.0.6
  • CMake Deprecation Warning at E:/git/GreenDamTan/llvm-project_ollvm/cmake/Modules/CMakePolicy.cmake:6 (cmake_policy):
  • The OLD behavior for policy CMP0114 will be removed from a future version
  • of CMake.
  • The cmake-policies(7) manual explains that the OLD behaviors of all
  • policies are deprecated and that a policy should be set to OLD only under
  • specific short-term circumstances. Projects should be ported to the NEW
  • behavior and not rely on setting a policy to OLD.
  • Call Stack (most recent call first):
  • E:/git/GreenDamTan/llvm-project_ollvm/lld/CMakeLists.txt:6 (include)
  • CMake Deprecation Warning at E:/git/GreenDamTan/llvm-project_ollvm/cmake/Modules/CMakePolicy.cmake:11 (cmake_policy):
  • The OLD behavior for policy CMP0116 will be removed from a future version
  • of CMake.
  • The cmake-policies(7) manual explains that the OLD behaviors of all
  • policies are deprecated and that a policy should be set to OLD only under
  • specific short-term circumstances. Projects should be ported to the NEW
  • behavior and not rely on setting a policy to OLD.
  • Call Stack (most recent call first):
  • E:/git/GreenDamTan/llvm-project_ollvm/lld/CMakeLists.txt:6 (include)
  • -- LLD version: 17.0.6
  • -- BugpointPasses ignored -- Loadable modules not supported on this platform.
  • -- Configuring done (98.0s)
  • -- Generating done (6.3s)
  • -- Build files have been written to: E:/git/GreenDamTan/llvm-project_ollvm/build
展开

 

使用VS2022构建llvm

随后进入build文件夹,打开生成的LLVM.sln

直接构建clang即可,然后等待半小时

我不想自己构建行不行

https://github.com/GreenDamTan/llvm-project_ollvm/releases

直接下载构建好的,也不是不行

为VS2022添加clang支持组件

如图所示,在单个组件中勾选第一个,因为我们要防止clang被莫名其妙更新,所以不勾选第二个

替换llvm-clang为自己编译的版本

https://github.com/llvm/llvm-project/releases/tag/llvmorg-17.0.6

首先下载官方版本的llvm17,也就是LLVM-17.0.6-win64.exe

直接一路安装就完事了,然后把构建出来的几个clang开头的exe都丢进去

为自己的项目指定clang目录

https://learn.microsoft.com/zh-cn/cpp/build/clang-support-msbuild?view=msvc-170#custom_llvm_toolset

根据文档,我们新建Directory.build.props

  • <Project>
  • <PropertyGroup>
  • <LLVMInstallDir>C:\Program Files\LLVM</LLVMInstallDir>
  • <LLVMToolsVersion>17.0.6</LLVMToolsVersion>
  • </PropertyGroup>
  • </Project>

放在项目目录中,或者是其他可以访问到的地方

添加属性表,选择刚刚创建的文件

然后更换平台工具集至LLVM(clang-cl)

至此,基本工作已经完成

测试ollvm

以以下代码为例

取时间作为seed,然后生成随机数除以100取余,双数输出A,单数输出B

然后hello world

  • #include <iostream>
  • int main()
  • {
  • srand((unsigned)time(NULL));
  • int tmo = rand() % 100;
  • if (tmo %2) {
  • printf("A:%d\n", tmo);
  • }
  • else
  • {
  • printf("B:%d\n", tmo);
  • };
  • std::cout << "Hello World!\n";
  • }

测试几个看起来明显的功能

下文给出的参数,是填进这里用的

 

未启用功能时

Enable Bogus Control Flow

-mllvm -enable-bcfobf

Enable Control Flow Flattening

-mllvm -enable-cffobf

Register-Based Indirect Branching

-mllvm -enable-indibran

Function Wrapper

-mllvm -enable-funcwra

全开

-mllvm -enable-allobf

结束语

把OLLVM打开,妈妈再也不用担心别人发现我写的代码差了

 

 

 

版权声明:
作者:Intel
链接:https://foxi.buduanwang.vip/virtualization/pve/3195.html/
文章版权归作者所有,未经允许请勿转载
如需获得支持,请点击网页右上角
THE END
分享
二维码
海报
<<上一篇
下一篇>>
文章目录

序言

安装Microsoft Visual Studio 2022

自行构建含有OLLVM的Clang

安装cmake

克隆仓库

使用cmake进行configuration

使用VS2022构建llvm

我不想自己构建行不行

为VS2022添加clang支持组件

替换llvm-clang为自己编译的版本

为自己的项目指定clang目录

测试ollvm

未启用功能时

Enable Bogus Control Flow

Enable Control Flow Flattening

Register-Based Indirect Branching

Function Wrapper

全开

结束语

关闭
目 录