构建含有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/
文章版权归作者所有,未经允许请勿转载
如需获得支持,请点击网页右上角
序言
安装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
全开
结束语
共有 0 条评论