ARTICLE DETAIL

资讯详情

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

Sandboxie Classic 源码编译指南:基于 Visual Studio 2022 从零构建沙箱核心套件

Sandboxie Classic 源码编译指南:基于 Visual Studio 2022 从零构建沙箱核心套件 Sandboxie Classic 源码编译指南基于 Visual Studio 2022 从零构建沙箱核心套件【免费下载链接】SandboxieSandboxie Plus Classic项目地址: https://gitcode.com/gh_mirrors/sa/Sandboxie本文是 Sandboxie 经典版Classic的完整构建指南围绕仓库中的 Sandboxie/ReadMe.md 展开覆盖环境准备、解决方案结构、msbuild 命令、源码项目全景以及安装程序制作。读完本文你将能够在 Visual Studio 2022 环境下编译出 SbieDrv 驱动、SbieSvc 服务、SbieDll 注入 DLL 等全部经典版组件并理解它们之间的依赖关系与底层职责。一、构建前置条件一个干净的 Windows C 工具链Sandboxie Classic 的构建目标是Visual Studio 2022官方文档列出的环境要求如下安装 Visual Studio 2022在 Visual Studio Installer 中选择Desktop development with C工作负载并勾选一个当前版本的 Windows SDK为每个需要构建的平台安装MSVC v143与MFC组件驱动与多个 GUI 项目都依赖 MFC安装与 SDK 版本匹配的 Windows Driver KitWDKWDK 安装器通常会顺带安装对应的 Visual Studio 扩展若在 Visual Studio 中看不到驱动项目需重新运行 WDK 安装器修复扩展保持项目文件自带的工具集选择不要对各项目做重定向retarget也不要手动向项目添加 WDK include 路径——这些路径已由仓库内的共享属性文件统一处理。从仓库中的属性文件可以印证第 4 点的必要性以 Sandbox64.props 为例它通过IncludePath拼接了..\;..\..\;..\..\..\、$(VCInstallDir)include、$(WindowsSDK_IncludePath)与$(VCInstallDir)atlmfc\include同时定义了_CRT_NON_CONFORMING_SWPRINTFS、_WIN64、_AMD64_、UNICODE、WINVER0x0502、_WIN32_WINNT0x0502、_WIN32_IE0x0603等预处理宏并将输出目录统一为$(SolutionDir)Bin\$(PlatformName)\$(Configuration)\。人为改动这些配置很容易破坏驱动与用户态组件之间的一致性因此官方明确要求沿用项目默认设置。1.1 编译器与工具集版本SbieRelease配置统一使用MSVC v143工具集。以 SboxSvc.vcxproj 为例其SbieRelease|Win32/x64/ARM64/ARM64EC四个平台配置均声明PlatformToolsetv143/PlatformToolset并与对应平台的 props 属性表Sandbox32.props/Sandbox64.props/Sandbox64a.props/Sandbox64ec.props绑定。这也解释了文档为何强调必须安装 v143 工具集。二、解决方案与构建顺序为什么先 Win32 再 x64Sandboxie Classic 的源码分布在三个解决方案中全部位于Sandboxie目录下解决方案文件内容说明Sandbox.sln主解决方案包含驱动、服务、控制台、各 COM 包装器、工具等全部项目支持SbieDebug/SbieRelease×Win32/x64/ARM64/ARM64ECSandboxDll.slnSbieDll 注入 DLL 相关需以 Win32 与 x64/ARM64EC 分别编译SandboxDrv.slnSbieDrv 内核驱动需 WDK 与驱动扩展构建顺序是硬性要求必须先编译 Win32 平台的服务与 DLL 组件再编译 x64 解决方案与驱动。原因在于 SbieSvc 服务等组件需要跨位宽组件支撑从 Sandbox.sln 的依赖声明可以看到SboxSvc、Start、SbieControl等几乎所有项目都依赖SboxDll{8E0EAA5B-6F5B-E0E2-338A-453EF2B548E4}与SboxMsg{63B0DDD2-5E3B-EF38-F711-9652D2EB73B3}等项目产物而 SboxSvc.vcxproj 的链接配置中直接依赖SbieDll.lib——该导入库必须由 Win32 构建先行产出。2.1 x64 版本发布构建命令在仓库根目录打开Visual Studio 2022 Developer Command Prompt依次执行msbuild /t:build Sandboxie\SandboxDll.sln /p:ConfigurationSbieRelease /p:PlatformWin32 -maxcpucount:8 msbuild /t:build Sandboxie\Sandbox.sln /p:ConfigurationSbieRelease /p:Platformx64 -maxcpucount:8 msbuild /t:build Sandboxie\SandboxDrv.sln /p:ConfigurationSbieRelease /p:Platformx64 -maxcpucount:8参数说明/t:build执行 Build 目标/p:ConfigurationSbieRelease使用发布配置另有SbieDebug调试配置/p:PlatformWin32|x64目标平台注意第一步必须是 Win32-maxcpucount:8启用最多 8 个并行编译任务可按机器核心数调整。2.2 构建顺序的 CI 验证.github/workflows/main.yml 中的Build_x64_Qt6作业与文档完全一致地按SandboxDll.sln (Win32)→Sandbox.sln (x64)→SandboxDrv.sln (x64)三步执行runs-on: windows-2022验证了这套命令是官方 CI 实际使用的构建路径。2.3 ARM64 与 ARM64EC 构建ARM64 平台的构建顺序略有不同同样以 .github/workflows/main.yml 的Build_ARM64_Qt6作业为准msbuild /t:build Sandboxie\SandboxDll.sln /p:ConfigurationSbieRelease /p:PlatformWin32 -maxcpucount:8 msbuild /t:build Sandboxie\Sandbox.sln /p:ConfigurationSbieRelease /p:PlatformARM64 -maxcpucount:8 msbuild /t:build Sandboxie\SandboxDll.sln /p:ConfigurationSbieRelease /p:PlatformARM64EC -maxcpucount:8 msbuild /t:build Sandboxie\SandboxDrv.sln /p:ConfigurationSbieRelease /p:PlatformARM64 -maxcpucount:8ARM64EC 采用SandboxDll.sln单独构建 DLL而主解决方案中部分项目在 ARM64EC 平台下会回退到 x64 配置见 Sandbox.sln 中Start、Common、SboxMsg、SandboxCrypto等项目的映射。ARM64 驱动仍需 WDK 中对应的 ARM64 交叉编译支持。三、源码项目全景从驱动到工具的 16 个构建单元文档以字母序列出了全部源码项目并特别强调Sandboxie 的核心是驱动 SbieDrv、服务 SbieSvc 与注入 DLL SbieDll 三者建议优先研究这三个项目。下面按职责分组展开目录均为相对仓库根目录的路径。3.1 核心三件套驱动 / 服务 / 注入SboxDrvcore/drv编译产出 SbieDrv.sys 内核驱动。驱动负责文件、注册表、对象等系统资源的重定向与强制隔离是沙箱的地基。SboxDrv.vcxproj 依赖 SboxMsg说明驱动直接嵌入了消息 ID 定义其下的file_flt.c、key_flt.c、obj_flt.c、process_force.c、syscall_*.c等文件揭示了驱动的拦截层次。SboxSvccore/svc编译产出 SbieSvc.exe 服务。从 main.cpp 可以看到它注册了SBIESVC即SbieSvc定义于 my_version.h服务入口并组装了ComServer、PipeServer、GuiServer、UserServer、ProcessServer、sbieiniserver、fileserver、netapiserver、MountManager等一整套用户态服务器组件负责与注入 DLL 通信、管理配置与进程生命周期。SboxDllcore/dll编译产出 SbieDll.dll 注入库注入到沙箱内每一个进程负责用户态 API 拦截与重定向文件、注册表、窗口、COM 等并通过命名管道与 SbieSvc 协作。3.2 注入辅助组件LowLevelcore/low产出 LowLevel.dll用于代码注入。该 DLL 以资源形式嵌入 SbieSvc.exe资源脚本见 core/dll/lowlevel.rc由服务在注入流程中提取使用。SboxHostDllSboxHostDll产出 SboxHostDll.dll 宿主注入库注入到必须重定向进沙箱的宿主进程中。目前唯一的应用场景是 MS Office——注入到 OfficeClickToRun.exe。dllmain.cpp 与 SboxHostDll.cpp 是其实现主体。3.3 用户态控制与工具Commonapps/common产出 common.lib 静态库包含通用 GUI 对象对话框模板、字体存储、菜单绘制等被 Control 与 Start 项目共用。SbieControlapps/control产出 SbieCtrl.exe即 Sandboxie Control 图形界面实时展示沙箱内应用的活动、托盘图标与配置管理。Startapps/start产出 start.exe用于在沙箱中启动进程。其 start.cpp 中解析/box:命令行开关第 496-499 行附近格式为box:沙箱名例如start.exe /box:DefaultBox notepad.exe。SbieIniapps/ini产出 SbieIni.exe用于查询与更新 sandboxie.ini 配置文件。从 main.c 的用法提示Usage: SbieIni.exe query|queryex|set|append|insert|delete可知其支持六类子命令属于面向脚本与高级排障的命令行工具。KmdUtilinstall/kmdutil产出 KmdUtil.exe安装过程中用于启动/停止 Sbie 驱动SbieDrv.sys等内核管理操作。3.4 COM 系统服务包装器apps/comSandboxie 需要对 Windows 的多个关键 COM/系统服务做重定向因此提供了五个包装器可执行文件均依赖 SboxDll 注入库项目产物包装的服务SandboxBITSapps/com/BITSSandboxieBITS.exe后台智能传输服务Background Intelligent Transfer ServiceSandboxCryptoapps/com/CryptoSandboxieCrypto.exe加密相关 COM 服务SandboxRpcSsapps/com/RpcSsSandboxieRpcSs.exe远程过程调用子系统Remote Procedure Call Sub-SystemSandboxWUAUapps/com/WUAUSandboxieWUAU.exeWindows 自动更新服务WUAUSERVSboxDcomLaunchapps/com/DcomLaunchSandboxieDcomLaunch.exeDCOM 启动服务这五个项目共享 apps/com/common.h、apps/com/header.h 与 apps/com/privs.h 三个公共头文件在 Sandbox.sln 中以com解决方案文件夹形式组织。3.5 消息与安装相关Parsemsgs解析消息文本如 Sbie-English-1033.txt 及各语言的Text-*.txt生成 Sbie 消息文件parse.c 与 Parse.vcxproj 是其实现。SboxMsgmsgs产出 SboxMsg.dll内含多种语言的 SBIE 用户消息供驱动、服务、GUI 等模块引用。SandboxieInstallinstall/release产出合并后的 x64/x86 安装器 SandboxieInstall.exe——通过将 x64 与 x86 两个安装器二进制合并进一个 RC 文件实现。注意该工程不会在常规 SLN 构建中编译必须等 x64 与 x86 安装器都生成后手动单独构建。四、版本信息与配置常量的统一出口所有组件共享的版本与命名常量集中在 Sandboxie/common/my_version.h。当前仓库的版本号为5.73.4VERSION_MJR5、VERSION_MIN73、VERSION_REV4、VERSION_UPD0。该文件同时定义了产物命名SbieSvc.exe、SbieCtrl.exe、Start.exe、SbieDll、SbieMsg.dll、SbieIni.exe、SbieDrv.sys配置文件Sandboxie.ini安装器路径SBIE_INSTALLER_PATH默认..\Bin\、SBIE_INSTALLER_PATH_32/SBIE_INSTALLER_PATH_64——这两个宏会被 NSIS 脚本 install/SandboxieVS.nsi 读取。修改版本号或构建输出位置时应以该文件为准因为 Resource Compiler 与 NSIS 安装器都会引用它。五、进阶制作 Sandboxie Classic 安装程序NSIS安装程序的详细流程记录在 install/ReadMe.md 中以下是其要点整理。5.1 一次性准备 NSIS 环境安装NSIS 2.52.50 版——文档明确提示更高版本无法与 Sbie 的 NSI 文件兼容安装 NSISInetC 插件从 Inetc.zip 中把\Plugins\x86-ansi\InetC.dll复制到 NSIS 插件目录如C:\Program Files (x86)\NSIS\Plugins用仓库内 install/nsis_updates.zip 中的nsis\Contrib\Modern UI\System.nsh覆盖 NSIS 安装目录下的同名文件将压缩包内nsis\Contrib\Modern UI\Language files下的语言文件复制到 NSIS 对应目录安装 Iconv 1.9.2.1747国际语言转换需要取得Iconv.exe、Libiconv2.dll、Libintl3.dll三个二进制放入源码树中与Sandbox.sln同级的tools\iconv目录例如C:\src\Sbie\tools\iconv。上述步骤只需执行一次。5.2 生成 Classic 安装器NSIS 脚本为 install/SandboxieVS.nsi。官方文档提醒该小节关于代码签名的步骤仅适用于不经由微软中介的旧式签名流程存在过时信息需以项目 issue #1248 的最新讨论为准。通用流程为如适用对二进制签名在 common/my_version.h 中设置SBIE_INSTALLER_PATH等#define指向你的二进制所在位置编辑 install/SandboxieVS.nsi为要生成安装器的版本取消注释对应的!define _BUILDARCH在资源管理器中右键 install/SandboxieVS.nsi选择Compile NSIS Script产物SandboxieInstall64.exe或SandboxieInstall32.exe将保存到my_version.h中SBIE_INSTALLER_PATH指定的目录对安装器签名在 Visual Studio 中右键SandboxieInstall项目 →Project Only→Build Only SandboxieInstall生成合并的 32/64 位SandboxieInstall.exe输出到 install 目录对合并安装器签名。六、构建排障与学习路径建议驱动项目不可见通常是 WDK 的 Visual Studio 扩展未正确安装重新运行 WDK 安装器即可。构建失败在 v140/v143 混用仓库保留的旧Debug/Release配置仍指向 v140务必使用文档指定的SbieRelease/SbieDebug配置。链接错误缺 SbieDll.lib说明跳过了第一步 Win32 的SandboxDll.sln构建请严格按顺序执行。文档与 CI 的时效性官方文档本身提示其内容可能滞后于 CI 工作流遇到版本变动时以 CI 为准。阅读源码的顺序官方建议先从 SboxDrvcore/drv、SboxSvccore/svc、SboxDllcore/dll 三个核心项目入手再扩展到 SbieControlapps/control 与 Startapps/start 等外围组件即可对沙箱的驱动拦截—服务协调—DLL 注入三层架构形成完整认识。通过本文你已掌握 Sandboxie Classic 从环境准备、分步编译到生成安装器的完整链路先备齐 VS2022 v143 MFC WDK再按 Win32 → x64 → 驱动的顺序执行三条 msbuild 命令最后借助 NSIS 脚本与SandboxieInstall工程产出可分发的合并安装器。【免费下载链接】SandboxieSandboxie Plus Classic项目地址: https://gitcode.com/gh_mirrors/sa/Sandboxie创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表