依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

限时开通VIP永久会员,可免费下载所有附件
查看: 19|回复: 0

在 Windows下搭建LLVM 使用环境

[复制链接] 主动推送

1万

主题

1万

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11645
发表于 5 天前 | 显示全部楼层 |阅读模式
在 Windows下搭建LLVM 使用环境
本文目的
搭建一个windows 下应用层能够快捷使用的 llvm 工具链,文中将会解释为什么要这么做,以及阐述其他方式可能会遇到的坑点,同时这个文章只是一个实践文,并不涉及具体原理,只为了提供一个windows 下搭建llvm的最佳实践方案。
  • 为什么不用 VS2019 自带的llvm,而要很复杂的一系列编译替换来捣鼓它?
    答:不从头编译llvm项目的话,就无法编译生成Pass,你只是能用clang去编译生成exe,比起VS2019 自带的cl并没有明显优势。作为一个小白,我并不清楚为什么微软回出一个支持llvm工具编译的原因(也许是对于大型c++项目的编译速度考虑?),但对于我们来说,Pass相当于一个插件,起到中间层实际执行混淆的作用,是我们混淆功能的核心,所以必须要用它,而用它,你就需要对llvm进行从头到尾的编译。
  • 为什么一定要用12.0.0版本的llvm?而且llvm 官方文档中支持VS2019直接进行工具链的编译,为什么不用 VS2019 进行项目编译,而要使用mingw来编译llvm项目?
    经过对12.0.1 / 12.0.0 / 15.0.6 几个版本的实践,会遇到各种问题,其中最主要的问题是,如果不使用12.0.0 ,你编译出来的llvm 集成到VS 2019中使用时,会出现各种意想不到的错误。另外用MSVC(VS 2019) 编译llvm时,不支持开启BUILD_SHARED_LIBS 选项,但可以使用LLVM_EXPORT_SYMBOLS_FOR_PLUGINS 选项或LLVM_ENABLE_PLUGINS选项,但这样会出现一个问题,编译后的pass仅能使用new Pass语法,而且必须使用opt 进行加载插件使用,实际只有registerPipelineParsingCallback回调函数可以正常使用
  • 既然我们需要的只是Pass,也就是一个dll文件,那么我们是否能生成12.0.0 版本的llvm pass,然后就直接用VS 2019 自带的llvm来编译集成呢?
    不是自己编译出来的llvm pass 和 自己编译出来的 llvm clang-cl 在使用时会报0x7E(无法加载模块)的错误,因为不想在windows下试图调试llvm 源码找出报错原因,所以只能将就了。

环境搭建
基础环境
windows 10
https://github.com/llvm/llvm-project/releases/tag/llvmorg-12.0.0
CMake (https://cmake.org/download/)
VS 2019 16.11.10
MSYS2
Python
Git
安装步骤
  • 安装cmake,https://cmake.org/download/ ,下载对应windows安装包安装即可
    PS: 安装时选择添加环境变量给所有用户使用

    在 Windows下搭建LLVM 使用环境

    在 Windows下搭建LLVM 使用环境
  • 安装MSYS2
    PS:llvm 是支持 VS 2019直接去生成llvm的,不用安装这些东西,官方有相关文章(https://llvm.org/docs/GettingStartedVS.html),编译很快,但编出来不会写相关Pass并利用,这里用gcc + vs2019 构造工具链,欢迎踩完坑后分享~
    官网:https://www.msys2.org/
    详细安装步骤:https://bbs.kanxue.com/thread-272346.htm#msg_header_h3_1
    安装后安装gcc工具链
    1
    pacman -S --needed base-devel mingw-w64-x86_64-toolchain mingw-w64-i686-toolchain cmake

  • 在VS 2019 中安装clang cmake 等工具

    在 Windows下搭建LLVM 使用环境

    在 Windows下搭建LLVM 使用环境
  • 下载llvm 12.0.0源码,只需要下载clang和llvm文件夹即可,其他的编译pass用不到
    https://github.com/llvm/llvm-project/releases/tag/llvmorg-12.0.0

    在 Windows下搭建LLVM 使用环境

    在 Windows下搭建LLVM 使用环境
  • 将源码解压,文件树如下:
    PS:其中build* 文件夹是我运行bat文件后产生的目录,lld 可以不用下载,是之前踩坑的产物

    在 Windows下搭建LLVM 使用环境

    在 Windows下搭建LLVM 使用环境
  • 编译源码:
    x64_gcc_build.bat 文件内容
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cd C:UsersadminDocumentsllvmProject12
    set PATH=%PATH%;C:msys64mingw64in
    gcc --version
    cmake -G "MinGW Makefiles" -S ./llvm -B ./build_dyn_x64  ^
    -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;" ^
    -DLLVM_TARGETS_TO_BUILD="X86" -DBUILD_SHARED_LIBS=ON ^
    -DLLVM_INCLUDE_TESTS=OFF -DLLVM_BUILD_TESTS=OFF ^
    -DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_BUILD_BENCHMARKS=OFF -DLLVM_ENABLE_DUMP=ON
    cmake --build ./build_dyn_x64 -j 4
    cmake -DCMAKE_INSTALL_PREFIX="Crogram FilesLLVMllvm12llvm12_dyn_x64" -P .uild_dyn_x64cmake_install.cmake

    x86_gcc_build.bat 文件内容
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cd C:UsersadminDocumentsllvmProject12
    set PATH=%PATH%;C:msys64mingw32in
    gcc --version
    cmake -G "MinGW Makefiles" -S ./llvm -B ./build_dyn_x32  ^
    -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;" ^
    -DLLVM_TARGETS_TO_BUILD="X86" -DBUILD_SHARED_LIBS=ON ^
    -DLLVM_INCLUDE_TESTS=OFF -DLLVM_BUILD_TESTS=OFF ^
    -DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_BUILD_BENCHMARKS=OFF -DLLVM_ENABLE_DUMP=ON
    cmake --build ./build_dyn_x32 -j 4
    cmake -DCMAKE_INSTALL_PREFIX="Crogram FilesLLVMllvm12llvm12_dyn_x32" -P .uild_dyn_x32cmake_install.cmake

    运行 bat 文件即可编译对应的 llvm

    在 Windows下搭建LLVM 使用环境

    在 Windows下搭建LLVM 使用环境
  • 编译安装完成之后可以在下面两个目录中找到编译好的clang 文件
    1
    2
    Crogram FilesLLVMllvm12llvm12_dyn_x64
    Crogram FilesLLVMllvm12llvm12_dyn_x32


    在 Windows下搭建LLVM 使用环境

    在 Windows下搭建LLVM 使用环境
  • 安装后,我们已经可以用clang 编译hello world的cpp文件,但是编译正常的项目文件时,我们需要去解决动态链接库缺失和静态库的问题。
    缺失的动态库可以去C:msys64mingw64in去寻找,并且复制到Crogram FilesLLVMllvm12llvm12_dyn_x64in 中
    1
    2
    3
    4
    libstdc++-6.dll
    libgcc_s_seh-1.dll
    libwinpthread-1.dll
    zlib1.dll

    缺失的动态库可以去C:msys64mingw32in去寻找,并且复制到Crogram FilesLLVMllvm12llvm12_dyn_x32in 中
    1
    2
    3
    4
    libstdc++-6.dll
    libgcc_s_dw2-1.dll (这个库名称不一样)
    libwinpthread-1.dll
    zlib1.dll

    静态库则可以去对应的C:UsersadminDocumentsllvmProject12uild_dyn_x32lib 或者C:UsersadminDocumentsllvmProject12uild_dyn_x64lib中,将所有a文件添加到对应目录下。
测试使用
  • 搭建测试的Pass文件和 测试程序源码,测试的文件树如下:
    Transforms 文件夹里存放pass文件,TestProgram是项目源码文件夹

    在 Windows下搭建LLVM 使用环境

    在 Windows下搭建LLVM 使用环境
  • 其中 CMakeLists.txt 文件内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
project(mydemo)
cmake_minimum_required(VERSION 3.10)

if(NOT DEFINED ENV{LLVM_HOME})
    # User must define the LLVM_HOME environment that point to the root installation dir of llvm
    message(FATAL_ERROR "Environment variable $LLVM_HOME is not defined, user should define it before running cmake!")
endif()

message(STATUS "LLVM_HOME = [$ENV{LLVM_HOME}]")

if(NOT DEFINED ENV{LLVM_DIR})
    # Default llvm config file path
    set(ENV{LLVM_DIR} $ENV{LLVM_HOME}/lib/cmake/llvm)
endif()

# Check the path
if (NOT EXISTS $ENV{LLVM_DIR})
    message(STATUS "ath ($ENV{LLVM_DIR}) not found!")

    # If default llvm config path not found, try this one,
    # which is config with [-DLLVM_LIBDIR_SUFFIX=64] before building llvm
    set(ENV{LLVM_DIR} $ENV{LLVM_HOME}/lib64/cmake/llvm)
    if (NOT EXISTS $ENV{LLVM_DIR})
        message(FATAL_ERROR "ath ($ENV{LLVM_DIR}) not found!")
    else()
        message(STATUS "ath ($ENV{LLVM_DIR}) found!")
    endif()
else()
    message(STATUS "ath ($ENV{LLVM_DIR}) found!")
endif()

# Enable verbose output for debug,
# Same as: cmake -D CMAKE_VERBOSE_MAKEFILE=ON or make VERBOSE=1
# set(CMAKE_VERBOSE_MAKEFILE on)

find_package(LLVM REQUIRED CONFIG)
add_definitions(${LLVM_DEFINITIONS})
include_directories(${LLVM_INCLUDE_DIRS})
link_directories(${LLVM_LIBRARY_DIRS})

# Debug
message(STATUS "LLVM_DEFINITIONS  : ${LLVM_DEFINITIONS}")
message(STATUS "LLVM_INCLUDE_DIRS : ${LLVM_INCLUDE_DIRS}")
message(STATUS "LLVM_LIBRARY_DIRS : ${LLVM_LIBRARY_DIRS}")

add_library(mydemo SHARED
    # Add your source file here, header file is not neccessary
    ./src/mydemo.cpp
)

# Use C++11 to compile your pass (i.e., supply -std=c++11).
target_compile_features(mydemo PRIVATE cxx_range_for cxx_auto_type)

include_directories(./include)

# LLVM is (typically) built with no C++ RTTI. We need to match that;
# otherwise, we'll get linker errors about missing RTTI data.
set_target_properties(mydemo PROPERTIES COMPILE_FLAGS "-fno-rtti")

# Get proper shared-library behavior (where symbols are not necessarily
# resolved when the shared library is linked) on OS X.
if(APPLE)
    set_target_properties(mydemo PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
endif(APPLE)

target_link_libraries(mydemo

    libLLVMCore.dll.a
    libLLVMSupport.dll.a
    libLLVMipo.dll.a

    libLLVMDemangle.dll.a
    libLLVMTransformUtils.dll.a
    libLLVMAnalysis.dll.a
    libpthread.a
)

3 . bat文件的内容如下(x86 就是将前面的环境设置为x86的即可):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
cd C:UsersadminDocumentsllvmProjectollvm++
:: Set MSYS2 env
set PATH=%PATH%;C:msys64mingw64in

:: Set LLVM_HOME
set LLVM_HOME=%PROGRAMFILES%/LLVM/llvm12/llvm12_dyn_x64
set CC=%LLVM_HOME%/bin/clang.exe
set CXX=%LLVM_HOME%/bin/clang++.exe
set OPT=%LLVM_HOME%/bin/opt.exe
set LLC=%LLVM_HOME%/bin/llc.exe

rd /Q /S .Build

:: Build release version
cmake -S ./Transforms -B ./Build -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=ON  -G "MinGW Makefiles"

:: Build debug version
:: cmake -S ./Transforms -B ./Build -DCMAKE_BUILD_TYPE=Debug -DLLVM_ENABLE_ASSERTIONS=ON

:: Build  project
cmake --build ./Build -j 4

copy .Buildlibmypass.dll .Binlibmypassx64.dll

"%CC%" -Xclang -load -Xclang .Binlibmypassx64.dll .TestProgramTestProgram.cpp -o .TestProgramBinTestProgram.exe

:: /D LLVM  -mrdrnd -Xclang -load -Xclang "C:\Users\admin\Desktop\Work\ollvm++\Build\libmypass.dll"
.TestProgramBinTestProgram.exe flag{s1mpl3_11vm_d3m0}

4 . TestProgram.cpp的内容,是一道简单的re逆向题:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include
#include

char input[100] = {0};
char enc[100] = "†Š}‡“‹M€Š
CII†qbSi(";

void encrypt(unsigned char *dest, char *src){
    int len = strlen(src);
    for(int i = 0;i < len;i ++){
         dest = (src + (32 - i)) ^ i;
    }
}

//flag{s1mpl3_11vm_d3m0}
int main(int _argc, char *_argv[]){
    //scanf("%s", input);
    if(_argc <= 1){
        return 0;
    }
    strcpy(input,_argv[1]);
    printf("lease input your flag: %s",input);
    unsigned char dest[100] = {0};
    encrypt(dest, input);
    bool result = strlen(input) == 22 && !memcmp(dest, enc, 22);
    if(result){
         printf("Congratulations~");
    }else{
         printf("Sorry try again.");
    }
}

5 . 配置好之后,直接运行bat文件就能编译测试:

在 Windows下搭建LLVM 使用环境

在 Windows下搭建LLVM 使用环境
集成到Visual Studio 中
  • 我使用的是vs 2019,在之前下载了llvm 12.0 ,并且我们编译替换成自己的,做好准备工作之后,只需要在命令行选项中加入调用语句即可。
    1
    -Xclang -load -Xclang "C:\Users\admin\Desktop\Work\ollvm++\Build\libmypass.dll"

    在 Windows下搭建LLVM 使用环境

    在 Windows下搭建LLVM 使用环境
  • 使用前还需要将平台工具集先改了

    在 Windows下搭建LLVM 使用环境

    在 Windows下搭建LLVM 使用环境

参考文章
  • https://bbs.kanxue.com/thread-272346.htm#msg_header_h3_1
    PS:非常感谢作者,我的VS2019版本比他较高,又想用llvm 12.0,所以在使用他的工具链集成的时候不成功,但仍然给了我很大帮助。
  • 看雪的llvm课程

相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2024-10-28 14:29

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表