简介
用于记录 LLVM 和 OLLVM的安装使用
参考自:https://blog.his.cat/a/vs_obfuscation.cat
一个踩坑人的自白
如果能用linux编译就用linux编译! VS的坑太多,
只要OLLVM 编译出来的 exe和lib能在Windows下边跑, 就行了, 无所谓什么编译器的.
LLVM - 一个编译框架
说明
一开始我以为需要单独编译LLVM, 然后用LLVM去整OLLVM.
所以一开始看的都是LLVM相关编译的资料, 最后发现, OLLVM是基于LLVM的修改, 然后OLLVM已经里边自带了LLVM.
因为我目前的目标: 不是学习OLLVM, 而是先使用上OLLVM的功能
所以以下仅针对OLLVM进行记录
OLLVM 编译
库 (基于Ollvm5.0)
基于库: https://github.com/qtfreet00/llvm-obfuscator
缓存: https://github.com/cryzlasm/llvm-obfuscator
工作环境
此工作环境为: 仅安装VS2015的虚拟机环境
CMake下载列表: https://cmake.org/files/v3.9/
CMake | 3.9.0-rc4_X64 | https://cmake.org/files/v3.9/cmake-3.9.0-rc4-win64-x64.msi |
---|---|---|
VS | VS2015_Update3 | 自行安装VS2015 |
Python | 2.7.15.amd64 | 官网自行下载Python2 |
编译 - CMake命令
cmake -DCMAKE_BUILD_TYPE=Release -Thost=x64 -G"Visual Studio 14 2015 Win64" C:/ollvm/
cmake -DCMAKE_BUILD_TYPE=Release -Thost=x64 -G"Visual Studio 15 2017 Win64" C:/ollvm/
-D | CMAKE_BUILD_TYPE | 生成 Release |
---|---|---|
-T | host | 针对目标工作平台 |
-G | 生成针对某个IDE的工程 |
关于编译中无限暂停的情况
编译过程中, 会出现停止的状况, 此时 CPU
无占用, cmake
不输出, 工作一度进入假死状态.
最后发现是因为启动了一个进程 cvtres.exe
结束此进程, 可重启工作流程.
直至编译结束, 暂未发现生成的工程会出现不可预知的错误.
临时替换
在编译过程中 依然会出现编译卡住的情况, 还是 cvtres.exe
卡住,
使用 VC\BIN
目录下的程序替换到运行时工作目录 VC\BIN\Amd64
下
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\cvtres.exe
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\cvtres.exe
VS工程编译
编译时, 会出现 "Unknown endianness of the compilation platform, check this header aes_encrypt.h"
提示缺少 aes.h
出现此提示时, 在 LLVMipo
和 LLVMObfuscation
工程中定义一个宏 ENDIAN_LITTLE
.
如果提示缺少 CryptoUtils.cpp
或 CryptoUtils.h
则参考此文章, 在GIT中获得 https://blog.csdn.net/rrrfff/article/details/78105905
集成VS编译环境
自行修改了 VS2015
我个人的目录:
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Platforms
toolset.props:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(VCTargetsPath)\Platforms\$(Platform)\PlatformToolsets\v140\Microsoft.Cpp.$(Platform).v140.props" Condition="Exists('$(VCTargetsPath)\Platforms\$(Platform)\PlatformToolsets\v140\Microsoft.Cpp.$(Platform).v140.props')"/>
<Import Project="$(VCTargetsPath)\Platforms\$(Platform)\PlatformToolsets\v140\Toolset.props" Condition="Exists('$(VCTargetsPath)\Platforms\$(Platform)\PlatformToolsets\v140\Toolset.props')"/>
<PropertyGroup>
<LLVMInstallDir>$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\LLVM\LLVM)</LLVMInstallDir>
<LLVMInstallDir Condition="'$(LLVMInstallDir)' == ''">$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\LLVM\LLVM)</LLVMInstallDir>
<LLVMInstallDir Condition="'$(LLVMInstallDir)' == ''">C:\ollvm</LLVMInstallDir>
<ExecutablePath>$(LLVMInstallDir)\msbuild-bin;$(ExecutablePath)</ExecutablePath>
<LibraryPath>$(LLVMInstallDir)\lib;$(LibraryPath)</LibraryPath>
<IncludePath>$(LLVMInstallDir)\include;$(IncludePath)</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<!-- Set the value of _MSC_VER to claim for compatibility -->
<ObfsOptions>-mllvm -bcf -mllvm -bcf_loop=4 -mllvm -bcf_prob=100 -mllvm -sub -mllvm -sub_loop=2</ObfsOptions>
<AdditionalOptions>-m32 -fmsc-version=1900 %(ObfsOptions)</AdditionalOptions>
</ClCompile>
</ItemDefinitionGroup>
</Project>
主要需要替换 <LLVMInstallDir Condition="'$(LLVMInstallDir)' == ''">C:\ollvm</LLVMInstallDir>
此行数据, 用于查找 LLVM
的编译器
附录
如何确定 VS
编译器版本
_MSC_VER
是 MSVC
编译器的内置宏,定义了编译器的版本,_MSC_VER
值对应版本关系
MSVC++ 11.0 _MSC_VER = 1700 (Visual Studio 2012)
MSVC++ 10.0 _MSC_VER = 1600 (Visual Studio 2010)
MSVC++ 9.0 _MSC_VER = 1500 (Visual Studio 2008)
MSVC++ 8.0 _MSC_VER = 1400 (Visual Studio 2005)
MSVC++ 7.1 _MSC_VER = 1310 (Visual Studio 2003)
MSVC++ 7.0 _MSC_VER = 1300 (Visual Studio 2002)
MSVC++ 6.0 _MSC_VER = 1200
MSVC++ 5.0 _MSC_VER = 1100
example:
#if (_MSC_VER == 1300) //vc7
#import "acax16ENU.tlb" no_implementation raw_interfaces_only named_guids
#elif (_MSC_VER == 1200) //vc6
#import "acad.tlb" no_implementation raw_interfaces_only named_guids
#elif (_MSC_VER == 1400) //vc8
#import "acax17ENU.tlb" no_implementation raw_interfaces_only named_guids
#elif (_MSC_VER == 1500) //vc9
#import "acax18ENU.tlb" no_implementation raw_interfaces_only named_guids
#endif
在程序中加入_MSC_VER 宏可以根据编译器版本让编译器选择性地编译一段程序。例如一个版本编译器产生的 lib 文件可能不能被另一个版
本的编译器调用,那么在开发应用程序的时候,在该程序的 lib 调用库中放入多个版本编译器产生的 lib 文件。在程序中加入_MSC_VER 宏
,编译器就能够在调用的时根据其版本自动选择可以链接的 lib 库版本,如下所示。
#if _MSC_VER >= 1400 // for vc8, or vc9
#ifdef _DEBUG
#pragma comment(lib, "SomeLib-vc8-d.lib")
#else if
#pragma comment(lib, "SomeLib-vc8-r.lib")
#endif
#else if _MSC_VER >= 1310 // for vc71
#ifdef _DEBUG
#pragma comment(lib, "SomeLib-vc71-d.lib")
#else if
#pragma comment(lib, "SomeLib-vc71-r.lib")
#endif
#else if _MSC_VER >=1200 // for vc6
#ifdef _DEBUG
#pragma comment(lib, "SomeLib-vc6-d.lib")
#else if
#pragma comment(lib, "SomeLib-vc6-r.lib")
#endif
#endif