Windows下编译Havoc

客户端编译

安装msys2

image

安装过程一直next,完成后打开终端,更新并安装qt和python, 过程回车并输入y继续。

# 更新
pacman -Su

# 安装Qt Python
pacman -S mingw-w64-x86_64-qt-creator mingw-w64-x86_64-qt5 python python-devel

image

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

image

我这里更改了项目根目录下的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的头文件,

image

打开项目,在client的CMakeLists.txt​中,找到python(59~66)

image

添加自己本机的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

image

这个文件位于/client/include/​,查看报错的52行,这里定义了一些Windows类型,直接注释掉再次编译。

image

新的报错在DemonCmdDispatch.h​的25行,位于/client/include/Havoc/​。

image

这里的CALLBACK​可能与其他代码中的宏、类型、变量名或其他枚举值发生了冲突,将其修改为CALLBACK_FIX​,但他在别处被调用的地方同样要修改,全局搜索一下:

image

修改保存后继续编译,发现还是这个文件中的ERROR​,但是全局没找到调用,直接更名ERROR_FIX

image

继续报错来到ConsoleInput.cc​的2427行,/client/src/Havoc/Demon/​。

image

这里指出将 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​)。但这两种类型没有隐式转换。

image

解决方案就是用auto声明变量进行类型推断,更改为如下:

auto fix_path = std::filesystem::current_path(); 
Path = fix_path.string();

在文件中搜了一下还有2524,2782也是同样的修改一下,再次编译。问题来到exception.hpp:44​,提示strerror_r​没有定义。错误文件位于/client/external/toml/​。

image

第二个红框处是在glibc上定义的函数,因为非 GNU 系统上(比如 MSVC),strerror_r​并未在mingw中兼容到标准库中。这里直接注释并复制使用上一个红框处的逻辑。

image

再次编译报错,提示有很多未定义的函数,这些函数来源于python,应该是python库定位有问题,回到CMakeLists.txt​中。

image

elseif(UNIX)​中的find_package( PythonLibs 3 REQUIRED )​复制到else块中使其按UNIX的逻辑来定位PythonLibs​模块:

image

重新编译,

image

运行发现缺失dll, 除了这个python312.dll​(我本机中多版本,这个还删掉了),还有诸如Qt5Core.dll​,Qt5Gui,dll​,Qt5Network.dll​等等

image

直接搜索全部复制到加入过环境变量的目录中去,比如python的目录。

image

卸载了python3.12确保环境变量中没有指向,然后删除/client/build​目录清空make缓存,重新编译可以启动。

image

上线,执行命令都没有问题:

image

posted @ 2024-07-21 12:05  lockly  阅读(291)  评论(1编辑  收藏  举报