Sliver 中的 Beignet:将 macOS dylib 转换为 ARM64/x86_64 PIC Shellcode 的完整技术指南
网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载Beignet 是 Sliver Adversary Emulation Framework 在 macOS 平台上生成 shellcode 的核心转换库其作用相当于 Windows 平台上的 Donut把darwin/arm64与darwin/amd64架构的.dylib动态库转换为位置无关PIC的原始 shellcode 缓冲区既可独立作为命令行工具使用也可作为 Go 库被导入。读完本文你将掌握 Beignet 的 CLI 用法、Go API 调用方式、aPLib 压缩选项、源码构建流程以及它如何在 Sliver 的generate管线中被实际调用。Beignet 是什么BeignetREADME.md是 SliverArmory 组织为 macOS 准备的 Donut 等价物。它的核心能力是将darwin/arm64Apple Silicon与darwin/amd64Intel的.dylib文件转换为 macOS PIC shellcode生成的 shellcode 通过一个内嵌的内存加载器embedded loader在目标进程内直接加载 dylib全程不落盘支持以 CLI 二进制形式使用也可以作为 Go 库被其他项目如 Sliver 的server导入。从源码结构看仓库由三大部分组成见 vendor/github.com/sliverarmory/beignet 目录模块路径作用顶层 Go APIshellcode.go、arm64_bootstrap.go、amd64_bootstrap.go入口函数、Mach-O 校验、架构引导桩bootstrap stub生成内存加载器internal/loader/beignet_loader.c基于 dyld 的免落盘 Mach-O 加载器 C 源码压缩器internal/aplibaPLibAP32打包/解包实现加载器镜像internal/stager编译好的 arm64/amd64 加载器二进制及go:generate再生成机制CLI 用法一行命令把 dylib 变成 shellcode构建出beignet可执行文件后最基本的转换命令是./beignet --out payload.bin ./payload.dylib./payload.dylib输入的 macOS 动态库thin 或 fat Mach-O 均可支持darwin/arm64、darwin/amd64两种 slice--out payload.bin指定输出的原始 shellcode 文件。可选地用 aPLib 的 “AP32” safe-packed 格式压缩待加载的 dylib以缩小最终 shellcode 体积./beignet --compress --out payload.bin ./payload.dylib从源码看压缩开关对应 shellcode.go 中的逻辑当Options.Compress为 true 时dylib 字节流会先经aplib.PackSafe()压缩再被拼进输出缓冲区而内嵌加载器在运行时能识别 AP32 魔数AP32定义于 beignet_loader.c自动解包后再交给 dyld 加载因此压缩后的 shellcode 无需额外的解包代码参与。从源码构建仓库根目录执行makeMakefile 默认通过go build -o beignet ./cli构建 CLI 二进制。它还对构建环境做了缓存隔离GOCACHE指向$(CURDIR)/.go-cacheZIG_GLOBAL_CACHE_DIR/ZIG_LOCAL_CACHE_DIR指向$(CURDIR)/.zig-cache。另外Makefile 中还有一个用于交叉编译测试运行器的目标make runner它使用 Zig 将 C 代码编译为aarch64-macos可执行文件说明项目对 arm64 目标的验证依赖 Zig 工具链。重新生成内嵌加载器darwin/arm64 darwin/amd64内嵌加载器镜像不是手工维护的二进制而是由 C 源码生成并go:embed进包的。如果需要针对新版本 macOS 或 dyld 行为重新生成执行go generate ./internal/stager这条命令触发 internal/stager/gen.go 中的指令//go:generate go run ../../internal/tools/genstager -src ../../internal/loader/beignet_loader.c -out .即由genstager工具读取 beignet_loader.c编译并抽取相关 segment 后输出两个产物见 internal/stager 目录stager_darwin_arm64.binstager_darwin_arm64_gen.gostager_darwin_amd64.binstager_darwin_amd64_gen.go生成的 Go 文件例如 stager_darwin_amd64_gen.go通过//go:embed把二进制与入口偏移量如 amd64 的0x4e0编译进最终库中运行时由 stager.go 的LoaderText(cpu)按目标架构返回对应镜像。作为 Go 库使用API 与调用流程Beignet 暴露了两个核心转换函数shellcode.gofunc DylibFileToShellcode(path string, opts Options) ([]byte, error) func DylibToShellcode(dylib []byte, opts Options) ([]byte, error)Options结构体支持两个字段字段默认值说明EntrySymbol_StartW在加载模块中解析的入口符号名未加前导下划线时会被自动补上且不允许包含 NUL 字节Compressfalse是否用 aPLib “AP32” safe-packed 格式压缩 dylib 缓冲区DylibFileToShellcode内部通过macho.NewFatFile解析输入支持 thin 与 fat 两种格式若是 fat Mach-O会优先按当前runtime.GOARCH选择 slice并保持 arm64 优先于 amd64 的确定性回退顺序。若输入既不是MH_DYLIB也不是MH_BUNDLE或架构不受支持会分别返回ErrInvalidMachO与ErrUnsupportedArch见 shellcode.go。输出缓冲区布局DylibToShellcode生成的 shellcode 遵循严格的布局shellcode.go架构引导桩bootstrap stub一段几十字节的位置无关汇编负责设置寄存器参数并跳转到加载器对齐填充加载器镜像要求起始于页边界0x1000以保持 ADRP 相对寻址有效因此 bootstrap 之后会按页对齐补齐内嵌加载器镜像从 C 源码抽取的近似位置无关 Mach-O 镜像载荷区原始 dylib或经 aPLib 压缩后的数据按 16 字节对齐入口符号名以 NUL 结尾的符号字符串供加载器在镜像内查找入口。引导桩的寄存器约定因架构而异arm64arm64_bootstrap.gox0 载荷指针、x1 载荷大小、x2 符号指针最后br跳转到加载器入口固定长度为21 * 4字节。amd64amd64_bootstrap.gordi 载荷指针、rsi 载荷大小、rdx 符号指针通过call rax调用加载器并ret返回调用者保持 System V ABI 的栈对齐固定长度 59 字节。两个引导桩都是运行时用 Keystone 引擎 现场汇编生成并用固定长度断言保证输出稳定性。内嵌加载器的实现原理免落盘加载internal/loader/beignet_loader.c 是整个方案的灵魂其设计要点从源码注释与实现中可以明确归纳源自 Metasploit 的 OSX Stager文件头注明基于 Rapid7 的 OSX stager 源码采用 BSD-3-clause 许可。freestanding 风格不调用 libc文件被编译成 Mach-O 后相关 segment 被抽取为扁平的内存镜像当作 shellcode 执行因此所有系统调用mmap、mprotect、shared_region_check_np都以内联汇编 svc/syscall指令直接发起。主加载路径绝不写盘不使用open/write/unlink创建临时文件。双路径策略x86_64走 libdyld 导出的传统NS*APINSCreateObjectFileImageFromMemory、NSLinkModule、NSLookupSymbolInModule、NSAddressOfSymbol且先把MH_DYLIB归一化为MH_BUNDLE私有副本避免触发基于磁盘的回退路径见 beignet_loader.carm64解析/usr/lib/dyld中 dyld4 的 C 符号dyld4::JustInTimeLoader::make、analyzeSegmentsLayout、loadDependents、applyFixups、runInitializersBottomUpPlusUpwardLinks等用JustInTimeLoader从内存加载 Mach-O 镜像并配合lsl::MemoryManager的可写状态切换与ProtectedStack执行关键流程见 beignet_loader.c。AP32 自动解包若载荷开头是 aPLib safe 头魔数AP32加载器会先用内嵌的aP_depack_safe安全解包器解压到匿名映射内存再进入 dyld 加载流程错误码统一以返回值形式返回如 14/15 表示压缩数据损坏、16/17 表示 NS* 加载失败。在 Sliver 中的实际应用Beignet 不是孤立存在的工具它已被集成进 Sliver 的server/generate模块。在 server/generate/binaries.go 的注释中明确说明Sliver 生成 shellcode 时按平台选择转换器——Windows 用 DonutmacOS 用 BeignetLinux 用 malasada。具体调用点在 server/generate/binaries.goshellcodeBin, err : beignet.DylibToShellcode(dylibData, beignet.Options{ EntrySymbol: config.Exports[0], Compress: compress, })其中compress由ShellcodeConfig.Compress 2决定binaries.go对应 aPLib 压缩模式EntrySymbol直接使用编译出的导出符号。也就是说在 Sliver 中执行generate并选择 macOS 目标时darwin/arm64及darwin/amd64dylib 会经此管线被转成.binshellcode 文件供后续注入/加载使用。适用前提与限制平台限定Beignet 只面向 macOS且仅支持darwin/arm64与darwin/amd64两种架构其他平台/架构会返回ErrUnsupportedArch。入口符号dylib 需要暴露可解析的导出符号默认_StartWBeignet 不做符号注入符号不存在时加载器会返回对应错误码。加载器版本敏感度arm64 路径依赖 dyld4 的内部符号不同 macOS 版本之间可能存在差异这正是提供go generate ./internal/stager重新生成机制的原因——当目标系统 dyld 变化时可重新构建内嵌加载器。压缩权衡--compress会减小 shellcode 体积但载荷区变为 AP32 压缩流加载器运行时需额外解压二者需按场景取舍。总结Beignet 是 Sliver 在 macOS 平台生成 PIC shellcode 的关键组件CLI 与 Go API 双形态、aPLib 压缩、免落盘 dyld 内存加载、跨 arm64/amd64 架构支持再加上go generate可再生的内嵌加载器使其成为一条完整、可维护的 dylib→shellcode 流水线。无论是想独立把 dylib 转成可注入的 macOS shellcode还是理解 Slivergenerate后端对 macOS 目标的处理细节都可以从本仓库的 README.md、shellcode.go 与 beignet_loader.c 入手深入研读。赞分享网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载相关推荐将 Gatsby Starter 转换为 Gatsby Theme 的完整实战指南将 Gatsby Starter 转换为 Gatsby Theme 的完整实战指南 Gatsby Theme 是可直接发布到 npm 的插件类型它包含 gat前端静态站点Web框架danmaku2ass将弹幕转换为ASS字幕的完整指南danmaku2ass将弹幕转换为ASS字幕的完整指南 danmaku2ass 是一个功能强大的开源工具专门用于将来自Niconico、Acfun、BiliCLI音视频将现有软件转换为 Apify ActorAgentic Awesome Skills 中 Actorization 技能的完整实战指南将现有软件转换为 Apify ActorAgentic Awesome Skills 中 Actorization 技能的完整实战指南 ActorizatioAI 技能AI 插件上一篇OpenTUI Zig 原生依赖离线打包与可复现构建指南zig-deps.tar.gz 的生成、校验与更新流程下一篇emilianJR/chilloutmix_NiPrunedFp32Fix无服务器部署云平台方案对比创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

