SBIE DLL API
本页面描述了 SbieDll.dll 动态链接库(DLL)中可调用的入口点。这些入口点暴露了沙箱工具(Sandboxie)的一些功能,这些功能可以通过编程方式访问,即通过其他程序而非用户与沙箱工具进行交互来访问。
以编程方式使用沙箱工具涉及三个方面:
- 使用 Start.exe 程序驱动某些功能。请参阅 Start 命令行。
- 将自定义 DLL 注入到沙箱程序中。请参阅 InjectDll。
- 从正在运行的程序(无论是否在沙箱中)调用沙箱工具的入口点。本文将对此进行描述。
本文描述的入口点均由 SbieDll.dll 导出。要访问某个入口点,你应该将此 DLL 动态加载到你的程序中,并获取所需入口点的地址。例如:
__declspec(dllexport) void __stdcall InjectDllMain(HINSTANCE hSbieDll, ULONG_PTR UnusedParameter)
{
//
// 定位 SbieDll.dll 中 SbieDll_Hook 的地址
//
typedef void *(__stdcall *P_SbieDll_Hook)(
const char *ApiName, void *ApiFunc, void *NewFunc);
P_SbieDll_Hook p_SbieDll_Hook = GetProcAddress(hSbieDll, "SbieDll_Hook");
//
// 通过函数指针调用 SbieDll_Hook
//
p_SbieDll_Hook(...);
}
请注意使用 InjectDllMain(请参阅 注入 DLL)来获取已加载的 SbieDll 实例的句柄。这是推荐的方法。不过,使用 LoadLibrary 或 GetModuleHandle 按名称查找 SbieDll 也是可行的。
枚举沙箱名称
-
原型:
-
导出名称:
-
参数:
-
返回值:
-
示例代码:
WCHAR name[34];
int index = -1;
while (1) {
index = SbieApi_EnumBoxes(index, name);
if (index == -1)
break;
SandboxNames_StringArray.add(name);
}
按沙箱名称查询沙箱路径
-
原型:
-
导出名称:
-
参数:
box_name [in] 指定要返回路径信息的沙箱名称。 file_path [out] 接收沙箱根目录的路径,该路径由 FileRootPath 设置指定。 该缓冲区最多接收 file_path_len 参数指定的字节数。传入 NULL 以忽略此参数。 key_path [out] 接收沙箱注册表根键的路径,该路径由 KeyRootPath 设置指定。 该缓冲区最多接收 key_path_len 参数指定的字节数。传入 NULL 以忽略此参数。 ipc_path [out] 接收沙箱根对象目录的路径,该路径由 IpcRootPath 设置指定。 该缓冲区最多接收 ipc_path_len 参数指定的字节数。传入 NULL 以忽略此参数。 file_path_len [in/out] 指定 file_path 缓冲区的字节长度。返回时,接收完整缓冲区所需的字节长度。 key_path_len [in/out] 指定 key_path 缓冲区的字节长度。返回时,接收完整缓冲区所需的字节长度。 ipc_path_len [in/out] 指定 ipc_path 缓冲区的字节长度。返回时,接收完整缓冲区所需的字节长度。
-
返回值:
-
示例代码:
ULONG FileLen = 0; ULONG KeyLen = 0; ULONG IpcLen = 0; SbieApi_QueryBoxPath( NULL, NULL, NULL, NULL, &FileLen, &KeyLen, &IpcLen); // 注意,长度是以字节数返回的,而不是 WCHAR 字符数 WCHAR *FileBuf = malloc(FileLen); WCHAR *KeyBuf = malloc(KeyLen); WCHAR *IpcBuf = malloc(IpcLen); SbieApi_QueryBoxPath( FileBuf, KeyBuf, IpcBuf, &FileLen, &KeyLen, &IpcLen); // 现在使用 wcslen 来计算字符数 FileLen = wcslen(FileBuf); KeyLen = wcslen(KeyBuf); IpcLen = wcslen(IpcBuf);
按进程 ID 查询沙箱路径
-
原型:
-
导出名称:
-
参数:
process_id [in] 指定要查询的沙箱进程的 ID。 file_path [out] key_path [out] ipc_path [out] file_path_len [in/out] key_path_len [in/out] ipc_path_len [in/out] 最后六个参数与上面讨论的 QueryBoxPath 函数的最后六个参数类似。 然而,QueryProcessPath(此函数)返回正在运行的程序所使用的沙箱路径,而 QueryBoxPath 返回沙箱配置中记录的路径。 换句话说:假设一个沙箱程序以 PID 124 启动,然后某个沙箱路径(例如 FileRootPath)被设置为新值。 此时,QueryBoxPath 将返回新值,但 PID 124 的 QueryProcessPath 将返回旧值。
-
返回值:
枚举正在运行的进程
-
原型:
-
导出名称:
-
参数:
-
返回值:
查询进程信息
-
原型:
-
导出名称:
-
参数:
-
返回值:
终止单个沙箱进程
-
原型:
-
导出名称:
-
参数:
-
返回值:
终止所有沙箱进程
-
原型:
-
导出名称:
-
参数:
-
返回值:
从 Sandboxie.ini 查询配置
-
原型:
-
导出名称:
-
参数:
section_name [in] 指定包含要查询的设置的节名称。 setting_name [in] 指定要查询的设置名称。 setting_index [in] 指定可能多次出现的设置的从零开始的索引编号。该索引编号可以与以下特殊值进行逻辑或运算: 0x40000000 - 如果指定的设置名称未出现在指定节中,则不扫描 [GlobalSettings] 节。 0x20000000 - 不展开结果中的任何变量。 0x10000000 - 忽略源自模板(通常在 Templates.ini 文件中定义)的任何设置。仅查询明确出现在 Sandboxie.ini 文件中的设置。 value [out] 接收指定设置的值。 value_len [in] 指定 value 参数指向的缓冲区的最大字节长度。
-
返回值:
更新 Sandboxie.ini 中的配置
-
原型:
-
导出名称:
-
参数:
operation_code [in] 指定如何更新请求的设置: 's' 表示设置(覆盖),替换任何现有值 'a' 表示将新值追加到值列表的底部(如果还没有值,则简单设置新值) 'i' 表示将新值插入到值列表的顶部(如果还没有值,则简单设置新值) 'd' 表示删除值列表中的现有值 password [in] 指定如果需要则使用的密码,否则为 NULL 或空字符串。 section_name [in] 是一个必需参数,指定包含要设置的设置的节名称。 setting_name [in] 是一个必需参数,指定要设置的设置名称。 value [ini] 是一个可选参数,指定新值。 如果 operation_code 为's' 且省略了 value,则指定节中的相应设置将被删除。 如果 operation_code 为's' 且 setting_name 为 "*"(通配符星号)且省略了 value,则此函数将从配置文件中删除完整的节。
-
返回值:
从 Sandboxie.ini 重新加载配置
-
原型:
-
导出名称:
-
参数:
-
返回值:
挂钩用户模式入口点
-
原型:
-
导出名称:
-
参数:
-
返回值:
-
示例代码:
typedef BOOL (__stdcall *P_DeleteFileW)(const WCHAR *Path); P_DeleteFileW pDeleteFileW = NULL; BOOL __stdcall MyDeleteFileW(const WCHAR *Path) { if (Path[0] == L'C') { // 静默忽略删除 C 盘上任何文件的请求 SetLastError(0); return TRUE; } else { // 否则调用原始的 DeleteFileW 函数 return pDeleteFileW(Path); } } main() { pDeleteFileW = GetProcAddress(kernel32dll, "DeleteFileW"); pDeleteFileW = SbieDll_Hook("DeleteFile", pDeleteFileW, MyDeleteFileW); }
注册 DLL 加载/卸载回调
- 原型:
-
导出名称:
-
参数:
- 返回值:
获取 Sandboxie 主文件夹
-
原型:
-
导出名称:
-
参数:
-
返回值: