ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Sliver 源码编译完全指南:从 Makefile 构建到 Docker 镜像与 Proto 再生成

Sliver 源码编译完全指南:从 Makefile 构建到 Docker 镜像与 Proto 再生成 网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载SliverAdversary Emulation Framework是一套开源的对立仿真与 C2 框架代码库横跨client/、server/、implant/与protobuf/等多个 Go 模块。本文以官方文档《Compile from Source》为骨架结合仓库内 Makefile、Dockerfile、go.mod 与 util/assets/assets.go 等源码系统讲解如何在 Linux/macOS 上从源码编译出sliver-server与sliver-client、如何交叉编译到 Windows、如何用 Docker 多阶段构建以及开发者修改.proto后如何重新生成.pb.go代码。读完本文你将能独立完成 Sliver 的全平台构建与自定义改造。一、前置条件操作系统、Go 工具链与 make官方文档明确指出建议在 macOS 或 Linux 机器上编译 Sliver。理论上原生 Windows 也可编译但仓库内所有构建脚本都不是为 Windows 设计的更好的做法是在 Linux/macOS 上交叉编译出 Windows 的 server/client 二进制。如果手头只有 Windows 机器则应使用 Windows Subsystem for LinuxWSL。编译需要的最低环境如下依赖版本要求说明Gov1.27.1 或更高见下方版本校验逻辑make任意可用版本macOS 上可能需要安装 Xcode 及配套命令行工具xcode-select --installGo 版本要求并非仅停留在文档层面仓库中有双重校验证据go.mod 顶部声明module github.com/bishopfox/sliver且go 1.27.1即模块本身要求 Go 1.27.1 语法与工具链Makefile 定义了MIN_SUPPORTED_GO_MAJOR_VERSION 1、MIN_SUPPORTED_GO_MINOR_VERSION 27并通过validate-go-version目标在构建前解析go version输出做比较版本过低会直接报错退出。此外Makefile 的预检查EXECUTABLES uname sed git date cut $(GO)还会验证uname、sed、git、date、cut等基础工具是否在$PATH中缺少任一工具都会中止构建——这也是必须用完整 Linux/macOS 环境的代码级印证。二、获取源码为什么必须 git clone 而不是下载 ZIP官方文档特别强调了一个重要约束必须使用git clone获取代码不能使用 GitHub 的Download ZIP功能因为 Sliver 的 Makefile 需要从 git 仓库中提取版本信息缺少.git目录会导致构建产物损坏。从镜像克隆并进入目录$ git clone https://gitcode.com/gh_mirrors/sl/sliver.git $ cd sliver该约束的底层原因是版本信息来源于 VCSserver/version/sliver-version.go 通过runtime/debug.ReadBuildInfo()读取 Go 构建元数据中的vcs.revision、vcs.time、vcs.modified等字段拼装出Version、GitCommit、GitDirty、CompiledAt等运行时版本信息。Go 在构建时默认会记录 VCS 信息但前提是源码位于有效的 git 工作树中若用 ZIP 解压这些信息缺失版本号会回退为devel且构建流程可能因缺少 git 依赖而中断。三、首次构建make到底做了什么在仓库根目录直接执行$ make默认情况下make会构建当前运行平台的二进制最终在仓库根目录生成两个产物sliver-server服务端程序入口位于 server/main.gosliver-client客户端控制台程序入口位于 client/main.go。从 Makefile 的default目标可以看到完整流程它依次做了三件事clean清理旧的sliver-client*、sliver-server*产物validate-go-version校验 Go 版本 ≥ 1.27.downloaded_assets首次构建时执行go run -modvendor ./util/cmd/assetsMakefile随后才用go build编译 server 与 client。3.1 首次构建的资源下载文档指出Sliver 会内嵌自己的 Go 编译器副本以及若干内部工具首次运行make时一个 bash 脚本会把这些资源下载到本地因此首次构建明显慢于后续构建网络慢时尤其明显。资源下载的实现在 util/cmd/assets/main.go 与 util/assets/assets.go 中。从源码可以看到下载产物输出到server/assets/fs目录util/assets/assets.goHTTP 客户端超时设置为 15 分钟downloadTimeout默认下载尝试次数为 3 次、重试间隔 250msdefaultDownloadAttempts/defaultDownloadDelay网络抖动时能自动重试完成后 Makefile 会在仓库根目录 touch 一个.downloaded_assets标记文件后续构建会复用已下载的资源不再重复下载。下载的内容包括内嵌 Go 编译器、Zig 工具链、garble代码混淆编译器等构建 implant 所需的资产这也是首次构建更慢的根源。3.2 编译细节Tags、CGO 与链接注入查看 Makefile 的默认变量可以了解编译的默认参数TAGS ? -tags go_sqlite默认启用go_sqlite构建标签服务端数据库层server/db依赖 SQLite若把TAGS改为包含cgo_sqlite则CGO_ENABLED会被强制置为 1否则为 0-modvendor使用仓库自带的vendor目录implant/go-mod、根目录 go.sum 配合进行模块解析保证离线可构建-trimpath去除构建路径信息减小二进制体积并避免泄露构建机路径-ldflags -s -w剥离符号表与调试信息通过-X注入三个编译期常量SliverPublicKey更新包签名公钥、DefaultArmoryPublicKey与DefaultArmoryRepoURLArmory 扩展仓库的公钥与 API 地址对应 Makefile 中的SLIVER_PUBLIC_KEY、ARMORY_PUBLIC_KEY、ARMORY_REPO_URL变量可按需覆盖。因此直接make产出的 release 二进制是瘦身 静态链接 内置默认资源的形式。四、交叉编译到指定平台Makefile 支持通过环境变量指定目标平台官方文档给出的用法是$ GOOSwindows GOARCHamd64 make即把GOOS、GOARCH传给make构建逻辑会把这两个变量透传给go build从而在 Linux/macOS 上产出 Windows 二进制。除了通用变量方式Makefile 还提供了大量预定义平台目标见 Makefile使用起来更直观目标产物make macos-amd64sliver-server/sliver-clientdarwin/amd64make macos-arm64darwin/arm64Apple Siliconmake linux-amd64linux/amd64make linux-arm64linux/arm64make windows-amd64sliver-server.exe/sliver-client.exewindows/amd64需要一次构建多个平台时还有批量目标make clients同时构建 macOSamd64/arm64、Linux386/amd64/arm64、Windows386/amd64/arm64、FreeBSDamd64/arm64的客户端make servers同时构建 Windowsamd64/arm64、Linuxamd64/arm64、macOSarm64/amd64的服务端。以windows-amd64为例实际执行的命令为MakefileGOOSwindows GOARCHamd64 CGO_ENABLED0 go build -modvendor -trimpath \ -tags go_sqlite,server -ldflags ... -o sliver-server.exe ./server GOOSwindows GOARCHamd64 CGO_ENABLED0 go build -modvendor -trimpath \ -tags go_sqlite,client -ldflags ... -o sliver-client.exe ./client注意客户端始终以CGO_ENABLED0构建便于全平台静态编译而服务端只有在TAGS包含cgo_sqlite时才开启 CGO。另外 Makefile 对 ARM 机器做了特殊处理当宿主机是 ARM 且未显式指定GOARCH时默认补充GOARCHarm64Makefile。五、使用 Docker 构建官方文档提供了三个 Docker 构建目标docker build --target 目标目标用途test运行单元测试production构建生产镜像包含 Metasploit 等可选依赖production-slim构建生产镜像但不包含 Metasploit 及其他可选依赖体积小约 1GB从项目根目录执行docker build --target production -t sliver .构建完成后即可用文档建议的方式启动docker run -it --rm -v $HOME/.sliver:/home/sliver/.sliver sliver5.1 Dockerfile 多阶段结构解读Dockerfile 采用多阶段构建结构非常清晰base阶段基于golang:latest安装git build-essential zlib1g zlib1g-dev wget zip unzip等基础包创建 UID/GID 999 的sliver用户把代码ADD进/go/src/github.com/bishopfox/sliver/后直接RUN make编译并将产物复制为/opt/sliver-servertest阶段继承base先sliver-server unpack --force解包资源再运行 go-tests.sh 执行单元测试可通过--build-arg GO_TESTS_FLAGS--skip-generate跳过耗时的server/generate生成测试production阶段基于debian:bookworm-slim安装libpcap-dev libsqlite3-dev nasm等依赖并通过官方安装脚本额外安装Metasploit Framework用于 stager 生成从base复制编译好的/opt/sliver-serverunpack后以sliver用户身份启动声明数据卷VOLUME [/home/sliver/.sliver]持久化配置与数据production-slim阶段与 production 结构一致但不安装 Metasploit等可选依赖镜像体积显著缩小。从 Dockerfile 注释也可以看出测试与生产构建的推荐用法# For unit testing: docker build --target test . docker build --target test --build-arg GO_TESTS_FLAGS--skip-generate .5.2 在 Kali Linux 上编译官方文档以 Kali Linux 场景做了说明Docker 构建包含 mingwWindows 交叉编译工具链和 Metasploit因此首次从零构建耗时较长但 Docker 的层缓存机制会让后续构建明显加快同时 Sliver 会在构建过程中运行单元测试这部分也要占用几分钟。关于单元测试脚本go-tests.sh 给出了细节测试默认使用TAGSosusergo,netgo,go_sqlite会将SLIVER_ROOT_DIR、SLIVER_CLIENT_DIR、GOCACHE等全部隔离到临时目录并提示在慢速机器上运行测试耗时极长建议 16 核以上 CPU 与 32GB 以上内存。六、在 Windows 上构建如果只有 Windows 机器官方推荐的路径是安装 WSL然后在 WSL 内按上文 Linux/交叉编译的方式构建。要生成 Windows 二进制执行$ make windows-amd64构建产物为sliver-server.exe与sliver-client.exe可以通过 WSL 的文件系统桥接拷贝到 Windows 侧例如/mnt/c/Users/foo/Desktop。注意运行时需要使用支持 ANSI 转义序列的终端如 Windows Terminal否则控制台 UI 可能显示异常。顺带一提Makefile 中同样为 Windows 宿主编写了cmd.exe版本的构建逻辑SHELL : cmd.exe分支见 Makefile包含等价的windows-amd64、clients、servers、pb等目标但正如文档所说这套脚本是理论可用的辅助实现官方推荐的主路径仍是 WSL。七、开发者进阶修改.proto后重新生成代码Sliver 的跨进程通信依赖 Protobuf/gRPC所有.proto定义集中在 protobuf 目录commonpb、sliverpb、clientpb、dnspb、rpcpb五个子包。如果你修改了任何.proto文件需要额外安装以下工具来重新生成对应的.pb.go文件工具版本要求安装方式protoclibprotocv26.1 或更新从 protobuf 官方发布页下载对应平台二进制并确保在$PATH中protoc --version可验证protoc-gen-gov1.27.1go install google.golang.org/protobuf/cmd/protoc-gen-gov1.27.1protoc-gen-go-grpcv1.2.0go install google.golang.org/grpc/cmd/protoc-gen-go-grpcv1.2.0假设$GOPATH/bin已在$PATH中直接执行go install google.golang.org/protobuf/cmd/protoc-gen-gov1.27.1 go install google.golang.org/grpc/cmd/protoc-gen-go-grpcv1.2.0安装完成后如果命令找不到多半是$GOPATH/bin未加入$PATH补充即可。然后运行$ make pbmake pb目标Makefile会依次对五个.proto文件执行protoc使用pathssource_relative选项把生成的 Go 代码直接写到protobuf/各子包内protoc -I protobuf/ protobuf/commonpb/common.proto --go_outpathssource_relative:protobuf/ protoc -I protobuf/ protobuf/sliverpb/sliver.proto --go_outpathssource_relative:protobuf/ protoc -I protobuf/ protobuf/clientpb/client.proto --go_outpathssource_relative:protobuf/ protoc -I protobuf/ protobuf/dnspb/dns.proto --go_outpathssource_relative:protobuf/ protoc -I protobuf/ protobuf/rpcpb/services.proto --go_outpathssource_relative:protobuf/ \ --go-grpc_outprotobuf/ --go-grpc_optpathssource_relative值得注意只有rpcpb/services.proto同时生成了 gRPC 服务代码--go-grpc_out因为只有它定义了 gRPC 服务其余四个 proto 仅生成普通消息代码。另外Makefile 在pb目标前会强制检查protoc、protoc-gen-go、protoc-gen-go-grpc三个可执行文件是否在$PATH中PB_COMPILERS变量与对应校验逻辑见 Makefile 与 Makefile缺失时会直接报错提示。生成后的.pb.go文件如 protobuf/sliverpb/sliver.pb.go即可作为后续make构建的输入。八、构建完成后的验证与常见问题8.1 验证构建产物构建完成后可以通过服务端命令行检查版本信息是否完整源码见 server/version/sliver-version.go$ ./sliver-server version该命令输出的版本号、Git 提交哈希、编译时间均来自 git VCS 构建信息如果看到Version: devel且缺少 GitCommit说明源码不是通过git clone获取的例如 ZIP 解压与官方文档的警告一致。8.2 常见问题速查首次构建长时间卡在下载阶段这是内嵌 Go 编译器、Zig、garble 等资源在下载输出目录为server/assets/fs下载器自带 3 次重试与 15 分钟超时util/assets/assets.go耐心等待或改善网络后重试即可提示 Golang version is not supportedGo 版本低于 1.27升级工具链后重试提示缺少 protoc / protoc-gen-go / protoc-gen-go-grpc仅运行make pb时需要按第七节安装对应版本生成的 Windows 二进制运行时 UI 乱码请使用支持 ANSI 序列的终端如 Windows Terminal。综上从git clone、make到交叉编译、Docker 多阶段构建再到.proto代码再生成Sliver 的整个构建链路都有清晰的 Makefile/Dockerfile 支撑。理解这些细节后无论是部署官方二进制还是对客户端、服务端乃至通信协议层做自定义改造都能做到有的放矢。赞分享网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载相关推荐FoundationDB 源码构建完全指南从 Docker 镜像到多平台本地编译FoundationDB 源码构建完全指南从 Docker 镜像到多平台本地编译 本篇技术指南围绕 FoundationDB 官方仓库根目录的 README.分布式数据库KV存储数据库后端DataEase 源码构建指南从 Maven 编译到 Docker 镜像打包DataEase 源码构建指南从 Maven 编译到 Docker 镜像打包 引言 在数据分析和可视化领域开源工具的灵活性和可定制性为用户提供了极大的便利。数据分析数据可视化后端前端Mac鼠标指针个性化神器Mousecape一站式定制解决方案Mac鼠标指针个性化神器Mousecape一站式定制解决方案 还在为Mac系统单调的白色光标感到视觉疲劳吗Mousecape为您带来专业级的鼠标指针个性化解桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表