不更新游戏,DLSS 版本随意升级回退:DLSS Swapper 完整指南

不更新游戏,DLSS 版本随意升级回退:DLSS Swapper 完整指南

不更新游戏,DLSS 版本随意升级回退:DLSS Swapper 完整指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 还在玩的老游戏迟迟不给你上 DLSS 2.2 以上的新版本,画面发糊、动态场景有…

2026/9/25 7:59:16 阅读更多 →
Hunk 0.22 版本全解:仓库历史化身为响应式审查工作区

Hunk 0.22 版本全解:仓库历史化身为响应式审查工作区

开发工具代码评审CLIAI 应用 【免费下载链接】hunk Review-first terminal diff viewer for agentic coders 项目地址: https://gitcode.com/gh_mirrors/hu/hunk 点击查看 免费下载 导读 Hunk 0.22 是一次以“交互式仓库历史(interactive history&…

2026/9/25 7:59:16 阅读更多 →
Mopidy HTTP JSON-RPC API 完整指南:通过 HTTP POST 与 WebSocket 调用 Core API 并订阅事件

Mopidy HTTP JSON-RPC API 完整指南:通过 HTTP POST 与 WebSocket 调用 Core API 并订阅事件

音视频后端 【免费下载链接】mopidy Mopidy is an extensible music server written in Python 项目地址: https://gitcode.com/gh_mirrors/mo/mopidy 点击查看 免费下载 Mopidy 是可扩展的 Python 音乐服务器,其 HTTP 扩展(mopidy.http&…

