Windows下编译Havoc
客户端编译
安装msys2
安装过程一直next,完成后打开终端,更新并安装qt和python, 过程回车并输入y继续。
# 更新
pacman -Su
# 安装Qt Python
pacman -S mingw-w64-x86_64-qt-creator mingw-w64-x86_64-qt5 python python-devel
cmake不能用通用版本,要使用mingw-w64-x86_64-cmake
。
# 安装cmake
pacman -S mingw-w64-x86_64-cmake
pacman -S base-devel mingw-w64-x86_64-toolchain git subversion mercurial mingw-w64-x86_64-nasm mingw-w64-x86_64-lld autoconf automake
克隆项目,进入项目目录,尝试编译客户端,但遇到报错提示ssl证书有问题。
git clone https://github.com/HavocFramework/Havoc.git
cd havoc
make client-build
我这里更改了项目根目录下的url,全部替换成了镜像站:
[submodule "client/external/spdlog"]
path = client/external/spdlog
url = https://githubfast.com/gabime/spdlog
[submodule "client/external/json"]
path = client/external/json
url = https://githubfast.com/nlohmann/json
[submodule "client/external/toml"]
path = client/external/toml
url = https://githubfast.com/ToruNiina/toml11
再次执行,遇到新的报错:没有找到python的头文件,
打开项目,在client的CMakeLists.txt
中,找到python(59~66)
添加自己本机的python位置(这里用的前面msys2中安装的):
if(APPLE)
execute_process( COMMAND brew --prefix OUTPUT_VARIABLE BREW_PREFIX ) #this because brew install location differs Intel/Apple Silicon macs
string( STRIP ${BREW_PREFIX} BREW_PREFIX ) #for some reason this happens: https://gitlab.kitware.com/cmake/cmake/-/issues/22404
include_directories( "${BREW_PREFIX}/bin/python3.10" )
include_directories( "${BREW_PREFIX}/Frameworks/Python.framework/Headers" )
elseif(UNIX)
include_directories( ${PYTHON_INCLUDE_DIRS} )
else()
include_directories( "D:/env/msys2/mingw64/include/python3.11/" )
endif()
再次编译遇到新的报错,报错位置在global.hpp
这个文件位于/client/include/
,查看报错的52行,这里定义了一些Windows类型,直接注释掉再次编译。
新的报错在DemonCmdDispatch.h
的25行,位于/client/include/Havoc/
。
这里的CALLBACK
可能与其他代码中的宏、类型、变量名或其他枚举值发生了冲突,将其修改为CALLBACK_FIX
,但他在别处被调用的地方同样要修改,全局搜索一下:
修改保存后继续编译,发现还是这个文件中的ERROR
,但是全局没找到调用,直接更名ERROR_FIX
继续报错来到ConsoleInput.cc
的2427行,/client/src/Havoc/Demon/
。
这里指出将 std::filesystem::path
类型的对象赋值给 std::__cxx11::basic_string<char>
类型的对象,但是编译器找不到合适的 operator=
来完成这个赋值操作。来到代码中看这一行Path = std::filesystem::current_path();
,他将 current_path()
的结果(一个 std::filesystem::path
对象)赋值给 Path
,而 Path
被推断为 std::basic_string<char>
类型(即 std::string
)。但这两种类型没有隐式转换。
解决方案就是用auto声明变量进行类型推断,更改为如下:
auto fix_path = std::filesystem::current_path();
Path = fix_path.string();
在文件中搜了一下还有2524,2782也是同样的修改一下,再次编译。问题来到exception.hpp:44
,提示strerror_r
没有定义。错误文件位于/client/external/toml/
。
第二个红框处是在glibc上定义的函数,因为非 GNU 系统上(比如 MSVC),strerror_r
并未在mingw中兼容到标准库中。这里直接注释并复制使用上一个红框处的逻辑。
再次编译报错,提示有很多未定义的函数,这些函数来源于python,应该是python库定位有问题,回到CMakeLists.txt
中。
将elseif(UNIX)
中的find_package( PythonLibs 3 REQUIRED )
复制到else块中使其按UNIX的逻辑来定位PythonLibs
模块:
重新编译,
运行发现缺失dll, 除了这个python312.dll
(我本机中多版本,这个还删掉了),还有诸如Qt5Core.dll
,Qt5Gui,dll
,Qt5Network.dll
等等
直接搜索全部复制到加入过环境变量的目录中去,比如python的目录。
卸载了python3.12确保环境变量中没有指向,然后删除/client/build
目录清空make缓存,重新编译可以启动。
上线,执行命令都没有问题: