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缓存,重新编译可以启动。
上线,执行命令都没有问题:
本文作者:lockly
本文链接:https://www.cnblogs.com/bktown/p/18314327/compile-havoc-under-windows-z25dynx
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2023-07-21 Matrix-writeup