2026/9/25 7:59:16 阅读更多 →

最新新闻

x86汇编核心指令与栈帧实战:从寻址到调试

x86汇编核心指令与栈帧实战:从寻址到调试

1. 为什么还要啃x86汇编这块硬骨头很多人一听“汇编”两个字,脑子里蹦出来的第一反应就是“这玩意儿不是早就被淘汰了吗”。我刚开始带新人的时候也经常被问:现在都是Java、Python、Go满天飞,学x86汇编到底图什么。这个问题我认真想过&#x…

2026/9/25 10:10:03 阅读更多 →
Substrate底层承载层:概念解析、选型逻辑与工程实践指南

Substrate底层承载层:概念解析、选型逻辑与工程实践指南

1. 从“substrate”这个词说起:它到底指什么第一次看到“substrate”这个词,很多人会愣一下。它在不同圈子里含义差别很大:做区块链的人第一反应是 Parity 那套区块链框架,做材料化学的人想到的是“基底、衬底”,做半导…

2026/9/25 10:10:03 阅读更多 →
狗头军师7大主策略全解析:从承接到收线,每轮聊天该走哪一步

狗头军师7大主策略全解析:从承接到收线,每轮聊天该走哪一步

狗头军师7大主策略全解析:从承接到收线,每轮聊天该走哪一步 【免费下载链接】goutoujunshi 一个先接住情绪、再分析关系并给出可执行策略的 Codex 恋爱军师,内置心理、法律、社会、人文、哲学、婚姻家庭与性学知识库,支持多元关系…

