admin管理员组

文章数量:1528319

Sandboxie

在手机上对于沙盒我们再熟悉不够了,我们的每个应用的运行在独立的空间中,避免手机中不同应用的相互影响。

Windows下,如果在处理某些不太确定为安全的程序,可以先在沙盒中独立运行。

Sandboxie 是一款基于沙盒的隔离软件,适用于 32 位和 64 位基于 Windows NT 的操作系统(Windows 7 或更高版本,32 位或 64 位)。它创建了一个类似于沙盒的隔离操作环境,可以在其中运行或安装应用程序,而无需永久修改本地和映射驱动器或 Windows 注册表。隔离的虚拟环境允许对不受信任的程序和网上冲浪进行受控测试。

Sandboxie上,github在这里。


Sandboxie 有两种版本,Plus 和 Classic。它们都共享相同的核心组件,这意味着它们具有相同级别的安全性和兼容性。不同的是用户界面中功能的可用性。

Plus build 有一个基于 Qt 的现代 UI,它支持自项目开源以来添加的所有新功能:

  • 快照管理器 - 此功能需要任何框的副本,以便在需要时恢复
  • 维护模式 - 它允许在需要时卸载/安装/启动/停止 Sandboxie 驱动程序和服务
  • 便携模式 - 您可以运行安装程序并选择将所有文件提取到一个目录
  • 用于阻止访问 Windows 组件(如打印机后台处理程序和剪贴板)的其他 UI 选项
  • 启动/运行和 Internet 访问限制的更多自定义选项
  • 终止所有盒装进程的全局热键
  • 每个沙盒都有一个新的防火墙,支持 Windows 过滤平台 (WFP)

Sandboxie的使用

Sandboxie的使用也比较简单,通过安装包直接安装软件,新建一个沙盒环境启动程序,Sandboxie的使用也比较简单,Sandboxie的一大有点就是他很小,但是功能还是很强的。

源代码分析

Sandboxie 用的是c语言进行编写,代码中中不仅包含着上层的地面,还包括了驱动相关的代码。创建沙盒过程的代码如下:

_FX BOX *Box_CreateEx(
    POOL *pool, const WCHAR *boxname,
    const WCHAR *sidstring, ULONG session_id,
    BOOLEAN init_paths)
{
    BOX *box;

    box = Box_Alloc(pool, boxname, session_id);
    if (! box)
        return NULL;

    if (! Box_InitKeys(pool, box, sidstring, session_id)) {
        Box_Free(box);
        return NULL;
    }

    if (! Box_InitConfExpandArgs(pool, box)) {
        Box_Free(box);
        return NULL;
    }

    if (init_paths) {

        BOOLEAN ok;
        Conf_AdjustUseCount(TRUE);
        ok = Box_InitPaths(pool, box);
        Conf_AdjustUseCount(FALSE);

        if (! ok) {
            Box_Free(box);
            return NULL;
        }
    }

    return box;
}

启动驱动的部分 代码:

_FX NTSTATUS DriverEntry(
    IN  DRIVER_OBJECT  *DriverObject,
    IN  UNICODE_STRING *RegistryPath)
{
    BOOLEAN ok = TRUE;

	ExInitializeDriverRuntime(DrvRtPoolNxOptIn);

    //
    // initialize global driver variables
    //

    Driver_Object = DriverObject;
    Driver_Object->DriverUnload = NULL;

    RtlInitUnicodeString(&Driver_Altitude, Altitude_Str);

    if (ok)
        ok = Driver_CheckOsVersion();

    if (ok) {
        Driver_Pool = Pool_Create();
        if (! Driver_Pool) {
            Log_Msg0(MSG_1104);
            ok = FALSE;
        }
    }

    if (ok)
        ok = Driver_InitPublicSecurity();

    if (ok) {
        Driver_RegistryPath =
            Mem_AllocStringEx(Driver_Pool, RegistryPath->Buffer, TRUE);
        if (! Driver_RegistryPath)
            ok = FALSE;
    }

    if (ok)
        ok = Driver_FindHomePath(RegistryPath);

    MyValidateCertificate();

    //
    // initialize simple utility modules.  these don't hook anything
    //

    if (ok)
        ok = Obj_Init();

    if (ok)
        ok = Conf_Init();

    if (ok)
        ok = Dll_Init();

    if (ok)
        ok = Syscall_Init();

    if (ok)
        ok = Session_Init();

    if (ok)
        ok = Driver_FindMissingServices();

    if (ok)
        ok = Token_Init();

    //
    // initialize modules.  these place hooks into the system.  hooks
    // become active as soon as installed.  the Process module must be
    // initialized first, because it initializes the process list
    //

    if (ok)
        ok = Process_Init();

    if (ok)
        ok = Thread_Init();

    if (ok)
        ok = File_Init();

    if (ok)
        ok = Key_Init();

    if (ok)
        ok = Ipc_Init();

    if (ok)
        ok = Gui_Init();

    //
    // create driver device for servicing user mode requests
    //

    if (ok)
        ok = Api_Init();

    //
    // initializing Windows Filtering Platform callouts
    //
    
    if (ok)
        ok = WFP_Init();

    //
    // finalize of driver initialization
    //

    Dll_Unload();       // released dlls loading during init

    if (! ok) {
        Log_Msg1(MSG_DRIVER_ENTRY_FAILED, Driver_Version);
        SbieDrv_DriverUnload(Driver_Object);
        return STATUS_UNSUCCESSFUL;
    }

    Driver_FullUnload = FALSE;

    Log_Msg1(MSG_DRIVER_ENTRY_OK, Driver_Version);

    return STATUS_SUCCESS;
}

本文标签: GitHubSandboxieWindows