2026/9/25 10:10:03 阅读更多 →
油猴脚本自动答题实战:从DOM操作到浏览器自动化

油猴脚本自动答题实战:从DOM操作到浏览器自动化

1. 从“一键答完整个练习页”说起:油猴脚本到底做了什么说实话,看到“油猴自动答题”这个标题,我的第一反应不是“又来一个作弊脚本”,而是“终于有人开始认真研究浏览器自动化了”。我自己写这类脚本,最初的动机其实特…

2026/9/25 10:10:03 阅读更多 →
人工智能基础概念全景解析:从 AI 到 Transformer、LLM、Prompt、Token、RAG、Agent、对齐与安全——用 TaoToken 统一 Key 串起概念验证

人工智能基础概念全景解析:从 AI 到 Transformer、LLM、Prompt、Token、RAG、Agent、对齐与安全——用 TaoToken 统一 Key 串起概念验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 10:10:03 阅读更多 →
Anbox 的进程控制基石:process-cpp-minimal 库源码深度解析与实战指南

Anbox 的进程控制基石:process-cpp-minimal 库源码深度解析与实战指南

虚拟化容器运行时 【免费下载链接】anbox Anbox is a container-based approach to boot a full Android system on a regular GNU/Linux system 项目地址: https://gitcode.com/gh_mirrors/an/anbox 点击查看 免费下载 process-cpp-minimal 是 Anbox 项目引入的轻…

2026/9/25 10:09:02 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →