Build 0.8.0

This commit is contained in:
DavidXanatos 2021-06-13 18:11:04 +02:00
parent e08e9b0fd5
commit 9c6687183e
81 changed files with 12454 additions and 8851 deletions

View File

@ -4,17 +4,34 @@ This project adheres to [Semantic Versioning](http://semver.org/).
## [0.8.0 / 5.50.0] - 2021-06-13
### Added
- sandboxie by default applies "Close...=!<program>,..." directives to non excluded images if thay are located in a sandbox
-- added 'AlwaysCloseForBoxed=n' to disable this behavioure as it may not be always desired, and it doesn't provide extra security
- added process image informations to samdman UI
- localized template categories in the plus ui
- added "DisableResourceMonitor=y" to disable resource access monitor for selected boxes
- added option to show trace entries only for the sellected sandbox
- added "UseVolumeSerialNumbers=y" when set, in the \drive\ sandbox location the drive letters are sufixed with the volume SN
-- helps to avoid mengling of files on multiple pendrives usign the same letter
-- note: this option is not compatible with the recovery function of the classic UI, only SandMan ui is fully compatible
### Changed
- portable cleanup messge now has y/n/c options
- consolidated Proc_CreateProcessInternalW and Proc_CreateProcessInternalW_RS5 to remove duplicate code
- the ElevateCreateProcess fix as sometimes applyed by the PCA will no longer be emulated by default
-- use 'ApplyElevateCreateProcessFix=y' or 'ApplyElevateCreateProcessFix=program.exe,y' to enable it
- trace log gets only disabled when it has no entries and the logging is stopped
### Fixed
- fixed APC issue with the new global hook emulation mechanism and WoW64 processes
- fixed ipv6 issues with BlockPort options
- fixed an issue with cheet engine when "OpenWinClass=*" was specified
- fixed memory corruption in SbieDrv
- fixed crash issue with process elevation on Create Process Calls
- fixed pocess elevation when running in the built in administrator account
- fixed template preview reseting unsaved entries in box options window

View File

@ -489,6 +489,8 @@ int DoLingerLeader(void)
// is_local_system_sid would be TRUE and we would not
// reach this point.)
//
// fix-me: services are no longer startes by default as system
//
ULONG64 ProcessFlags =
SbieApi_QueryProcessInfo(pids_i, 0);

View File

@ -166,6 +166,16 @@ ALIGNED BOOL my_SetThreadToken(PHANDLE Thread, HANDLE Token)
if (Thread == NULL) {
//typedef BOOL(*P_OpenProcessToken)(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);
//typedef BOOL(*P_DuplicateToken)(HANDLE ExistingTokenHandle, SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, PHANDLE DuplicateTokenHandle);
//static P_OpenProcessToken _OpenProcessToken = NULL;
//static P_DuplicateToken _DuplicateToken = NULL;
//if (_OpenProcessToken == NULL || _DuplicateToken == NULL) {
// HMODULE advapi_dll = LoadLibrary(L"advapi32.dll");
// *(FARPROC*)&_OpenProcessToken = GetProcAddress(advapi_dll, "OpenProcessToken");
// *(FARPROC*)&_DuplicateToken = GetProcAddress(advapi_dll, "DuplicateToken");
//}
HANDLE PriToken;
ok = OpenProcessToken(
NtCurrentProcess(), TOKEN_ALL_ACCESS, &PriToken);

View File

@ -21,9 +21,9 @@
#ifndef _MY_VERSION_H
#define _MY_VERSION_H
#define MY_VERSION_BINARY 5,49,8
#define MY_VERSION_STRING "5.49.8"
#define MY_VERSION_COMPAT "5.49.0" // this refers to the driver ABI compatibility
#define MY_VERSION_BINARY 5,50,0
#define MY_VERSION_STRING "5.50.0"
#define MY_VERSION_COMPAT "5.50.0" // this refers to the driver ABI compatibility
// These #defines are used by either Resource Compiler, or by NSIC installer
#define SBIE_INSTALLER_PATH "..\\Bin\\"

View File

@ -71,13 +71,12 @@ struct _PATTERN {
// Functions
//---------------------------------------------------------------------------
static BOOLEAN Pattern_Match2(
static int Pattern_Match2(
PATTERN *pat,
const WCHAR *string, int string_len,
int str_index, int con_index);
static BOOLEAN Pattern_Match3(
static int Pattern_Match3(
PATTERN *pat,
const WCHAR *string, int string_len,
int str_index, int con_index);
@ -290,6 +289,20 @@ _FX const WCHAR *Pattern_Source(PATTERN *pat)
_FX BOOLEAN Pattern_Match(
PATTERN *pat, const WCHAR *string, int string_len)
{
if (Pattern_MatchX(pat, string, string_len) != 0)
return TRUE;
return FALSE;
}
//---------------------------------------------------------------------------
// Pattern_MatchX
//---------------------------------------------------------------------------
_FX int Pattern_MatchX(
PATTERN *pat, const WCHAR *string, int string_len)
{
//
// short-circuits: if string is NULL, or if the pattern is NULL,
@ -298,30 +311,30 @@ _FX BOOLEAN Pattern_Match(
//
if (! string)
return FALSE;
return 0;
if (pat->info.f.star_missing) {
if (pat->info.num_cons == 0)
return FALSE;
return 0;
if (string_len != pat->cons[0].len)
return FALSE;
return 0;
if (pat->info.f.have_a_qmark) {
const WCHAR *x = Pattern_wcsnstr(
string, pat->cons[0].ptr, pat->cons[0].len);
if (x != string)
return FALSE;
return 0;
} else {
ULONG x = wmemcmp(string, pat->cons[0].ptr, pat->cons[0].len);
if (x != 0)
return FALSE;
return 0;
}
return TRUE;
return string_len;
}
//
@ -337,12 +350,12 @@ _FX BOOLEAN Pattern_Match(
//---------------------------------------------------------------------------
_FX BOOLEAN Pattern_Match2(
_FX int Pattern_Match2(
PATTERN *pat,
const WCHAR *string, int string_len,
int str_index, int con_index)
{
BOOLEAN ok = TRUE;
int match;
if (con_index < pat->info.num_cons) {
@ -359,27 +372,27 @@ _FX BOOLEAN Pattern_Match2(
if (! ptr) {
if (pat->cons[con_index].hex) {
ok = Pattern_Match3(
match = Pattern_Match3(
pat, string, string_len, str_index, con_index);
} else
ok = FALSE;
match = 0;
break;
}
if (str_index == 0 && ptr > string &&
(! pat->info.f.star_at_head)) {
ok = FALSE;
match = 0;
break;
}
str_index = (ULONG)(ptr - string) + pat->cons[con_index].len;
ok = Pattern_Match2(
match = Pattern_Match2(
pat, string, string_len, str_index, con_index + 1);
if (ok)
if (match)
break;
}
} else if (ok) {
} else {
//
// if we think we have a match, just make sure there aren't
@ -387,10 +400,12 @@ _FX BOOLEAN Pattern_Match2(
//
if (str_index != string_len && (! pat->info.f.star_at_tail))
ok = FALSE;
match = 0;
else
match = str_index;
}
return ok;
return match;
}
@ -399,7 +414,7 @@ _FX BOOLEAN Pattern_Match2(
//---------------------------------------------------------------------------
_FX BOOLEAN Pattern_Match3(
_FX int Pattern_Match3(
PATTERN *pat,
const WCHAR *string, int string_len,
int str_index, int con_index)
@ -418,7 +433,7 @@ _FX BOOLEAN Pattern_Match3(
conptr = pat->cons[con_index].ptr;
seqptr = Pattern_wcsnstr(conptr, Pattern_Hex, 5);
if (! seqptr)
return FALSE;
return 0;
restart1:
@ -426,9 +441,9 @@ restart1:
if (con_len) {
if (string_len - str_index < con_len)
return FALSE;
return 0;
if (Pattern_wcsnstr(srcptr, conptr, con_len) != srcptr)
return FALSE;
return 0;
srcptr += con_len;
}
@ -452,10 +467,10 @@ restart1:
}
if (*seqptr != L'_')
return FALSE;
return 0;
++seqptr;
if (*seqptr != L'_')
return FALSE;
return 0;
++seqptr;
//
@ -492,7 +507,7 @@ restart2:
}
}
return FALSE;
return 0;
}
//
@ -517,7 +532,7 @@ restart2:
if (con_len) {
if (Pattern_wcsnstr(srcptr, seqptr, con_len) != srcptr)
return FALSE;
return 0;
}
str_index = (int)(ULONG_PTR)(srcptr + con_len - string);

View File

@ -71,7 +71,7 @@ const WCHAR *Pattern_Source(PATTERN *pat);
//
BOOLEAN Pattern_Match(PATTERN *pat, const WCHAR *string, int string_len);
int Pattern_MatchX(PATTERN *pat, const WCHAR *string, int string_len);
//---------------------------------------------------------------------------

View File

@ -95,6 +95,7 @@
<CompileAs>Default</CompileAs>
<OmitFramePointers />
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<TreatWarningAsError>false</TreatWarningAsError>
</ClCompile>
<Link>
<AdditionalDependencies>ntdll.lib;uuid.lib;kernel32.lib</AdditionalDependencies>
@ -115,6 +116,7 @@
<RuntimeTypeInfo>false</RuntimeTypeInfo>
<CompileAs>Default</CompileAs>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<TreatWarningAsError>false</TreatWarningAsError>
</ClCompile>
<Link>
<AdditionalDependencies>ntdll.lib;uuid.lib;kernel32.lib</AdditionalDependencies>

View File

@ -8,13 +8,10 @@ EXPORTS
Dll_Ordinal1 @1 NONAME
;;;
;;; SbieApi
;;; SbieApiSbieApi_LogEx
;;;
SbieApi_CallZero=_SbieApi_CallZero@4
SbieApi_CallOne=_SbieApi_CallOne@8
SbieApi_CallTwo=_SbieApi_CallTwo@12
SbieApi_CheckInternetAccess=_SbieApi_CheckInternetAccess@12
SbieApi_DisableForceProcess=_SbieApi_DisableForceProcess@8

View File

@ -493,6 +493,9 @@ void Sxs_ActivateDefaultManifest(void *ImageBase);
ULONG Sxs_CheckManifestForCreateProcess(const WCHAR *DosPath);
ULONG Sxs_CheckManifestForElevation(const WCHAR* DosPath,
BOOLEAN* pAsInvoker, BOOLEAN* pRequireAdministrator, BOOLEAN* pHighestAvailable);
BOOLEAN Sxs_KeyCallback(const WCHAR *path, HANDLE *out_handle);
BOOLEAN Sxs_FileCallback(const WCHAR *path, HANDLE *out_handle);

View File

@ -664,6 +664,8 @@ _FX void Dll_SelectImageType(void)
if (Dll_ImageType == DLL_IMAGE_LAST)
Dll_ImageType = DLL_IMAGE_UNSPECIFIED;
SbieApi_QueryProcessInfoEx(0, 'spit', Dll_ImageType);
//
// we have some special cases for programs running under a restricted
// token, such as a Chromium sandbox processes, or Microsoft Office 2010
@ -780,7 +782,21 @@ _FX ULONG_PTR Dll_Ordinal1(
// see also Proc_RestartProcessOutOfPcaJob
//
if (Dll_ProcessFlags & SBIE_FLAG_PROCESS_IN_PCA_JOB) {
int MustRestartProcess = 0;
if(Dll_ProcessFlags & SBIE_FLAG_PROCESS_IN_PCA_JOB)
MustRestartProcess = 1;
else if (Dll_ProcessFlags & SBIE_FLAG_FORCED_PROCESS) {
if (SbieApi_QueryConfBool(NULL, L"ForceRestartAll", FALSE)
|| SbieDll_CheckStringInList(Dll_ImageName, NULL, L"ForceRestart"))
MustRestartProcess = 2;
}
if (MustRestartProcess) {
WCHAR text[128];
Sbie_snwprintf(text, 128, L"Cleanly restarting forced process, reason %d", MustRestartProcess);
SbieApi_MonitorPut(MONITOR_OTHER, text);
extern void Proc_RestartProcessOutOfPcaJob(void);
Proc_RestartProcessOutOfPcaJob();

View File

@ -461,7 +461,7 @@ _FX void Dll_RefreshPathList(void)
EnterCriticalSection(&Dll_FilePathListCritSec);
if (SbieApi_CallZero(API_REFRESH_FILE_PATH_LIST) == STATUS_SUCCESS) {
if (SbieApi_Call(API_REFRESH_FILE_PATH_LIST, 0) == STATUS_SUCCESS) {
LIST open_paths, closed_paths, write_paths;

View File

@ -354,6 +354,8 @@ static ULONG File_PublicUserLen = 0;
static WCHAR *File_HomeNtPath = NULL;
static ULONG File_HomeNtPathLen = 0;
static BOOLEAN File_DriveAddSN = FALSE;
static BOOLEAN File_Windows2000 = FALSE;
static WCHAR *File_AltBoxPath = NULL;
@ -819,8 +821,17 @@ check_sandbox_prefix:
return STATUS_BAD_INITIAL_PC;
}
ULONG len = _DriveLen + 1; /* drive letter */
// skip any sufix after the drive letter
if (File_DriveAddSN) {
WCHAR* ptr = wcschr(*OutTruePath + _DriveLen + 1, L'\\');
if (ptr)
len = (ULONG)(ptr - *OutTruePath);
}
File_GetName_FixTruePrefix(TlsData,
OutTruePath, &length, _DriveLen + 1 /* drive letter */,
OutTruePath, &length, len,
drive->path, drive->len);
convert_links_again = TRUE;
@ -1160,6 +1171,15 @@ check_sandbox_prefix:
name += _DriveLen;
*name = drive_letter;
++name;
if (File_DriveAddSN && *drive->sn)
{
*name = L'~';
++name;
wcscpy(name, drive->sn);
name += 9;
}
*name = L'\0';
if (length == drive_len) {

View File

@ -3536,7 +3536,13 @@ _FX void File_DoAutoRecover_2(BOOLEAN force, ULONG ticks)
if (send2199) {
WCHAR *colon = wcschr(rec->path, L':');
if (!colon) {
const WCHAR* strings[] = { Dll_BoxName, rec->path, NULL };
UNICODE_STRING uni;
WCHAR *TruePath, *CopyPath;
RtlInitUnicodeString(&uni, rec->path);
status = File_GetName(NULL, &uni, &TruePath, &CopyPath, NULL);
const WCHAR* strings[] = { Dll_BoxName, rec->path, CopyPath, NULL };
SbieApi_LogMsgExt(2199, strings);
}
List_Remove(&File_RecPaths, rec);

View File

@ -142,6 +142,8 @@ _FX BOOLEAN File_Init(void)
File_InitPathList();
File_DriveAddSN = SbieApi_QueryConfBool(NULL, L"UseVolumeSerialNumbers", FALSE);
if (! File_InitDrives(0xFFFFFFFF))
return FALSE;
@ -310,6 +312,62 @@ _FX void File_InitPathList(void)
}
//---------------------------------------------------------------------------
// File_GetVolumeSN
//---------------------------------------------------------------------------
typedef struct _FILE_FS_VOLUME_INFORMATION {
LARGE_INTEGER VolumeCreationTime;
ULONG VolumeSerialNumber;
ULONG VolumeLabelLength;
BOOLEAN SupportsObjects;
WCHAR VolumeLabel[1];
} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
_FX ULONG File_GetVolumeSN(const FILE_DRIVE *drive)
{
ULONG sn = 0;
HANDLE handle;
IO_STATUS_BLOCK iosb;
UNICODE_STRING objname;
objname.Buffer = Dll_Alloc((drive->len + 4) * sizeof(WCHAR));
wmemcpy(objname.Buffer, drive->path, drive->len);
objname.Buffer[drive->len ] = L'\\';
objname.Buffer[drive->len + 1] = L'\0';
objname.Length = (USHORT)(drive->len + 1) * sizeof(WCHAR);
objname.MaximumLength = objname.Length + sizeof(WCHAR);
OBJECT_ATTRIBUTES objattrs;
InitializeObjectAttributes(
&objattrs, &objname, OBJ_CASE_INSENSITIVE, NULL, NULL);
NTSTATUS status = NtCreateFile(
&handle, GENERIC_READ | SYNCHRONIZE, &objattrs,
&iosb, NULL, 0, FILE_SHARE_VALID_FLAGS,
FILE_OPEN,
FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
NULL, 0);
Dll_Free(objname.Buffer);
if (NT_SUCCESS(status))
{
union {
FILE_FS_VOLUME_INFORMATION volumeInfo;
BYTE volumeInfoBuff[64];
} u;
if (NT_SUCCESS(NtQueryVolumeInformationFile(handle, &iosb, &u.volumeInfo, sizeof(u), FileFsVolumeInformation)))
sn = u.volumeInfo.VolumeSerialNumber;
NtClose(handle);
}
return sn;
}
//---------------------------------------------------------------------------
// File_InitDrives
//---------------------------------------------------------------------------
@ -559,6 +617,12 @@ _FX BOOLEAN File_InitDrives(ULONG DriveMask)
file_drive->subst = subst;
file_drive->len = path_len;
wcscpy(file_drive->path, path);
*file_drive->sn = 0;
if (File_DriveAddSN) {
ULONG sn = File_GetVolumeSN(file_drive);
if(sn != 0)
Sbie_snwprintf(file_drive->sn, 10, L"%04X-%04X", HIWORD(sn), LOWORD(sn));
}
File_Drives[drive] = file_drive;

View File

@ -28,6 +28,7 @@
struct _FILE_DRIVE {
WCHAR letter;
WCHAR sn[10];
BOOLEAN subst;
ULONG len; // in characters, excluding NULL
WCHAR path[0];

View File

@ -1232,14 +1232,14 @@ _FX HWND Gui_CreateWindowExW(
//
// under Sandboxie 4 the Chrome sandbox child process gets confused
// (reason not known) and creates some top level windows, for which it
// does not process messages. This causes DDE message broadcast to
// hang for several seconds. To workaround this, we cause the windows
// does not process messages. this causes DDE message broadcast to
// hang for several seconds. to workaround this, we cause the windows
// to be created as message-only windows
//
// note: the desktop window was made accessible in early v4 builds
// but this code is still here to handle any other parent windows
//
// note: this code breaks Chrome hw acceleration, so it's no longer used
// note: this code breaks chrome hw acceleration, so its no longer used
//
/*if (Dll_ChromeSandbox) {
@ -1310,7 +1310,7 @@ _FX HWND Gui_CreateWindowExW(
// replace window procedure
//
if (hwndResult) {
if (hwndResult && !Gui_RenameClasses) {
Gui_SetWindowProc(hwndResult, FALSE);
@ -1418,7 +1418,7 @@ _FX HWND Gui_CreateWindowExA(
// replace window procedure
//
if (hwndResult) {
if (hwndResult && !Gui_RenameClasses) {
Gui_SetWindowProc(hwndResult, FALSE);

View File

@ -255,7 +255,7 @@ _FX ULONG SbieDll_InjectLow_InitSyscalls(BOOLEAN drv_init)
// Get a full sys call list from the driver
//
status = SbieApi_CallOne(API_QUERY_SYSCALLS, (ULONG_PTR)syscall_data);
status = SbieApi_Call(API_QUERY_SYSCALLS, 1, (ULONG_PTR)syscall_data);
if (status != 0)
return status;

View File

@ -116,6 +116,7 @@ _FX BOOLEAN HNet_Init(HMODULE module)
#define WSA_IO_PENDING (ERROR_IO_PENDING)
#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
#define AF_INET6 10 /* internetwork v6: UDP, TCP, etc. */
#define SOCKET ULONG_PTR
@ -224,7 +225,7 @@ _FX int WSA_WSANSPIoctl(
_FX int WSA_IsBlockedPort(const short *addr, int addrlen)
{
if (addrlen >= sizeof(USHORT) * 2 && addr && addr[0] == AF_INET) {
if (addrlen >= sizeof(USHORT) * 2 && addr && (addr[0] == AF_INET || addr[0] == AF_INET6)) {
USHORT portnum = ((addr[1] & 0xFF) << 8) | ((addr[1] & 0xFF00) >> 8);
ULONG index = portnum / 512;

File diff suppressed because it is too large Load Diff

View File

@ -138,84 +138,27 @@ _FX NTSTATUS SbieApi_Ioctl(ULONG64 *parms)
//---------------------------------------------------------------------------
// SbieApi_CallZero
// SbieApi_CallFunc
//---------------------------------------------------------------------------
_FX LONG SbieApi_CallZero(ULONG api_code)
_FX LONG SbieApi_Call(ULONG api_code, LONG arg_num, ...)
{
va_list valist;
NTSTATUS status;
__declspec(align(8)) ULONG64 parms[API_NUM_ARGS];
memzero(parms, sizeof(parms));
parms[0] = api_code;
status = SbieApi_Ioctl(parms);
if (NT_SUCCESS(status)) {
if (api_code == API_UNLOAD_DRIVER) {
NtClose(SbieApi_DeviceHandle);
SbieApi_DeviceHandle = INVALID_HANDLE_VALUE;
}
}
if (arg_num >= (API_NUM_ARGS - 1))
return STATUS_INVALID_PARAMETER;
return status;
}
va_start(valist, arg_num);
for (LONG i = 1; i <= arg_num; i++)
parms[i] = (ULONG64)va_arg(valist, ULONG_PTR);
va_end(valist);
//---------------------------------------------------------------------------
// SbieApi_CallOne
//---------------------------------------------------------------------------
_FX LONG SbieApi_CallOne(ULONG api_code, ULONG_PTR arg)
{
NTSTATUS status;
__declspec(align(8)) ULONG64 parms[API_NUM_ARGS];
memzero(parms, sizeof(parms));
parms[0] = api_code;
parms[1] = (ULONG64)arg;
status = SbieApi_Ioctl(parms);
return status;
}
//---------------------------------------------------------------------------
// SbieApi_CallTwo
//---------------------------------------------------------------------------
_FX LONG SbieApi_CallTwo(ULONG api_code, ULONG_PTR arg1, ULONG_PTR arg2)
{
NTSTATUS status;
__declspec(align(8)) ULONG64 parms[API_NUM_ARGS];
memzero(parms, sizeof(parms));
parms[0] = api_code;
parms[1] = (ULONG64)arg1;
parms[2] = (ULONG64)arg2;
status = SbieApi_Ioctl(parms);
return status;
}
//---------------------------------------------------------------------------
// SbieApi_CallThree
//---------------------------------------------------------------------------
_FX LONG SbieApi_CallThree(ULONG api_code, ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3)
{
NTSTATUS status;
__declspec(align(8)) ULONG64 parms[API_NUM_ARGS];
memzero(parms, sizeof(parms));
parms[0] = api_code;
parms[1] = (ULONG64)arg1;
parms[2] = (ULONG64)arg2;
parms[3] = (ULONG64)arg3;
status = SbieApi_Ioctl(parms);
return status;

View File

@ -49,16 +49,7 @@ extern "C" {
SBIEAPI_EXPORT
LONG SbieApi_CallZero(ULONG api_code);
SBIEAPI_EXPORT
LONG SbieApi_CallOne(ULONG api_code, ULONG_PTR arg);
SBIEAPI_EXPORT
LONG SbieApi_CallTwo(ULONG api_code, ULONG_PTR arg1, ULONG_PTR arg2);
SBIEAPI_EXPORT
LONG SbieApi_CallThree(ULONG api_code, ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3);
LONG SbieApi_Call(ULONG api_code, LONG arg_num, ...);
SBIEAPI_EXPORT LONG SbieApi_GetVersion(
WCHAR *version_string); // WCHAR [16]

View File

@ -96,6 +96,7 @@ static NTSTATUS Secure_RtlCheckTokenMembershipEx(
static BOOLEAN Secure_IsSameBox(HANDLE idProcess);
static BOOLEAN Secure_IsBuiltInAdmin();
//---------------------------------------------------------------------------
@ -281,9 +282,10 @@ _FX BOOLEAN Secure_Init(void)
//
// install hooks to fake administrator privileges
// note: when running as the built in administrator we should always act as if we have admin rights
//
Secure_FakeAdmin = Config_GetSettingsForImageName_bool(L"FakeAdminRights", FALSE);
Secure_FakeAdmin = Config_GetSettingsForImageName_bool(L"FakeAdminRights", Secure_IsBuiltInAdmin());
RtlQueryElevationFlags =
GetProcAddress(Dll_Ntdll, "RtlQueryElevationFlags");
@ -1181,6 +1183,22 @@ _FX BOOLEAN Secure_IsSameBox(HANDLE idProcess)
}
//---------------------------------------------------------------------------
// Secure_IsBuiltInAdmin
//---------------------------------------------------------------------------
_FX BOOLEAN Secure_IsBuiltInAdmin()
{
// Check if this is the built in administrator account its SID is always: S-1-5-21-domain-500
if (_wcsnicmp(Dll_SidString, L"S-1-5-21-", 9) != 0)
return FALSE;
if (Dll_SidStringLen < 4 || _wcsnicmp(Dll_SidString + Dll_SidStringLen - 4, L"-500", 4) != 0)
return FALSE;
return TRUE;
}
//---------------------------------------------------------------------------
//
// Support for UAC Elevation

View File

@ -779,6 +779,9 @@ _FX BOOL SH32_DoRunAs(
// remove any quotes around the program name.
//
if (CmdLine == NULL)
return FALSE;
if (CmdLine[0] == L'\"') {
++CmdLine;
arg = wcschr(CmdLine, L'\"');

View File

@ -1862,6 +1862,64 @@ _FX void Sxs_ActivateDefaultManifest(void *ImageBase)
}
//---------------------------------------------------------------------------
// Sxs_CheckManifestForElevation
//---------------------------------------------------------------------------
_FX ULONG Sxs_CheckManifestForElevation(
const WCHAR* DosPath,
BOOLEAN *pAsInvoker,
BOOLEAN *pRequireAdministrator,
BOOLEAN *pHighestAvailable)
{
ACTCTX ActCtx;
SXS_ARGS args;
ULONG rc;
if (Dll_OsBuild < 6000)
return STATUS_NOT_IMPLEMENTED;
//
// invoke Sxs_GetPathAndText to get the manifest text
//
memzero(&args, sizeof(args));
if (! Sxs_AllocOrFreeBuffers(&args, TRUE))
return STATUS_INSUFFICIENT_RESOURCES;
memzero(&ActCtx, sizeof(ACTCTX));
ActCtx.cbSize = sizeof(ACTCTX);
ActCtx.lpSource = DosPath;
rc = STATUS_UNSUCCESSFUL;
if (Sxs_GetPathAndText(&ActCtx, &args)) {
rc = STATUS_SUCCESS; // manifest found
_strlwr(args.ManifestText);
if (strstr(args.ManifestText, "level='asinvoker'")
|| strstr(args.ManifestText, "level=\"asinvoker\""))
if (pAsInvoker) *pAsInvoker = TRUE;
if (strstr(args.ManifestText, "level='requireadministrator'")
|| strstr(args.ManifestText, "level=\"requireadministrator\""))
if (pRequireAdministrator) *pRequireAdministrator = TRUE;
if (strstr(args.ManifestText, "level='highestavailable'")
|| strstr(args.ManifestText, "level=\"highestavailable\""))
if (pHighestAvailable) *pHighestAvailable = TRUE;
}
Sxs_AllocOrFreeBuffers(&args, FALSE);
return rc;
}
//---------------------------------------------------------------------------
// Sxs_CheckManifestForCreateProcess
//---------------------------------------------------------------------------
@ -1870,9 +1928,8 @@ _FX void Sxs_ActivateDefaultManifest(void *ImageBase)
_FX ULONG Sxs_CheckManifestForCreateProcess(const WCHAR *DosPath)
{
THREAD_DATA *TlsData = Dll_GetTlsData(NULL);
ACTCTX ActCtx;
SXS_ARGS args;
ULONG rc, ElvType;
BOOLEAN AsInvoker, RequireAdministrator, HighestAvailable;
//
// Windows Vista UAC auto-elevates program names that includes words
@ -1905,24 +1962,9 @@ _FX ULONG Sxs_CheckManifestForCreateProcess(const WCHAR *DosPath)
return 0;
}
//
// invoke Sxs_GetPathAndText to get the manifest text
//
rc = Sxs_CheckManifestForElevation(DosPath, &AsInvoker, &RequireAdministrator, &HighestAvailable);
memzero(&args, sizeof(args));
if (! Sxs_AllocOrFreeBuffers(&args, TRUE))
return STATUS_INSUFFICIENT_RESOURCES;
memzero(&ActCtx, sizeof(ACTCTX));
ActCtx.cbSize = sizeof(ACTCTX);
ActCtx.lpSource = DosPath;
rc = 0;
if (Sxs_GetPathAndText(&ActCtx, &args)) {
UCHAR *RequireAdministrator, *HighestAvailable;
if (NT_SUCCESS(rc)) {
//
// asInvoker means to use alternate manifest files in
@ -1932,16 +1974,9 @@ _FX ULONG Sxs_CheckManifestForCreateProcess(const WCHAR *DosPath)
// our Proc_CreateProcess caller to use SH32_DoRunAs
//
_strlwr(args.ManifestText);
if (strstr(args.ManifestText, "level=\"asinvoker\""))
if (AsInvoker)
TlsData->proc_create_process_as_invoker = TRUE;
RequireAdministrator =
strstr(args.ManifestText, "level=\"requireadministrator\"");
HighestAvailable =
strstr(args.ManifestText, "level=\"highestavailable\"");
if (RequireAdministrator ||
(HighestAvailable && ElvType != TokenElevationTypeDefault)) {
@ -1961,8 +1996,6 @@ _FX ULONG Sxs_CheckManifestForCreateProcess(const WCHAR *DosPath)
}
}
Sxs_AllocOrFreeBuffers(&args, FALSE);
return rc;
}

View File

@ -230,9 +230,9 @@ API_ARGS_CLOSE(API_QUERY_PROCESS_ARGS)
API_ARGS_BEGIN(API_QUERY_PROCESS_INFO_ARGS)
API_ARGS_FIELD(HANDLE,process_id)
API_ARGS_FIELD(ULONG,info_type)
API_ARGS_FIELD(ULONG64 *,info_data)
API_ARGS_FIELD(ULONG64, ext_data)
API_ARGS_FIELD(ULONG,info_type) // in
API_ARGS_FIELD(ULONG64 *,info_data) // out
API_ARGS_FIELD(ULONG64, ext_data) // opt in
API_ARGS_CLOSE(API_QUERY_PROCESS_INFO_ARGS)

View File

@ -1340,13 +1340,33 @@ _FX NTSTATUS Conf_Api_Query(PROCESS *proc, ULONG64 *parms)
if (proc)
value2 = Conf_Expand(proc->box->expand_args, value1, setting);
else {
BOX *box = Box_Create(Driver_Pool, boxname, FALSE);
if (! box) {
CONF_EXPAND_ARGS *expand_args = Mem_Alloc(Driver_Pool, sizeof(CONF_EXPAND_ARGS));
if (! expand_args) {
status = STATUS_UNSUCCESSFUL;
goto release_and_return;
}
value2 = Conf_Expand(box->expand_args, value1, setting);
Box_Free(box);
expand_args->pool = Driver_Pool;
expand_args->sandbox = boxname;
UNICODE_STRING SidString;
ULONG SessionId;
status = Process_GetSidStringAndSessionId(NtCurrentProcess(), NULL, &SidString, &SessionId);
if (!NT_SUCCESS(status)) {
Mem_Free(expand_args, sizeof(CONF_EXPAND_ARGS));
status = STATUS_UNSUCCESSFUL;
goto release_and_return;
}
expand_args->sid = SidString.Buffer;
expand_args->session = &SessionId;
value2 = Conf_Expand(expand_args, value1, setting);
RtlFreeUnicodeString(&SidString);
Mem_Free(expand_args, sizeof(CONF_EXPAND_ARGS));
}
if (! value2) {

View File

@ -868,6 +868,14 @@ _FX BOOLEAN File_BlockInternetAccess2(
_FX BOOLEAN File_InitProcess(PROCESS *proc)
{
//
// by default Close[...]=!<program>,path includes all boxed images
// use AlwaysCloseInBox=n to disable this behavioure
//
proc->always_close_for_boxed = Conf_Get_Boolean(proc->box->name, L"AlwaysCloseForBoxed", 0, TRUE);
BOOLEAN ok = File_InitPaths(proc, &proc->open_file_paths,
&proc->closed_file_paths,
&proc->read_file_paths,
@ -1002,7 +1010,7 @@ _FX NTSTATUS File_Generic_MyParseProc(
if (proc->file_trace & TRACE_IGNORE)
Log_Debug_Msg(MONITOR_IGNORE, ignore_str, Driver_Empty);
else if (Session_MonitorCount &&
else if (Session_MonitorCount && !proc->disable_monitor &&
device_type != FILE_DEVICE_PHYSICAL_NETCARD)
Session_MonitorPut(MONITOR_IGNORE, ignore_str + 4, proc->pid);
@ -1518,7 +1526,7 @@ skip_due_to_home_folder:
}
}
else if (IsPipeDevice && Session_MonitorCount) {
else if (IsPipeDevice && Session_MonitorCount && !proc->disable_monitor) {
ULONG mon_type = MONITOR_PIPE;
WCHAR *mon_name = Name->Name.Buffer;
@ -1532,7 +1540,7 @@ skip_due_to_home_folder:
mon_type |= MONITOR_DENY;
Session_MonitorPut(mon_type, mon_name, proc->pid);
} else if (ShouldMonitorAccess) {
} else if (ShouldMonitorAccess && Session_MonitorCount && !proc->disable_monitor) {
Session_MonitorPut(MONITOR_FILE | MONITOR_DENY, Name->Name.Buffer, proc->pid);
@ -2253,7 +2261,7 @@ _FX NTSTATUS File_Api_Open(PROCESS *proc, ULONG64 *parms)
Log_Debug_Msg(mon_type, access_str, path);
}
}
else if (is_closed) {
else if (is_closed && Session_MonitorCount && !proc->disable_monitor) {
Session_MonitorPut(MONITOR_FILE | MONITOR_DENY, path, proc->pid);
}

View File

@ -1316,7 +1316,7 @@ _FX ULONG_PTR Gui_NtUserPostThreadMessage(
proc, &proc->open_win_classes, idProcess, NULL);
}
if (Session_MonitorCount) {
if (Session_MonitorCount && !proc->disable_monitor) {
void *nbuf;
ULONG nlen;

View File

@ -947,7 +947,7 @@ _FX NTSTATUS Ipc_CheckGenericObject(
}
}
else if (Session_MonitorCount) {
else if (Session_MonitorCount && !proc->disable_monitor) {
ULONG mon_type = MONITOR_IPC;
WCHAR *mon_name = Name->Buffer;

View File

@ -72,8 +72,6 @@ struct _KEY_MOUNT {
//---------------------------------------------------------------------------
static BOOLEAN Key_InitPaths(PROCESS *proc);
static NTSTATUS Key_MyParseProc_2(OBJ_PARSE_PROC_ARGS_2);
static BOOLEAN Key_MountHive2(PROCESS *proc, KEY_MOUNT *mount);
@ -480,7 +478,7 @@ _FX NTSTATUS Key_MyParseProc_2(OBJ_PARSE_PROC_ARGS_2)
}
}
else if (ShouldMonitorAccess) {
else if (ShouldMonitorAccess && Session_MonitorCount && !proc->disable_monitor) {
Session_MonitorPut(MONITOR_KEY | MONITOR_DENY, Name->Name.Buffer, proc->pid);
}

View File

@ -606,6 +606,8 @@ _FX PROCESS *Process_Create(
proc->integrity_level = tzuk; // default to no integrity level
proc->detected_image_type = -1; // indicate non initialized
//
// initialize image name from image path
//
@ -691,6 +693,8 @@ _FX PROCESS *Process_Create(
return NULL;
}
proc->disable_monitor = Conf_Get_Boolean(proc->box->name, L"DisableResourceMonitor", 0, FALSE);
//
// initialize trace flags
//

View File

@ -85,6 +85,8 @@ struct _PROCESS {
ULONG ntdll32_base;
ULONG detected_image_type;
// original process primary access token
void *primary_token;
@ -121,6 +123,8 @@ struct _PROCESS {
UCHAR create_console_flag;
BOOLEAN disable_monitor;
ULONG call_trace;
// file-related
@ -130,6 +134,7 @@ struct _PROCESS {
LIST closed_file_paths; // PATTERN elements
LIST read_file_paths; // PATTERN elements
LIST write_file_paths; // PATTERN elements
BOOLEAN always_close_for_boxed;
LIST blocked_dlls;
ULONG file_trace;
ULONG pipe_trace;

View File

@ -426,6 +426,18 @@ _FX NTSTATUS Process_Api_QueryInfo(PROCESS *proc, ULONG64 *parms)
ObDereferenceObject(object);
}
} else if (args->info_type.val == 'spit') { // set process image type
if (ProcessId != 0)
status = STATUS_ACCESS_DENIED;
proc->detected_image_type = (ULONG)(args->ext_data.val);
*data = 0;
} else if (args->info_type.val == 'gpit') { // get process image type
*data = proc->detected_image_type;
} else
status = STATUS_INVALID_INFO_CLASS;
@ -637,8 +649,8 @@ _FX NTSTATUS Process_Api_QueryPathList(PROCESS *proc, ULONG64 *parms)
} else {
if (! MyIsCurrentProcessRunningAsLocalSystem())
return STATUS_NOT_IMPLEMENTED;
//if (! MyIsCurrentProcessRunningAsLocalSystem())
// return STATUS_NOT_IMPLEMENTED;
proc = Process_Find(args->process_id.val, &irql);

View File

@ -350,10 +350,12 @@ _FX BOOLEAN Process_GetPaths(
if (closed && (*value == L'!')) {
// dont close paths for sbie components
if (closed_ipc && proc->image_sbie)
continue;
continue;
if (proc->image_from_box) {
// for all other advance to the path and apply the block for all sandboxed images
if (proc->image_from_box && proc->always_close_for_boxed) {
value = wcschr(value, L',');
if (! value)

View File

@ -756,7 +756,7 @@ _FX NTSTATUS Session_Api_MonitorPut2(PROCESS *proc, ULONG64 *parms)
if (! proc)
return STATUS_NOT_IMPLEMENTED;
if (! Session_MonitorCount)
if (! Session_MonitorCount || proc->disable_monitor)
return STATUS_SUCCESS;
log_type = args->log_type.val;

View File

@ -1033,7 +1033,7 @@ _FX NTSTATUS Thread_CheckObject_Common(
// log the cross-sandbox access attempt, based on the status code
//
if (Session_MonitorCount) {
if (Session_MonitorCount && !proc->disable_monitor) {
void *nbuf;
ULONG nlen;

View File

@ -107,7 +107,7 @@ void DriverAssist::InjectLow(void *_msg)
// notify driver that we successfully injected the lowlevel code
//
if (SbieApi_CallOne(API_INJECT_COMPLETE, msg->process_id) == 0)
if (SbieApi_Call(API_INJECT_COMPLETE, 1, msg->process_id) == 0)
errlvl = 0;
else
errlvl = 0x99;

View File

@ -150,8 +150,7 @@ driver_started:
//
if (ok) {
rc = SbieApi_CallOne(
API_SET_SERVICE_PORT, (ULONG_PTR)m_instance->m_PortHandle);
rc = SbieApi_Call(API_SET_SERVICE_PORT, 1, (ULONG_PTR)m_instance->m_PortHandle);
if (rc != 0) {
LogEvent(MSG_9234, 0x9361, rc);
ok = false;
@ -173,7 +172,7 @@ driver_started:
InitClipboard();
}
rc = SbieApi_CallZero(API_INIT_GUI);
rc = SbieApi_Call(API_INIT_GUI, 0);
if (rc != 0) {
LogEvent(MSG_9234, 0x9156, rc);
@ -205,7 +204,7 @@ driver_started:
LsaHandle, &AuthPkgName, &AuthPkgNum);
if (rc == 0)
SbieApi_CallOne(API_SET_LSA_AUTH_PKG, AuthPkgNum);
SbieApi_Call(API_SET_LSA_AUTH_PKG, 1, AuthPkgNum);
LsaDeregisterLogonProcess(LsaHandle);
}
@ -286,7 +285,7 @@ void DriverAssist::InitClipboard()
SetClipboardData(0x333333, hGlobal2);
SetClipboardData(0x444444, hGlobal2);
SbieApi_CallOne(API_GUI_CLIPBOARD, -1);
SbieApi_Call(API_GUI_CLIPBOARD, 1, -1);
EmptyClipboard();
CloseClipboard();

View File

@ -173,8 +173,8 @@ MSG_HEADER *EpMapperServer::EpmapperGetPortNameHandler(MSG_HEADER *msg)
{
// Param 1 is the service PID
// Param 2 will return the port name with "\RPC Control\" prepended
rpl->h.status = SbieApi_CallTwo(
API_GET_DYNAMIC_PORT_FROM_PID,
rpl->h.status = SbieApi_Call(
API_GET_DYNAMIC_PORT_FROM_PID, 2,
(ULONG_PTR)hPid,
(ULONG_PTR)rpl->wszPortName);
}
@ -227,7 +227,7 @@ MSG_HEADER *EpMapperServer::EpmapperGetPortNameHandler(MSG_HEADER *msg)
// Param 1 is dynamic port name (e.g. "LRPC-f760d5b40689a98168"), WCHAR[DYNAMIC_PORT_NAME_CHARS]
// Param 2 is the process PID for which to open the port, can be 0 when port is special
// Param 3 is the port type/identifier
rpl->h.status = SbieApi_CallThree(API_OPEN_DYNAMIC_PORT,
rpl->h.status = SbieApi_Call(API_OPEN_DYNAMIC_PORT, 3,
(ULONG_PTR)rpl->wszPortName,
(ULONG_PTR)0,
(ULONG_PTR)req->wszPortId);

View File

@ -69,6 +69,9 @@ typedef struct _WND_HOOK {
LIST_ELEM list_elem;
ULONG pid;
#ifdef _WIN64
bool isWoW64;
#endif _WIN64
DWORD hthread;
ULONG64 hproc;
int HookCount;
@ -2364,7 +2367,7 @@ ULONG GuiServer::CloseClipboardSlave(SlaveArgs *args)
ULONG fmt = 0;
while (1) {
status = SbieApi_CallOne(API_GUI_CLIPBOARD, 0x4000);
status = SbieApi_Call(API_GUI_CLIPBOARD, 1, 0x4000);
if (status != 0)
break;
fmt = EnumClipboardFormats(fmt);
@ -2390,8 +2393,7 @@ ULONG GuiServer::CloseClipboardSlave(SlaveArgs *args)
// always fails. so we want clip_il to stay 0x4000
//
status = SbieApi_CallOne(
API_GUI_CLIPBOARD, caller_il);
status = SbieApi_Call(API_GUI_CLIPBOARD, 1, caller_il);
}*/
CloseClipboard();
@ -2458,7 +2460,7 @@ ULONG GuiServer::GetClipboardDataSlave(SlaveArgs *args)
// then we can't get it, see more in CloseClipboardSlave above.
// work around that by setting IL to 0x4000
//
if (SbieApi_CallOne(API_GUI_CLIPBOARD, 0x4000) == 0) {
if (SbieApi_Call(API_GUI_CLIPBOARD, 1, 0x4000) == 0) {
mem_handle = GetClipboardData(req->format);
rpl->error = GetLastError();
}
@ -3471,6 +3473,7 @@ ULONG GuiServer::GetRawInputDeviceInfoSlave(SlaveArgs *args)
// WndHookNotifySlave
//---------------------------------------------------------------------------
ULONG GuiServer::WndHookNotifySlave(SlaveArgs *args)
{
GUI_WND_HOOK_NOTIFY_REQ *req = (GUI_WND_HOOK_NOTIFY_REQ *)args->req_buf;
@ -3489,7 +3492,29 @@ ULONG GuiServer::WndHookNotifySlave(SlaveArgs *args)
HANDLE hThread = OpenThread(THREAD_SET_CONTEXT, FALSE, (DWORD)whk->hthread);
if (hThread)
{
QueueUserAPC((PAPCFUNC)whk->hproc, hThread, (ULONG_PTR)req->threadid);
#ifdef _WIN64
if (whk->isWoW64)
{
//
// Calling APC's in a 32 bit process from within a 64 bit process needs some trickery
// see: https://repnz.github.io/posts/apc/wow64-user-apc/ for details
//
#define EncodeWow64ApcRoutine(ApcRoutine) ((ULONG64)((-(INT64)ApcRoutine) << 2));
typedef VOID (NTAPI *PPS_APC_ROUTINE)(PVOID SystemArgument1, PVOID SystemArgument2, PVOID SystemArgument3);
PPS_APC_ROUTINE ApcRoutine = (PPS_APC_ROUTINE)EncodeWow64ApcRoutine((ULONG64)whk->hproc);
typedef NTSTATUS (NTAPI* PNT_QUEUE_APC_THREAD)(HANDLE ThreadHandle, PPS_APC_ROUTINE ApcRoutine, PVOID SystemArgument1, PVOID SystemArgument2, PVOID SystemArgument3);
static PNT_QUEUE_APC_THREAD pNtQueueApcThread = NULL;
if(!pNtQueueApcThread)
pNtQueueApcThread = (PNT_QUEUE_APC_THREAD)GetProcAddress(_Ntdll, "NtQueueApcThread");
pNtQueueApcThread(hThread, ApcRoutine, (PVOID)whk->hthread , NULL, NULL);
}
else
#endif _WIN64
QueueUserAPC((PAPCFUNC)whk->hproc, hThread, (ULONG_PTR)req->threadid);
CloseHandle(hThread);
@ -3549,6 +3574,9 @@ ULONG GuiServer::WndHookRegisterSlave(SlaveArgs* args)
whk->hthread = req->hthread;
whk->hproc = req->hproc;
whk->HookCount = 0;
#ifdef _WIN64
whk->isWoW64 = IsProcessWoW64((HANDLE)whk->pid);
#endif _WIN64
List_Insert_After(&m_WndHooks, NULL, whk);
}

View File

@ -1090,7 +1090,7 @@ BOOL ProcessServer::RunSandboxedStartProcess(
if (ok && StartProgramInSandbox) {
LONG rc = SbieApi_CallTwo(API_START_PROCESS,
LONG rc = SbieApi_Call(API_START_PROCESS, 2,
BoxNameOrModelPid, pi->dwProcessId);
if (rc != 0) {

View File

@ -135,8 +135,6 @@ typedef struct _COM_OBJECT {
//---------------------------------------------------------------------------
typedef BOOL (*P_IsWow64Process)(HANDLE, BOOL *);
//---------------------------------------------------------------------------
// Variables
@ -156,8 +154,6 @@ static const GUID IID_IWbemClassObject = {
0xDC12A681, 0x737F, 0x11CF,
{ 0x88, 0x4D, 0x00, 0xAA, 0x00, 0x4B, 0x2E, 0x24 } };
P_IsWow64Process pIsWow64Process = NULL;
//---------------------------------------------------------------------------
// Constructor
@ -171,13 +167,6 @@ ComServer::ComServer(PipeServer *pipeServer)
InitializeCriticalSection(&m_SlavesLock);
List_Init(&m_SlavesList);
#ifdef _WIN64
pIsWow64Process = (P_IsWow64Process)
GetProcAddress(_Kernel32, "IsWow64Process");
#endif _WIN64
pipeServer->Register(MSGID_COM, this, Handler);
}
@ -707,36 +696,12 @@ void *ComServer::LockSlave(HANDLE idProcess, ULONG msgid)
#ifdef _WIN64
if (pIsWow64Process) {
HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION,
FALSE, (ULONG)(ULONG_PTR)idProcess);
if (hProcess) {
BOOL xwow64 = FALSE;
if (pIsWow64Process(hProcess, &xwow64) && xwow64) {
IsWow64 = TRUE;
}
CloseHandle(hProcess);
IsWow64 = IsProcessWoW64(idProcess);
#ifdef DEBUG_COMSERVER
WCHAR txt[256]; wsprintf(txt, L"LockSlave idProcess=%d Wow64=%d msgid=%X\n", idProcess, IsWow64, msgid);
OutputDebugString(txt);
WCHAR txt[256]; wsprintf(txt, L"LockSlave idProcess=%d Wow64=%d msgid=%X\n", idProcess, IsWow64, msgid);
OutputDebugString(txt);
#endif
}
#ifdef DEBUG_COMSERVER
else {
WCHAR txt[256]; wsprintf(txt, L"LockSlave Cannot determine wow64ness for idProcess=%d\n", idProcess);
OutputDebugString(txt);
}
#endif
}
#endif _WIN64
//

View File

@ -490,4 +490,45 @@ bool CheckDropRights(const WCHAR *BoxName)
if (SbieApi_QueryConfBool(BoxName, L"DropAdminRights", FALSE))
return true;
return false;
}
//---------------------------------------------------------------------------
// CheckDropRights
//---------------------------------------------------------------------------
bool IsProcessWoW64(HANDLE pid)
{
typedef BOOL (*P_IsWow64Process)(HANDLE, BOOL *);
static P_IsWow64Process pIsWow64Process = NULL;
if(!pIsWow64Process)
pIsWow64Process = (P_IsWow64Process)GetProcAddress(_Kernel32, "IsWow64Process");
if (!pIsWow64Process)
return false;
bool IsWow64 = false;
HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION,
FALSE, (ULONG)(ULONG_PTR)pid);
if (hProcess) {
BOOL xwow64 = FALSE;
if (pIsWow64Process && pIsWow64Process(hProcess, &xwow64) && xwow64) {
IsWow64 = true;
}
CloseHandle(hProcess);
}
#ifdef DEBUG_COMSERVER
else {
WCHAR txt[256]; wsprintf(txt, L"Cannot determine wow64ness for idProcess=%d\n", idProcess);
OutputDebugString(txt);
}
#endif
return IsWow64;
}

View File

@ -25,7 +25,7 @@ void AbortServer(void);
bool RestrictToken(void);
bool CheckDropRights(const WCHAR *BoxName);
SECURITY_ATTRIBUTES *GetSecurityAttributes(ACCESS_MASK EveryoneAccess);
bool IsProcessWoW64(HANDLE pid);
extern HMODULE _Ntdll;
extern HMODULE _Kernel32;

View File

@ -146,10 +146,10 @@ OpenProtectedStorage=y
OpenKeyPath=iexplore.exe,HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms
OpenKeyPath=iexplore.exe,HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs
[Template_IExplore_Credentials]
Tmpl.Title=#4330
Tmpl.Class=WebBrowser
OpenCredentials=y
# [Template_IExplore_Credentials]
# Tmpl.Title=#4330
# Tmpl.Class=WebBrowser
# OpenCredentials=y
#
# Firefox / Waterfox / PaleMoon / SeaMonkey
@ -2796,6 +2796,12 @@ Tmpl.Title=#4338,Popcorn Time (popcorntime.app)
Tmpl.Class=TorrentClient
OpenFilePath=Popcorn-Time.exe,%Local AppData%\popcorn-time
[Template_PicoTorrent_Force]
Tmpl.Title=#4323,Pico Torrent
Tmpl.Class=TorrentClient
ForceProcess=PicoTorrent.exe
ForceRestart=PicoTorrent.exe
#
# Download Managers
#
@ -2808,6 +2814,8 @@ Tmpl.Scan=s
# Tmpl.ScanKey=\REGISTRY\MACHINE\SOFTWARE\Classes\CLSID\{AC746233-E9D3-49CD-862F-068F7B7CCCA4}
Tmpl.ScanProduct=Internet Download Manager
OpenClsid={AC746233-E9D3-49CD-862F-068F7B7CCCA4}
# prevetn access to host port
BlockPort=1001
[Template_SothinkWebVideoDownloader]
Tmpl.Title=Sothink Web Video Downloader Stand-alone

View File

@ -82,14 +82,14 @@ ALIGNED BOOLEAN Kmd_Stop_SbieDrv(void)
rc = SbieApi_GetVersion(driver_version);
if (rc == 0) {
rc = SbieApi_CallZero(API_UNLOAD_DRIVER);
rc = SbieApi_Call(API_UNLOAD_DRIVER, 0);
if (rc == STATUS_CONNECTION_IN_USE) {
Sleep(2500);
rc = SbieApi_CallZero(API_UNLOAD_DRIVER);
rc = SbieApi_Call(API_UNLOAD_DRIVER, 0);
}
if (rc == STATUS_CONNECTION_IN_USE) {
Sleep(2500);
rc = SbieApi_CallZero(API_UNLOAD_DRIVER);
rc = SbieApi_Call(API_UNLOAD_DRIVER, 0);
}
}

View File

@ -45,8 +45,12 @@ CBoxedProcess::CBoxedProcess(quint32 ProcessId, class CSandBox* pBox)
m_ParendPID = 0;
m_SessionId = 0;
m_ImageType = -1;
m_uTerminated = 0;
//m_bSuspended = IsSuspended();
m_bIsWoW64 = false;
}
CBoxedProcess::~CBoxedProcess()
@ -172,6 +176,10 @@ bool CBoxedProcess::InitProcessInfo()
if (DWORD size = GetModuleFileNameEx(ProcessHandle, NULL, filename, MAX_PATH))
m_ImagePath = QString::fromWCharArray(filename);
BOOL isTargetWow64Process = FALSE;
IsWow64Process(ProcessHandle, &isTargetWow64Process);
m_bIsWoW64 = isTargetWow64Process;
if (1) // windows 8.1 and later // todo add os version check
{
#define ProcessCommandLineInformation ((PROCESSINFOCLASS)60)
@ -194,6 +202,15 @@ bool CBoxedProcess::InitProcessInfo()
}
NtClose(ProcessHandle);
return true;
}
bool CBoxedProcess::InitProcessInfoEx()
{
if(m_ImageType == -1)
m_ImageType = m_pBox->Api()->GetImageType(m_ProcessId);
return true;
}
@ -293,4 +310,4 @@ bool CBoxedProcess::IsSuspended() const
QString CBoxedProcess::GetBoxName() const
{
return m_pBox->GetName();
}
}

View File

@ -30,6 +30,7 @@ public:
virtual ~CBoxedProcess();
virtual bool InitProcessInfo();
virtual bool InitProcessInfoEx();
virtual quint32 GetProcessId() const { return m_ProcessId; }
virtual quint32 GetParendPID() const { return m_ParendPID; }
@ -37,6 +38,7 @@ public:
virtual QString GetCommandLine() const { return m_CommandLine; }
virtual QString GetFileName() const { return m_ImagePath; }
virtual QDateTime GetTimeStamp() const { return m_StartTime; }
virtual quint32 GetImageType() const { return m_ImageType; }
virtual SB_STATUS Terminate();
virtual bool IsTerminated(quint64 forMs = 0) const;
@ -45,7 +47,10 @@ public:
//virtual SB_STATUS SetSuspend(bool bSet);
//virtual bool IsSuspended() const;
virtual bool IsWoW64() const { return m_bIsWoW64; }
virtual QString GetBoxName() const;
virtual class CSandBox* GetBoxPtr() const { return m_pBox; }
protected:
friend class CSbieAPI;
@ -54,11 +59,13 @@ protected:
quint32 m_ParendPID;
QString m_ImageName;
QString m_ImagePath;
quint32 m_ImageType;
QString m_CommandLine;
quint32 m_SessionId;
QDateTime m_StartTime;
quint64 m_uTerminated;
//bool m_bSuspended;
bool m_bIsWoW64;
class CSandBox* m_pBox;

View File

@ -127,6 +127,8 @@ CSbieAPI::CSbieAPI(QObject* parent) : QThread(parent)
m_bReloadPending = false;
m_LastTraceEntry = 0;
connect(&m_IniWatcher, SIGNAL(fileChanged(const QString&)), this, SLOT(OnIniChanged(const QString&)));
connect(this, SIGNAL(ProcessBoxed(quint32, const QString&, const QString&, quint32)), this, SLOT(OnProcessBoxed(quint32, const QString&, const QString&, quint32)));
}
@ -235,6 +237,8 @@ void CSbieAPI::GetUserPaths()
if (CSbieAPI__GetCurrentSidString(&objname))
{
m_UserSid = QString::fromWCharArray(objname.Buffer);
InitializeObjectAttributes(&objattrs, &objname, OBJ_CASE_INSENSITIVE, hProfileKey, NULL);
HANDLE hSidKey;
@ -788,6 +792,58 @@ void CSbieAPI::OnReloadConfig()
ReloadConfig();
}
typedef struct _FILE_FS_VOLUME_INFORMATION {
LARGE_INTEGER VolumeCreationTime;
ULONG VolumeSerialNumber;
ULONG VolumeLabelLength;
BOOLEAN SupportsObjects;
WCHAR VolumeLabel[1];
} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
ULONG CSbieAPI__GetVolumeSN(wchar_t* path)
{
ULONG sn = 0;
HANDLE handle;
IO_STATUS_BLOCK iosb;
UNICODE_STRING objname;
size_t path_len = wcslen(path);
objname.Buffer = new wchar_t[path_len + 2];
wmemcpy(objname.Buffer, path, path_len);
objname.Buffer[path_len ] = L'\\';
objname.Buffer[path_len + 1] = L'\0';
objname.Length = (USHORT)(path_len + 1) * sizeof(WCHAR);
objname.MaximumLength = objname.Length + sizeof(WCHAR);
OBJECT_ATTRIBUTES objattrs;
InitializeObjectAttributes(
&objattrs, &objname, OBJ_CASE_INSENSITIVE, NULL, NULL);
NTSTATUS status = NtCreateFile(
&handle, GENERIC_READ | SYNCHRONIZE, &objattrs,
&iosb, NULL, 0, FILE_SHARE_VALID_FLAGS,
FILE_OPEN,
FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
NULL, 0);
delete [] objname.Buffer;
if (NT_SUCCESS(status))
{
union {
FILE_FS_VOLUME_INFORMATION volumeInfo;
BYTE volumeInfoBuff[64];
} u;
if (NT_SUCCESS(NtQueryVolumeInformationFile(handle, &iosb, &u.volumeInfo, sizeof(u), FileFsVolumeInformation)))
sn = u.volumeInfo.VolumeSerialNumber;
NtClose(handle);
}
return sn;
}
void CSbieAPI::UpdateDriveLetters()
{
QWriteLocker Lock(&m_DriveLettersMutex);
@ -807,28 +863,45 @@ void CSbieAPI::UpdateDriveLetters()
uint size = QueryDosDevice(drv, lpTargetPath, MAX_PATH);
if (size > 0)
{
SDrive Drive;
QString Key = QString::fromWCharArray(lpTargetPath);
QStringList Chunks = Key.split("\\");
if (Chunks.count() >= 5 && Chunks[2].compare("LanmanRedirector", Qt::CaseInsensitive) == 0) {
Drive.Type = SDrive::EShare;
Chunks.removeAt(3);
Key = Chunks.join("\\");
Drive.Aux = Chunks.mid(3).join("\\");
}
else {
Drive.Type = SDrive::EVolume;
if (ULONG sn = CSbieAPI__GetVolumeSN(lpTargetPath))
Drive.Aux = QString("%1-%2").arg((ushort)HIWORD(sn), 4, 16, QChar('0')).arg((ushort)LOWORD(sn), 4, 16, QChar('0')).toUpper();
}
Key.append("\\");
m_DriveLetters.insert(Key, QString::fromWCharArray(drv) + "\\");
Drive.Letter = QString::fromWCharArray(drv) + "\\";
Drive.NtPath = Key;
m_DriveLetters.insert(Drive.Letter, Drive);
}
}
}
QString CSbieAPI::Nt2DosPath(QString NtPath) const
QString CSbieAPI::Nt2DosPath(QString NtPath, bool* pOk) const
{
QReadLocker Lock(&m_DriveLettersMutex);
for (QMap<QString, QString>::const_iterator I = m_DriveLetters.begin(); I != m_DriveLetters.end(); ++I)
if (NtPath.indexOf("\\device\\mup", 0, Qt::CaseInsensitive) == 0)
NtPath = "\\Device\\LanmanRedirector" + NtPath.mid(11);
for (QMap<QString, SDrive>::const_iterator I = m_DriveLetters.begin(); I != m_DriveLetters.end(); ++I)
{
const QString& Key = I.key();
if (Key.compare(NtPath.left(Key.length()), Qt::CaseInsensitive) == 0)
return NtPath.replace(0, Key.length(), I.value());
const SDrive& Drive = I.value();
if (Drive.NtPath.compare(NtPath.left(Drive.NtPath.length()), Qt::CaseInsensitive) == 0) {
if(pOk) *pOk = true;
return NtPath.replace(0, Drive.NtPath.length(), Drive.Letter);
}
}
if(pOk) *pOk = false;
return NtPath;
}
@ -1137,7 +1210,7 @@ SB_STATUS CSbieAPI::UpdateProcesses(bool bKeep, const CSandBoxPtr& pBox)
pProcess->InitProcessInfo();
}
// todo:
pProcess->InitProcessInfoEx();
}
foreach(const CBoxedProcessPtr& pProcess, OldProcessList)
@ -1269,6 +1342,26 @@ CBoxedProcessPtr CSbieAPI::GetProcessById(quint32 ProcessId) const
return m_BoxedProxesses.value(ProcessId);
}
quint32 CSbieAPI::GetImageType(quint32 ProcessId)
{
__declspec(align(8)) ULONG64 ResultValue;
__declspec(align(8)) ULONG64 parms[API_NUM_ARGS];
API_QUERY_PROCESS_INFO_ARGS *args = (API_QUERY_PROCESS_INFO_ARGS *)parms;
memset(parms, 0, sizeof(parms));
args->func_code = API_QUERY_PROCESS_INFO;
args->process_id.val64 = (ULONG64)(ULONG_PTR)ProcessId;
args->info_type.val64 = (ULONG64)(ULONG_PTR)'gpit';
args->info_data.val64 = (ULONG64)(ULONG_PTR)&ResultValue;
args->ext_data.val64 = (ULONG64)(ULONG_PTR)0;
NTSTATUS status = m->IoControl(parms);
if (!NT_SUCCESS(status))
return -1;
return ResultValue;
}
SB_STATUS CSbieAPI::TerminateAll(const QString& BoxName)
{
PROCESS_KILL_ALL_REQ req;
@ -1533,12 +1626,20 @@ QString CSbieAPI::GetBoxedPath(const QString& BoxName, const QString& Path)
return GetBoxedPath(pBox, Path);
}
//#pragma comment(lib, "mpr.lib")
QString CSbieAPI::GetBoxedPath(const CSandBoxPtr& pBox, const QString& Path)
{
QString BoxRoot = pBox->m_FilePath;
if (Path.indexOf("\\device\\mup", 0, Qt::CaseInsensitive) == 0)
return BoxRoot + "\\share" + Path.mid(11);
//WCHAR Buffer[4096];
//DWORD dwBufferLength = sizeof(Buffer)/sizeof(WCHAR );
//UNIVERSAL_NAME_INFO * unameinfo = (UNIVERSAL_NAME_INFO *) &Buffer;
//if (WNetGetUniversalName(Path.toStdWString().c_str(), UNIVERSAL_NAME_INFO_LEVEL, (LPVOID)unameinfo, &dwBufferLength) == NO_ERROR)
// return BoxRoot + "\\share" + QString::fromWCharArray(unameinfo->lpUniversalName).mid(1);
//if (Path.indexOf("\\device\\mup", 0, Qt::CaseInsensitive) == 0)
// return QStringList(BoxRoot + "\\share" + Path.mid(11));
if (pBox->GetBool("SeparateUserFolders", true))
{
@ -1553,7 +1654,35 @@ QString CSbieAPI::GetBoxedPath(const CSandBoxPtr& pBox, const QString& Path)
if (Path.length() < 3 || Path.at(1) != ':')
return QString();
QReadLocker Lock(&m_DriveLettersMutex);
QMap<QString, SDrive>::const_iterator I = m_DriveLetters.find(Path.left(3).toUpper());
if (I != m_DriveLetters.end())
{
if (I->Type == SDrive::EShare)
return BoxRoot + "\\share\\" + I->Aux + Path.mid(2);
else if (pBox->GetBool("UseVolumeSerialNumbers", false) && !I->Aux.isEmpty())
return BoxRoot + "\\drive\\" + Path.at(0) + "~" + I->Aux + Path.mid(2);
}
return BoxRoot + "\\drive\\" + Path.at(0) + Path.mid(2);
/*QStringList Paths;
// todo: include snapshot locations
if (pBox->GetBool("UseVolumeSerialNumbers", false))
{
QDir Dir(BoxRoot + "\\drive\\");
foreach(const QFileInfo & Info, Dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot))
{
if (Info.fileName().left(1).compare(Path.at(0), Qt::CaseInsensitive) == 0)
Paths.append(BoxRoot + "\\drive\\" + Info.fileName() + Path.mid(2));
}
}
if(Paths.isEmpty())
Paths = QStringList(BoxRoot + "\\drive\\" + Path.at(0) + Path.mid(2));
return Paths;*/
}
QString CSbieAPI::GetRealPath(const CSandBoxPtr& pBox, const QString& Path)
@ -1563,27 +1692,39 @@ QString CSbieAPI::GetRealPath(const CSandBoxPtr& pBox, const QString& Path)
if (BoxRoot.right(1) == "\\") BoxRoot.truncate(BoxRoot.length() - 1);
if (Path.length() < BoxRoot.length())
return RealPath;
return QString();;
RealPath = Path.mid(BoxRoot.length());
if (RealPath.left(6) == "\\share")
RealPath = "\\device\\mup" + RealPath.mid(6);
if (RealPath.left(6) == "\\share")
{
QString Temp = RealPath.mid(6);
bool bBs = false;
if ((bBs = (Temp.count("\\") < 3))) Temp += "\\";
bool bOk;
Temp = Nt2DosPath("\\Device\\LanmanRedirector" + Temp, &bOk);
if (!bOk) return QString();
if (bBs) Temp.truncate(Temp.length() - 1);
return Temp;
}
if (RealPath.left(5) == "\\user")
{
if (RealPath.mid(5, 8) == "\\current")
RealPath = m_UserDir + RealPath.mid(5 + 8);
return m_UserDir + RealPath.mid(5 + 8);
else if (RealPath.mid(5, 4) == "\\all")
RealPath = m_ProgramDataDir + RealPath.mid(5 + 4);
return m_ProgramDataDir + RealPath.mid(5 + 4);
else if (RealPath.mid(5, 7) == "\\public")
RealPath = m_PublicDir + RealPath.mid(5 + 7);
return m_PublicDir + RealPath.mid(5 + 7);
}
if (RealPath.left(6) == "\\drive")
RealPath = RealPath.mid(7, 1) + ":" + RealPath.mid(8);
if (RealPath.left(6) == "\\drive")
{
int pos = RealPath.indexOf("\\", 7);
return RealPath.mid(7, 1) + ":" + (pos != -1 ? RealPath.mid(pos) : "");
}
return RealPath;
return QString();
}
///////////////////////////////////////////////////////////////////////////////
@ -1784,7 +1925,9 @@ bool CSbieAPI::GetLog()
if ((MsgCode & 0xFFFF) == 2199) // Auto Recovery notification
{
emit FileToRecover(MsgData[1], Nt2DosPath(MsgData[2]), ProcessId);
QString FilePath = Nt2DosPath(MsgData[2]);
QString BoxPath = MsgData.length() >= 4 ? Nt2DosPath(MsgData[3]) : QString();
emit FileToRecover(MsgData[1], FilePath, BoxPath, ProcessId);
return true;
}
@ -1966,6 +2109,25 @@ void CSbieAPI::AddTraceEntry(const CTraceEntryPtr& LogEntry, bool bCanMerge)
m_TraceList.append(LogEntry);
}
QList<CTraceEntryPtr> CSbieAPI::GetTrace() const
{
QReadLocker Lock(&m_TraceMutex);
if (m_TraceList.count() >= m_LastTraceEntry) {
for (int i = m_LastTraceEntry; i < m_TraceList.count(); i++) {
const CTraceEntryPtr& pEntry = m_TraceList[i];
if (CBoxedProcessPtr proc = m_BoxedProxesses.value(pEntry->GetProcessId())) {
((CTraceEntry*)pEntry.data())->SetProcessName(proc->GetProcessName());
((CTraceEntry*)pEntry.data())->SetBoxPtr(proc->GetBoxPtr());
}
}
((CSbieAPI*)this)->m_LastTraceEntry = m_TraceList.count();
}
return m_TraceList;
}
///////////////////////////////////////////////////////////////////////////////
// Other
//

View File

@ -53,7 +53,7 @@ public:
virtual QString GetIniPath() const { return m_IniPath; }
virtual void UpdateDriveLetters();
virtual QString Nt2DosPath(QString NtPath) const;
virtual QString Nt2DosPath(QString NtPath, bool* pOk = NULL) const;
virtual SB_STATUS ReloadBoxes(bool bFullUpdate = false);
static SB_STATUS ValidateName(const QString& BoxName);
@ -95,6 +95,7 @@ public:
virtual CSbieIni* GetGlobalSettings() const { return m_pGlobalSection; }
virtual CSbieIni* GetUserSettings() const { return m_pUserSection; }
virtual QString GetCurrentUserName() const { return m_UserName; }
virtual QString GetCurrentUserSid() const { return m_UserSid; }
virtual bool IsConfigLocked();
virtual SB_STATUS UnlockConfig(const QString& Password);
virtual SB_STATUS LockConfig(const QString& NewPassword);
@ -109,8 +110,8 @@ public:
virtual bool IsMonitoring();
virtual void AddTraceEntry(const CTraceEntryPtr& LogEntry, bool bCanMerge = false);
virtual QList<CTraceEntryPtr> GetTrace() const { QReadLocker Lock(&m_TraceMutex); return m_TraceList; }
virtual void ClearTrace() { QWriteLocker Lock(&m_TraceMutex); m_TraceList.clear(); }
virtual QList<CTraceEntryPtr> GetTrace() const;
virtual void ClearTrace() { QWriteLocker Lock(&m_TraceMutex); m_TraceList.clear(); m_LastTraceEntry = 0; }
// Other
virtual QString GetSbieMsgStr(quint32 code, quint32 Lang = 1033);
@ -135,7 +136,7 @@ signals:
//void LogMessage(const QString& Message, bool bNotify = true);
void LogSbieMessage(quint32 MsgCode, const QStringList& MsgData, quint32 ProcessId);
void ProcessBoxed(quint32 ProcessId, const QString& Path, const QString& Box, quint32 ParentId);
void FileToRecover(const QString& BoxName, const QString& FilePath, quint32 ProcessId);
void FileToRecover(const QString& BoxName, const QString& FilePath, const QString& BoxPath, quint32 ProcessId);
void BoxClosed(const QString& BoxName);
void NotAuthorized(bool bLoginRequired, bool &bRetry);
void QueuedRequest(quint32 ClientPid, quint32 ClientTid, quint32 RequestId, const QVariantMap& Data);
@ -163,6 +164,8 @@ protected:
virtual bool GetLog();
virtual bool GetMonitor();
virtual quint32 GetImageType(quint32 ProcessId);
virtual SB_STATUS TerminateAll(const QString& BoxName);
virtual SB_STATUS Terminate(quint32 ProcessId);
@ -183,9 +186,21 @@ protected:
mutable QReadWriteLock m_TraceMutex;
QList<CTraceEntryPtr> m_TraceList;
int m_LastTraceEntry;
mutable QReadWriteLock m_DriveLettersMutex;
QMap<QString, QString> m_DriveLetters;
struct SDrive
{
QString Letter;
QString NtPath;
enum EType
{
EVolume = 0,
EShare
} Type;
QString Aux;
};
QMap<QString, SDrive> m_DriveLetters;
QString m_SbiePath;
QString m_IniPath;
@ -199,6 +214,7 @@ protected:
CSbieIni* m_pGlobalSection;
CSbieIni* m_pUserSection;
QString m_UserName;
QString m_UserSid;
QString m_ProgramDataDir;
QString m_PublicDir;

View File

@ -68,6 +68,8 @@ CTraceEntry::CTraceEntry(quint32 ProcessId, quint32 ThreadId, quint32 Type, cons
m_TimeStamp = QDateTime::currentDateTime(); // ms resolution
m_BoxPtr = 0;
static atomic<quint64> uid = 0;
m_uid = uid.fetch_add(1);

View File

@ -38,6 +38,12 @@ public:
virtual QString GetTypeStr() const;
virtual QString GetStautsStr() const;
virtual void SetProcessName(const QString& name) { m_ProcessName = name; }
virtual QString GetProcessName() const { return m_ProcessName; }
virtual void SetBoxPtr(void* ptr) { m_BoxPtr = ptr; }
virtual void* GetBoxPtr() const { return m_BoxPtr; }
virtual int GetCount() const { return m_Counter; }
virtual bool Equals(const QSharedDataPointer<CTraceEntry>& pOther) const {
@ -55,6 +61,8 @@ protected:
quint32 m_ProcessId;
quint32 m_ThreadId;
QDateTime m_TimeStamp;
QString m_ProcessName;
void* m_BoxPtr;
union
{

View File

@ -45,7 +45,7 @@
<enum>QTabWidget::West</enum>
</property>
<property name="currentIndex">
<number>0</number>
<number>8</number>
</property>
<widget class="QWidget" name="tabGeneral">
<attribute name="title">
@ -64,59 +64,6 @@
<layout class="QGridLayout" name="gridLayout_27">
<item row="1" column="0">
<layout class="QGridLayout" name="gridLayout_8">
<item row="10" column="2" colspan="5">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_7">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Appearance</string>
</property>
</widget>
</item>
<item row="2" column="5">
<widget class="QToolButton" name="btnBorderColor">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="6">
<widget class="QSpinBox" name="spinBorderWidth">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>10</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
<item row="9" column="1" colspan="6">
<widget class="QCheckBox" name="chkBlockNetParam">
<property name="text">
<string>Prevent change to network and firewall parameters</string>
</property>
</widget>
</item>
<item row="2" column="7">
<widget class="QLabel" name="label_14">
<property name="text">
@ -127,16 +74,6 @@
</property>
</widget>
</item>
<item row="1" column="0" colspan="3">
<widget class="QLabel" name="label_20">
<property name="text">
<string>Sandbox Indicator in title:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="0" colspan="3">
<widget class="QLabel" name="label_21">
<property name="text">
@ -147,8 +84,18 @@
</property>
</widget>
</item>
<item row="1" column="3" colspan="2">
<widget class="QComboBox" name="cmbBoxIndicator"/>
<item row="11" column="2" colspan="5">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="0" colspan="3">
<widget class="QLabel" name="label_10">
@ -166,6 +113,101 @@
</property>
</widget>
</item>
<item row="9" column="1" colspan="6">
<widget class="QCheckBox" name="chkBlockNetShare">
<property name="text">
<string>Block network files and folders, unless specifically opened.</string>
</property>
</widget>
</item>
<item row="2" column="3" colspan="2">
<widget class="QComboBox" name="cmbBoxBorder"/>
</item>
<item row="4" column="1" colspan="6">
<widget class="QLabel" name="label_35">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Security note: Elevated applications running under the supervision of Sandboxie, with an admin token, have more opportunities to bypass isolation and modify the system outside the sandbox.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="8" column="0" colspan="3">
<widget class="QLabel" name="label_34">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>Protect the system from sandboxed processes</string>
</property>
<property name="text">
<string>Network restrictions</string>
</property>
</widget>
</item>
<item row="1" column="3" colspan="2">
<widget class="QComboBox" name="cmbBoxIndicator"/>
</item>
<item row="5" column="1" colspan="5">
<widget class="QCheckBox" name="chkDropRights">
<property name="text">
<string>Drop rights from Administrators and Power Users groups</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="3">
<widget class="QLabel" name="label_20">
<property name="text">
<string>Sandbox Indicator in title:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="6" colspan="2">
<widget class="QLabel" name="label_40">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>(Recommended)</string>
</property>
</widget>
</item>
<item row="6" column="2" colspan="6">
<widget class="QCheckBox" name="chkFakeElevation">
<property name="text">
<string>Make applications think they are running elevated (allows to run installers safely)</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_7">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Appearance</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_30">
<property name="sizePolicy">
@ -185,14 +227,7 @@
</property>
</widget>
</item>
<item row="8" column="1" colspan="6">
<widget class="QCheckBox" name="chkBlockNetShare">
<property name="text">
<string>Block network files and folders, unless specifically opened.</string>
</property>
</widget>
</item>
<item row="10" column="1">
<item row="11" column="1">
<spacer name="verticalSpacer_17">
<property name="orientation">
<enum>Qt::Vertical</enum>
@ -205,41 +240,35 @@
</property>
</spacer>
</item>
<item row="2" column="3" colspan="2">
<widget class="QComboBox" name="cmbBoxBorder"/>
</item>
<item row="6" column="2" colspan="6">
<widget class="QCheckBox" name="chkFakeElevation">
<item row="2" column="5">
<widget class="QToolButton" name="btnBorderColor">
<property name="text">
<string>Make applications think they are running elevated (allows to run installers safely)</string>
<string/>
</property>
</widget>
</item>
<item row="7" column="0" colspan="3">
<widget class="QLabel" name="label_34">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>Protect the system from sandboxed processes</string>
</property>
<item row="10" column="1" colspan="6">
<widget class="QCheckBox" name="chkBlockNetParam">
<property name="text">
<string>Network restrictions</string>
<string>Prevent change to network and firewall parameters</string>
</property>
</widget>
</item>
<item row="5" column="1" colspan="5">
<widget class="QCheckBox" name="chkDropRights">
<property name="text">
<string>Drop rights from Administrators and Power Users groups</string>
<item row="2" column="6">
<widget class="QSpinBox" name="spinBorderWidth">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>10</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
<item row="5" column="6" colspan="2">
<widget class="QLabel" name="label_40">
<item row="7" column="1" colspan="6">
<widget class="QLabel" name="lblAdmin">
<property name="font">
<font>
<weight>75</weight>
@ -247,20 +276,7 @@
</font>
</property>
<property name="text">
<string>(Recommended)</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="6">
<widget class="QLabel" name="label_35">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Security note: Elevated applications running under the supervision of Sandboxie, with an admin token, have more opportunities to bypass isolation and modify the system outside the sandbox.</string>
<string>CAUTION: When running under the built in administrator, processes can not drop administrative privileges.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@ -1168,6 +1184,109 @@ If leader processes are defined, all others are treated as lingering processes.<
<layout class="QGridLayout" name="gridLayout_11">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_7">
<item row="1" column="1">
<widget class="QToolButton" name="btnAddFile">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>23</height>
</size>
</property>
<property name="text">
<string>Add File/Folder</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QToolButton" name="btnAddWnd">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>23</height>
</size>
</property>
<property name="text">
<string>Add Wnd Class</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QPushButton" name="btnMoveDown">
<property name="text">
<string>Move Down</string>
</property>
</widget>
</item>
<item row="9" column="1">
<spacer name="verticalSpacer_11">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="1">
<widget class="QToolButton" name="btnAddIPC">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>23</height>
</size>
</property>
<property name="text">
<string>Add IPC Path</string>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QCheckBox" name="chkShowAccessTmpl">
<property name="text">
<string>Show Templates</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QToolButton" name="btnAddKey">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>23</height>
</size>
</property>
<property name="text">
<string>Add Reg Key</string>
</property>
</widget>
</item>
<item row="1" column="0" rowspan="11">
<widget class="QTreeWidget" name="treeAccess">
<property name="sortingEnabled">
@ -1195,44 +1314,6 @@ If leader processes are defined, all others are treated as lingering processes.<
</column>
</widget>
</item>
<item row="2" column="1">
<widget class="QToolButton" name="btnAddKey">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>23</height>
</size>
</property>
<property name="text">
<string>Add Reg Key</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QToolButton" name="btnAddFile">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>23</height>
</size>
</property>
<property name="text">
<string>Add File/Folder</string>
</property>
</widget>
</item>
<item row="11" column="1">
<widget class="QPushButton" name="btnDelAccess">
<property name="text">
@ -1240,25 +1321,6 @@ If leader processes are defined, all others are treated as lingering processes.<
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QToolButton" name="btnAddWnd">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>23</height>
</size>
</property>
<property name="text">
<string>Add Wnd Class</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QToolButton" name="btnAddCOM">
<property name="sizePolicy">
@ -1278,22 +1340,10 @@ If leader processes are defined, all others are treated as lingering processes.<
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QToolButton" name="btnAddIPC">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>23</height>
</size>
</property>
<item row="7" column="1">
<widget class="QPushButton" name="btnMoveUp">
<property name="text">
<string>Add IPC Path</string>
<string>Move Up</string>
</property>
</widget>
</item>
@ -1310,50 +1360,22 @@ If leader processes are defined, all others are treated as lingering processes.<
</property>
</spacer>
</item>
<item row="7" column="1">
<widget class="QPushButton" name="btnMoveUp">
<property name="text">
<string>Move Up</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QPushButton" name="btnMoveDown">
<property name="text">
<string>Move Down</string>
</property>
</widget>
</item>
<item row="9" column="1">
<spacer name="verticalSpacer_11">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="10" column="1">
<widget class="QCheckBox" name="chkShowAccessTmpl">
<property name="text">
<string>Show Templates</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="lblResources">
<property name="text">
<string>Configure which processes can access what resources. Double click on an entry to edit it.
'Direct' File and Key access only applies to program binaries located outside the sandbox.
Note that all Close...=!&lt;program&gt;,... exclusions have the same limitations.
For files access you can use 'Direct All' instead to make it apply to all programs.</string>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QCheckBox" name="chkCloseForBox">
<property name="text">
<string>Apply Close...=!&lt;program&gt;,... directives also to all binaries located in the sandboxed.</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
@ -2058,6 +2080,26 @@ instead of &quot;*&quot;.</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="4">
<widget class="QCheckBox" name="chkDisableMonitor">
<property name="text">
<string>Disable Resource Access Monitor</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_47">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Resource Access Monitor</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
@ -2083,8 +2125,8 @@ instead of &quot;*&quot;.</string>
<rect>
<x>0</x>
<y>0</y>
<width>98</width>
<height>28</height>
<width>63</width>
<height>16</height>
</rect>
</property>
<layout class="QGridLayout" name="dbgLayout">

View File

@ -11,6 +11,7 @@ CTraceModel::CTraceModel(QObject* parent)
m_Root = MkNode(QVariant());
m_LastCount = 0;
m_LastBoxPtr = NULL;
}
CTraceModel::~CTraceModel()
@ -47,7 +48,7 @@ bool CTraceModel::TestPath(const QList<QVariant>& Path, const CTraceEntryPtr& pE
return Path.size() == Index;
}*/
QList<QVariant> CTraceModel::Sync(const QList<CTraceEntryPtr>& EntryList)
QList<QVariant> CTraceModel::Sync(const QList<CTraceEntryPtr>& EntryList, void* BoxPtr)
{
QList<QVariant> Added;
QMap<QList<QVariant>, QList<STreeNode*> > New;
@ -56,7 +57,7 @@ QList<QVariant> CTraceModel::Sync(const QList<CTraceEntryPtr>& EntryList)
// Note: since this is a log and we ever always only add entries we save cpu time by always skipping the already know portion of the list
int i = 0;
if (EntryList.count() >= m_LastCount && m_LastCount > 0)
if (EntryList.count() >= m_LastCount && m_LastCount > 0 && m_LastBoxPtr == BoxPtr)
{
i = m_LastCount - 1;
if (m_LastID == EntryList.at(i)->GetUID())
@ -67,11 +68,15 @@ QList<QVariant> CTraceModel::Sync(const QList<CTraceEntryPtr>& EntryList)
else
i = 0;
}
m_LastBoxPtr = BoxPtr;
for (; i < EntryList.count(); i++)
{
CTraceEntryPtr pEntry = EntryList.at(i);
if (BoxPtr && pEntry->GetBoxPtr() != BoxPtr)
continue;
quint64 ID = pEntry->GetUID();
QModelIndex Index;
@ -90,6 +95,7 @@ QList<QVariant> CTraceModel::Sync(const QList<CTraceEntryPtr>& EntryList)
pNode->pEntry = pEntry;
New[pNode->Path].append(pNode);
//Added.append(ID);
SetProcessName(pEntry->GetProcessName(), pEntry->GetProcessId(), pEntry->GetThreadId());
}
else
{
@ -149,7 +155,7 @@ QList<QVariant> CTraceModel::Sync(const QList<CTraceEntryPtr>& EntryList)
case eTimeStamp: ColValue.Formated = pEntry->GetTimeStamp().toString("hh:mm:ss.zzz"); break;*/
case eProcess:
if(!m_bTree) {
QString Name = GetProcessName(pEntry->GetProcessId(), pEntry->GetThreadId());
QString Name = pEntry->GetProcessName();
ColValue.Formated = QString("%1 (%2, %3) - %4").arg(Name.isEmpty() ? tr("Unknown") : Name)
.arg(pEntry->GetProcessId()).arg(pEntry->GetThreadId()).arg(pEntry->GetTimeStamp().toString("hh:mm:ss.zzz"));
} else
@ -194,18 +200,15 @@ void CTraceModel::Clear()
Info.Dirty = true;
Info.Threads.clear();
}
m_PidMap.clear();
CTreeItemModel::Clear();
}
QString CTraceModel::GetProcessName(quint32 pid, quint32 tid)
void CTraceModel::SetProcessName(const QString& Name, quint32 pid, quint32 tid)
{
SProgInfo& Info = m_PidMap[pid];
if (Info.Dirty) {
CBoxedProcessPtr pProcess = theAPI->GetProcessById(pid);
if(pProcess)
Info.Name = pProcess->GetProcessName();
}
if (tid && !Info.Threads.contains(tid)) {
Info.Name = Name;
if (!Info.Threads.contains(tid)) {
Info.Threads.insert(tid);
Info.Dirty = true;
}
@ -213,6 +216,11 @@ QString CTraceModel::GetProcessName(quint32 pid, quint32 tid)
Info.Dirty = false;
emit NewBranche();
}
}
QString CTraceModel::GetProcessName(quint32 pid)
{
SProgInfo& Info = m_PidMap[pid];
return Info.Name;
}

View File

@ -11,7 +11,7 @@ public:
CTraceModel(QObject* parent = 0);
~CTraceModel();
QList<QVariant> Sync(const QList<CTraceEntryPtr>& EntryList);
QList<QVariant> Sync(const QList<CTraceEntryPtr>& EntryList, void* BoxPtr);
CTraceEntryPtr GetEntry(const QModelIndex& index) const;
@ -52,6 +52,7 @@ protected:
QVariant m_LastID;
int m_LastCount;
void* m_LastBoxPtr;
virtual STreeNode* MkNode(const QVariant& Id) { return new STraceNode(Id); }
virtual STreeNode* MkVirtualNode(const QVariant& Id, STreeNode* pParent);
@ -59,7 +60,8 @@ protected:
/*QList<QVariant> MakePath(const CTraceEntryPtr& pEntry, const QList<CTraceEntryPtr>& EntryList);
bool TestPath(const QList<QVariant>& Path, const CTraceEntryPtr& pEntry, const QList<CTraceEntryPtr>& EntryList, int Index = 0);*/
QString GetProcessName(quint32 pid, quint32 tid = 0);
void SetProcessName(const QString& Name, quint32 pid, quint32 tid);
QString GetProcessName(quint32 pid);
void LogThreadId(quint32 pid, quint32 tid);
QMap<quint32, SProgInfo>m_PidMap;
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -253,7 +253,7 @@ CSandMan::CSandMan(QWidget *parent)
connect(theAPI, SIGNAL(LogSbieMessage(quint32, const QStringList&, quint32)), this, SLOT(OnLogSbieMessage(quint32, const QStringList&, quint32)));
connect(theAPI, SIGNAL(NotAuthorized(bool, bool&)), this, SLOT(OnNotAuthorized(bool, bool&)), Qt::DirectConnection);
connect(theAPI, SIGNAL(QueuedRequest(quint32, quint32, quint32, const QVariantMap&)), this, SLOT(OnQueuedRequest(quint32, quint32, quint32, const QVariantMap&)), Qt::QueuedConnection);
connect(theAPI, SIGNAL(FileToRecover(const QString&, const QString&, quint32)), this, SLOT(OnFileToRecover(const QString&, const QString&, quint32)), Qt::QueuedConnection);
connect(theAPI, SIGNAL(FileToRecover(const QString&, const QString&, const QString&, quint32)), this, SLOT(OnFileToRecover(const QString&, const QString&, const QString&, quint32)), Qt::QueuedConnection);
connect(theAPI, SIGNAL(ConfigReloaded()), this, SLOT(OnIniReloaded()));
m_uTimerID = startTimer(250);
@ -480,20 +480,23 @@ void CSandMan::closeEvent(QCloseEvent *e)
if (PortableStop == -1)
{
bool State = false;
PortableStop = CCheckableMessageBox::question(this, "Sandboxie-Plus", tr("Sandboxie-Plus was running in portable mode, now it has to clean up the created services. This will prompt for administrative privileges.")
, tr("Don't show this message again."), &State, QDialogButtonBox::Ok | QDialogButtonBox::Cancel, QDialogButtonBox::Ok, QMessageBox::Information) == QDialogButtonBox::Ok ? 1 : 0;
auto Ret = CCheckableMessageBox::question(this, "Sandboxie-Plus", tr("Sandboxie-Plus was running in portable mode, now it has to clean up the created services. This will prompt for administrative privileges.\r\n\r\nDo you want to do the clean up?")
, tr("Don't show this message again."), &State, QDialogButtonBox::Yes | QDialogButtonBox::No | QDialogButtonBox::Cancel, QDialogButtonBox::Yes, QMessageBox::Question);
if (!PortableStop)
if (Ret == QDialogButtonBox::Cancel)
{
e->ignore();
return;
}
PortableStop = (Ret == QDialogButtonBox::Yes) ? 1 : 0;
if (State)
theConf->SetValue("Options/PortableStop", PortableStop);
}
StopSbie(true);
if(PortableStop == 1)
StopSbie(true);
}
QApplication::quit();
@ -600,8 +603,10 @@ void CSandMan::timerEvent(QTimerEvent* pEvent)
bool bIsMonitoring = theAPI->IsMonitoring();
m_pTraceView->setEnabled(bIsMonitoring);
m_pEnableMonitoring->setChecked(bIsMonitoring);
if (!bIsMonitoring) // don't disable the view as logn as there are entries shown
bIsMonitoring = !theAPI->GetTrace().isEmpty();
m_pTraceView->setEnabled(bIsMonitoring);
}
if (m_bIconEmpty != (theAPI->TotalProcesses() == 0) || m_bIconDisabled != bForceProcessDisabled)
@ -909,9 +914,9 @@ void CSandMan::OnQueuedRequest(quint32 ClientPid, quint32 ClientTid, quint32 Req
m_pPopUpWindow->AddUserPrompt(RequestId, Data, ClientPid);
}
void CSandMan::OnFileToRecover(const QString& BoxName, const QString& FilePath, quint32 ProcessId)
void CSandMan::OnFileToRecover(const QString& BoxName, const QString& FilePath, const QString& BoxPath, quint32 ProcessId)
{
m_pPopUpWindow->AddFileToRecover(FilePath, BoxName, ProcessId);
m_pPopUpWindow->AddFileToRecover(FilePath, BoxPath, BoxName, ProcessId);
}
void CSandMan::OpenRecovery(const QString& BoxName)
@ -1374,7 +1379,7 @@ void CSandMan::OnSetMonitoring()
if(m_pEnableMonitoring->isChecked() && !m_pToolBar->isVisible())
m_pLogTabs->show();
m_pTraceView->setEnabled(m_pEnableMonitoring->isChecked());
//m_pTraceView->setEnabled(m_pEnableMonitoring->isChecked());
}
void CSandMan::AddAsyncOp(const CSbieProgressPtr& pProgress)

View File

@ -47,6 +47,8 @@ public:
bool IsShowHidden() { return m_pShowHidden->isChecked(); }
CSbieView* GetBoxView() { return m_pBoxView; }
protected:
SB_STATUS ConnectSbie();
SB_STATUS ConnectSbieImpl();
@ -84,7 +86,7 @@ public slots:
void OnNotAuthorized(bool bLoginRequired, bool& bRetry);
void OnQueuedRequest(quint32 ClientPid, quint32 ClientTid, quint32 RequestId, const QVariantMap& Data);
void OnFileToRecover(const QString& BoxName, const QString& FilePath, quint32 ProcessId);
void OnFileToRecover(const QString& BoxName, const QString& FilePath, const QString& BoxPath, quint32 ProcessId);
void OpenRecovery(const QString& BoxName);

View File

@ -259,6 +259,7 @@
<None Include="sandman_de.ts" />
<None Include="sandman_es.ts" />
<None Include="sandman_it.ts" />
<None Include="sandman_nl.ts" />
<None Include="sandman_pl.ts" />
<None Include="sandman_pt.ts" />
<None Include="sandman_ru.ts" />

View File

@ -225,6 +225,9 @@
<None Include="sandman_it.ts">
<Filter>Translation Files</Filter>
</None>
<None Include="sandman_nl.ts">
<Filter>Translation Files</Filter>
</None>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="SandMan.rc">

View File

@ -65,6 +65,15 @@ void CSbiePlusAPI::UpdateWindowMap()
EnumWindows(CSbiePlusAPI__WindowEnum, (LPARAM)&m_WindowMap);
}
bool CSbiePlusAPI::IsRunningAsAdmin()
{
if (m_UserSid.left(9) != "S-1-5-21-")
return false;
if (m_UserSid.right(4) != "-500")
return false;
return true;
}
///////////////////////////////////////////////////////////////////////////////
// CSandBoxPlus
//
@ -370,11 +379,98 @@ int CSandBoxPlus::IsLeaderProgram(const QString& ProgName)
// CSbieProcess
//
QString CSbieProcess::ImageTypeToStr(quint32 type)
{
enum {
UNSPECIFIED = 0,
SANDBOXIE_RPCSS,
SANDBOXIE_DCOMLAUNCH,
SANDBOXIE_CRYPTO,
SANDBOXIE_WUAU,
SANDBOXIE_BITS,
SANDBOXIE_SBIESVC,
MSI_INSTALLER,
TRUSTED_INSTALLER,
WUAUCLT,
SHELL_EXPLORER,
INTERNET_EXPLORER,
MOZILLA_FIREFOX,
WINDOWS_MEDIA_PLAYER,
NULLSOFT_WINAMP,
PANDORA_KMPLAYER,
WINDOWS_LIVE_MAIL,
SERVICE_MODEL_REG,
RUNDLL32,
DLLHOST,
DLLHOST_WININET_CACHE,
WISPTIS,
GOOGLE_CHROME,
GOOGLE_UPDATE,
ACROBAT_READER,
OFFICE_OUTLOOK,
OFFICE_EXCEL,
FLASH_PLAYER_SANDBOX,
PLUGIN_CONTAINER,
OTHER_WEB_BROWSER,
OTHER_MAIL_CLIENT
};
switch (type)
{
case UNSPECIFIED: return tr("");
case SANDBOXIE_RPCSS: return tr("Sbie RpcSs");
case SANDBOXIE_DCOMLAUNCH: return tr("Sbie DcomLaunch");
case SANDBOXIE_CRYPTO: return tr("Sbie Crypto");
case SANDBOXIE_WUAU: return tr("Sbie WuAu Svc");
case SANDBOXIE_BITS: return tr("Sbie BITS");
case SANDBOXIE_SBIESVC: return tr("Sbie Svc");
case MSI_INSTALLER: return tr("Msi Installer");
case TRUSTED_INSTALLER: return tr("Trusted Installer");
case WUAUCLT: return tr("Windows Update");
case SHELL_EXPLORER: return tr("Windows Explorer");
case INTERNET_EXPLORER: return tr("Internet Explorer");
case MOZILLA_FIREFOX: return tr("FireFox");
case WINDOWS_MEDIA_PLAYER: return tr("Windows Media Player");
case NULLSOFT_WINAMP: return tr("WinAmp");
case PANDORA_KMPLAYER: return tr("KM Player");
case WINDOWS_LIVE_MAIL: return tr("Windows Live Mail");
case SERVICE_MODEL_REG: return tr("Service Model Reg");
case RUNDLL32: return tr("RunDll32");
case DLLHOST: return tr("DllHost");
case DLLHOST_WININET_CACHE: return tr("DllHost");
case WISPTIS: return tr("Windows Ink Services");
case GOOGLE_CHROME: return tr("Chromium Based");
case GOOGLE_UPDATE: return tr("Google Updater");
case ACROBAT_READER: return tr("Acrobat Reader");
case OFFICE_OUTLOOK: return tr("MS Outlook");
case OFFICE_EXCEL: return tr("MS Excel");
case FLASH_PLAYER_SANDBOX: return tr("Flash Player");
case PLUGIN_CONTAINER: return tr("FireFox Plugin Container");
case OTHER_WEB_BROWSER: return tr("Generic Web Browser");
case OTHER_MAIL_CLIENT: return tr("Generic Mail Client");
default: return tr("");
}
}
QString CSbieProcess::GetStatusStr() const
{
QString Status;
if (m_uTerminated != 0)
return tr("Terminated");
//if (m_bSuspended)
// return tr("Suspended");
return tr("Running");
Status = tr("Terminated");
//else if (m_bSuspended)
// Status = tr("Suspended");
else
Status = tr("Running");
if (m_bIsWoW64)
Status += " *32";
quint32 ImageType = GetImageType();
if (ImageType != -1) {
QString Type = ImageTypeToStr(ImageType);
if(!Type.isEmpty())
Status += tr(" (%1)").arg(Type);
}
return Status;
}

View File

@ -14,6 +14,8 @@ public:
virtual QString GetProcessTitle(quint32 pid) { return m_WindowMap.value(pid); }
virtual bool IsRunningAsAdmin();
protected:
virtual CSandBox* NewSandBox(const QString& BoxName, class CSbieAPI* pAPI);
virtual CBoxedProcess* NewBoxedProcess(quint32 ProcessId, class CSandBox* pBox);
@ -117,6 +119,8 @@ public:
virtual int GetRememberedAction(int Action) { return m_RememberedActions.value(Action, -1); }
virtual void SetRememberedAction(int Action, int retval) { m_RememberedActions.insert(Action, retval); }
static QString ImageTypeToStr(quint32 type);
protected:
QMap<int, int> m_RememberedActions;
};

View File

@ -90,6 +90,10 @@ CSbieView::CSbieView(QWidget* parent) : CPanelView(parent)
m_pMenuPresetsShowUAC = MakeAction(m_pMenuPresetsAdmin, m_pMenuPresets, tr("Ask for UAC Elevation"), 0);
m_pMenuPresetsNoAdmin = MakeAction(m_pMenuPresetsAdmin, m_pMenuPresets, tr("Drop Admin Rights"), 1);
m_pMenuPresetsFakeAdmin = MakeAction(m_pMenuPresetsAdmin, m_pMenuPresets, tr("Emulate Admin Rights"), 1 | 2);
if (theAPI->IsRunningAsAdmin()) {
m_pMenuPresetsNoAdmin->setEnabled(false);
m_pMenuPresetsFakeAdmin->setEnabled(false);
}
connect(m_pMenuPresetsAdmin, SIGNAL(triggered(QAction*)), this, SLOT(OnSandBoxAction(QAction*)));
m_pMenuPresets->addSeparator();

View File

@ -4,6 +4,7 @@
#include "../QSbieAPI/SbieAPI.h"
#include "..\Models\TraceModel.h"
#include "..\..\MiscHelpers\Common\Common.h"
#include "SbieView.h"
class CTraceFilterProxyModel : public CSortFilterProxyModel
{
@ -70,6 +71,9 @@ CTraceView::CTraceView(QWidget* parent) : CPanelWidget<QTreeViewEx>(parent)
connect(m_pTraceTid, SIGNAL(currentIndexChanged(int)), this, SLOT(OnSetTidFilter()));
m_pTraceToolBar->addWidget(m_pTraceTid);
m_pOnlyCurrent = new QCheckBox(tr("Show only sellectes box"));
m_pTraceToolBar->addWidget(m_pOnlyCurrent);
m_pMainLayout->setSpacing(0);
m_pMainLayout->insertWidget(0, m_pTraceToolBar);
@ -119,9 +123,13 @@ CTraceView::~CTraceView()
void CTraceView::Refresh()
{
QList<CSandBoxPtr>Boxes;
if(m_pOnlyCurrent->isChecked())
Boxes = theGUI->GetBoxView()->GetSelectedBoxes();
QList<CTraceEntryPtr> ResourceLog = theAPI->GetTrace();
//m_pTraceModel->Sync(ResourceLog, Pids);
QList<QVariant> Added = m_pTraceModel->Sync(ResourceLog);
QList<QVariant> Added = m_pTraceModel->Sync(ResourceLog, Boxes.count() == 1 ? Boxes.first().data() : NULL);
if (m_pTraceModel->IsTree())
{

View File

@ -31,6 +31,7 @@ protected:
QToolBar* m_pTraceToolBar;
QAction* m_pTraceTree;
QCheckBox* m_pOnlyCurrent;
QComboBox* m_pTracePid;
QComboBox* m_pTraceTid;

View File

@ -118,6 +118,7 @@ COptionsWindow::COptionsWindow(const QSharedPointer<CSbieIni>& pBox, const QStri
ui.chkShowForceTmpl->setEnabled(false);
ui.chkShowStopTmpl->setEnabled(false);
ui.chkShowAccessTmpl->setEnabled(false);
ui.chkShowRecoveryTmpl->setEnabled(false);
//ui.chkWithTemplates->setEnabled(false);
}
@ -256,6 +257,10 @@ COptionsWindow::COptionsWindow(const QSharedPointer<CSbieIni>& pBox, const QStri
connect(ui.treeAccess, SIGNAL(itemSelectionChanged()), this, SLOT(OnAccessSelectionChanged()));
//
// Resource Access
connect(ui.chkCloseForBox, SIGNAL(clicked(bool)), this, SLOT(OnAccessChanged()));
//
// Recovery
connect(ui.chkAutoRecovery, SIGNAL(clicked(bool)), this, SLOT(OnRecoveryChanged()));
connect(ui.btnAddRecovery, SIGNAL(clicked(bool)), this, SLOT(OnAddRecFolder()));
@ -282,6 +287,8 @@ COptionsWindow::COptionsWindow(const QSharedPointer<CSbieIni>& pBox, const QStri
connect(ui.chkAddToJob, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
connect(ui.chkDisableMonitor, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
connect(ui.chkCallTrace, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
connect(ui.chkFileTrace, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
connect(ui.chkPipeTrace, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
@ -328,12 +335,21 @@ COptionsWindow::COptionsWindow(const QSharedPointer<CSbieIni>& pBox, const QStri
connect(ui.buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked(bool)), this, SLOT(apply()));
connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(close()));
if (ReadOnly) {
if (ReadOnly)
{
ui.btnEditIni->setEnabled(false);
ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false);
}
if (theAPI->IsRunningAsAdmin())
{
ui.chkDropRights->setEnabled(false);
ui.chkFakeElevation->setEnabled(false);
}
else
ui.lblAdmin->setVisible(false);
OnTab(); // -> LoadConfig();
ui.treeAccess->viewport()->installEventFilter(this);
@ -538,20 +554,21 @@ void COptionsWindow::LoadConfig()
ui.lstAutoExec->clear();
ui.lstAutoExec->addItems(AutoExec);
bool bGlobalNoMon = m_pBox->GetAPI()->GetGlobalSettings()->GetBool("DisableResourceMonitor", false);
ui.chkDisableMonitor->setChecked(m_pBox->GetBool("DisableResourceMonitor", bGlobalNoMon));
ReadAdvancedCheck("CallTrace", ui.chkCallTrace, "*");
ReadAdvancedCheck("FileTrace", ui.chkFileTrace, "*");
ReadAdvancedCheck("PipeTrace", ui.chkPipeTrace, "*");
ReadAdvancedCheck("KeyTrace", ui.chkKeyTrace, "*");
ReadAdvancedCheck("IpcTrace", ui.chkIpcTrace, "*");
ReadAdvancedCheck("GuiTrace", ui.chkGuiTrace, "*");
ReadAdvancedCheck("ClsidTrace", ui.chkComTrace, "*");
ui.chkDbgTrace->setChecked(m_pBox->GetBool("DebugTrace", false));
ui.chkErrTrace->setChecked(m_pBox->GetBool("ErrorTrace", false));
QSharedPointer<CSandBoxPlus> pBoxPlus = m_pBox.objectCast<CSandBoxPlus>();
if (pBoxPlus)
{
ReadAdvancedCheck("CallTrace", ui.chkCallTrace, "*");
ReadAdvancedCheck("FileTrace", ui.chkFileTrace, "*");
ReadAdvancedCheck("PipeTrace", ui.chkPipeTrace, "*");
ReadAdvancedCheck("KeyTrace", ui.chkKeyTrace, "*");
ReadAdvancedCheck("IpcTrace", ui.chkIpcTrace, "*");
ReadAdvancedCheck("GuiTrace", ui.chkGuiTrace, "*");
ReadAdvancedCheck("ClsidTrace", ui.chkComTrace, "*");
ui.chkDbgTrace->setChecked(m_pBox->GetBool("DebugTrace", false));
ui.chkErrTrace->setChecked(m_pBox->GetBool("ErrorTrace", false));
ui.chkApiTrace->setChecked(pBoxPlus->HasLogApi());
}
ui.chkHideOtherBoxes->setChecked(m_pBox->GetBool("HideOtherBoxes", false));
QStringList Processes = m_pBox->GetTextList("HideHostProcess", m_Template);
@ -710,10 +727,10 @@ void COptionsWindow::SaveConfig()
WriteAdvancedCheck(ui.chkRestrictServices, "RunServicesAsSystem", "", "y");
WriteAdvancedCheck(ui.chkProtectSystem, "ExposeBoxedSystem", "", "y");
WriteAdvancedCheck(ui.chkOpenDevCMApi, "OpenDevCMApi", "n", "");
WriteAdvancedCheck(ui.chkOpenDevCMApi, "OpenDevCMApi", "y", "");
WriteAdvancedCheck(ui.chkOpenLsaSSPI, "BlockPassword", "n", ""); // OpenLsaSSPI
WriteAdvancedCheck(ui.chkOpenSamEndpoint, "OpenSamEndpoint", "n", "");
WriteAdvancedCheck(ui.chkOpenLsaEndpoint, "OpenLsaEndpoint", "n", "");
WriteAdvancedCheck(ui.chkOpenSamEndpoint, "OpenSamEndpoint", "y", "");
WriteAdvancedCheck(ui.chkOpenLsaEndpoint, "OpenLsaEndpoint", "y", "");
WriteAdvancedCheck(ui.chkAddToJob, "NoAddProcessToJob", "", "y");
@ -722,21 +739,20 @@ void COptionsWindow::SaveConfig()
AutoExec.append(ui.lstAutoExec->item(i)->text());
m_pBox->UpdateTextList("AutoExec", AutoExec, m_Template);
bool bGlobalNoMon = m_pBox->GetAPI()->GetGlobalSettings()->GetBool("DisableResourceMonitor", false);
WriteAdvancedCheck(ui.chkDisableMonitor, "DisableResourceMonitor", bGlobalNoMon ? "" : "y", bGlobalNoMon ? "n" : "");
WriteAdvancedCheck(ui.chkCallTrace, "CallTrace", "*");
WriteAdvancedCheck(ui.chkFileTrace, "FileTrace", "*");
WriteAdvancedCheck(ui.chkPipeTrace, "PipeTrace", "*");
WriteAdvancedCheck(ui.chkKeyTrace, "KeyTrace", "*");
WriteAdvancedCheck(ui.chkIpcTrace, "IpcTrace", "*");
WriteAdvancedCheck(ui.chkGuiTrace, "GuiTrace", "*");
WriteAdvancedCheck(ui.chkComTrace, "ClsidTrace", "*");
WriteAdvancedCheck(ui.chkDbgTrace, "DebugTrace", "y");
WriteAdvancedCheck(ui.chkErrTrace, "ErrorTrace", "y");
QSharedPointer<CSandBoxPlus> pBoxPlus = m_pBox.objectCast<CSandBoxPlus>();
if (pBoxPlus)
{
WriteAdvancedCheck(ui.chkCallTrace, "CallTrace", "*");
WriteAdvancedCheck(ui.chkFileTrace, "FileTrace", "*");
WriteAdvancedCheck(ui.chkPipeTrace, "PipeTrace", "*");
WriteAdvancedCheck(ui.chkKeyTrace, "KeyTrace", "*");
WriteAdvancedCheck(ui.chkIpcTrace, "IpcTrace", "*");
WriteAdvancedCheck(ui.chkGuiTrace, "GuiTrace", "*");
WriteAdvancedCheck(ui.chkComTrace, "ClsidTrace", "*");
WriteAdvancedCheck(ui.chkDbgTrace, "DebugTrace", "y");
WriteAdvancedCheck(ui.chkErrTrace, "ErrorTrace", "y");
pBoxPlus->SetLogApi(ui.chkApiTrace->isChecked());
}
WriteAdvancedCheck(ui.chkHideOtherBoxes, "HideOtherBoxes");
@ -1142,6 +1158,13 @@ void COptionsWindow::LoadForced()
foreach(const QString& Value, m_pBox->GetTextList("ForceFolder", m_Template))
AddForcedEntry(Value, 2);
LoadForcedTmpl();
m_ForcedChanged = false;
}
void COptionsWindow::LoadForcedTmpl(bool bUpdate)
{
if (ui.chkShowForceTmpl->isChecked())
{
foreach(const QString& Template, m_pBox->GetTemplates())
@ -1153,8 +1176,19 @@ void COptionsWindow::LoadForced()
AddForcedEntry(Value, 2, Template);
}
}
m_ForcedChanged = false;
else if (bUpdate)
{
for (int i = 0; i < ui.treeForced->topLevelItemCount(); )
{
QTreeWidgetItem* pItem = ui.treeForced->topLevelItem(i);
int Type = pItem->data(0, Qt::UserRole).toInt();
if (Type == -1) {
delete pItem;
continue; // entry from template
}
i++;
}
}
}
void COptionsWindow::AddForcedEntry(const QString& Name, int type, const QString& Template)
@ -1223,19 +1257,37 @@ void COptionsWindow::LoadStop()
foreach(const QString& Value, m_pBox->GetTextList("LeaderProcess", m_Template))
AddStopEntry(Value, 2);
LoadStopTmpl();
m_StopChanged = false;
}
void COptionsWindow::LoadStopTmpl(bool bUpdate)
{
if (ui.chkShowStopTmpl->isChecked())
{
foreach(const QString& Template, m_pBox->GetTemplates())
foreach(const QString & Template, m_pBox->GetTemplates())
{
foreach(const QString& Value, m_pBox->GetTextListTmpl("LingerProcess", Template))
foreach(const QString & Value, m_pBox->GetTextListTmpl("LingerProcess", Template))
AddStopEntry(Value, 1, Template);
foreach(const QString& Value, m_pBox->GetTextListTmpl("LeaderProcess", Template))
foreach(const QString & Value, m_pBox->GetTextListTmpl("LeaderProcess", Template))
AddStopEntry(Value, 2, Template);
}
}
m_StopChanged = false;
else if (bUpdate)
{
for (int i = 0; i < ui.treeStop->topLevelItemCount(); )
{
QTreeWidgetItem* pItem = ui.treeStop->topLevelItem(i);
int Type = pItem->data(0, Qt::UserRole).toInt();
if (Type == -1) {
delete pItem;
continue; // entry from template
}
i++;
}
}
}
void COptionsWindow::AddStopEntry(const QString& Name, int type, const QString& Template)
@ -1481,6 +1533,8 @@ QString COptionsWindow::AccessTypeToName(EAccessEntry Type)
void COptionsWindow::LoadAccessList()
{
ui.chkCloseForBox->setChecked(m_pBox->GetBool("AlwaysCloseForBoxed", true));
ui.treeAccess->clear();
for (int i = 0; i < eMaxAccessType; i++)
@ -1489,6 +1543,13 @@ void COptionsWindow::LoadAccessList()
ParseAndAddAccessEntry((EAccessEntry)i, Value);
}
LoadAccessListTmpl();
m_AccessChanged = false;
}
void COptionsWindow::LoadAccessListTmpl(bool bUpdate)
{
if (ui.chkShowAccessTmpl->isChecked())
{
foreach(const QString& Template, m_pBox->GetTemplates())
@ -1500,8 +1561,19 @@ void COptionsWindow::LoadAccessList()
}
}
}
m_AccessChanged = false;
else if (bUpdate)
{
for (int i = 0; i < ui.treeAccess->topLevelItemCount(); )
{
QTreeWidgetItem* pItem = ui.treeAccess->topLevelItem(i);
int Type = pItem->data(0, Qt::UserRole).toInt();
if (Type == -1) {
delete pItem;
continue; // entry from template
}
i++;
}
}
}
void COptionsWindow::ParseAndAddAccessEntry(EAccessEntry EntryType, const QString& Value, const QString& Template)
@ -1839,6 +1911,8 @@ void COptionsWindow::OnDelAccess()
void COptionsWindow::SaveAccessList()
{
WriteAdvancedCheck(ui.chkCloseForBox, "AlwaysCloseForBoxed", "", "n");
CloseAccessEdit(true);
QStringList Keys = QStringList() << "OpenFilePath" << "OpenPipePath" << "ClosedFilePath" << "ReadFilePath" << "WriteFilePath"
@ -1878,6 +1952,15 @@ void COptionsWindow::LoadRecoveryList()
foreach(const QString& Value, m_pBox->GetTextList("AutoRecoverIgnore", m_Template))
AddRecoveryEntry(Value, 2);
LoadRecoveryListTmpl();
ui.chkAutoRecovery->setChecked(m_pBox->GetBool("AutoRecover", false));
m_RecoveryChanged = false;
}
void COptionsWindow::LoadRecoveryListTmpl(bool bUpdate)
{
if (ui.chkShowRecoveryTmpl->isChecked())
{
foreach(const QString& Template, m_pBox->GetTemplates())
@ -1889,10 +1972,19 @@ void COptionsWindow::LoadRecoveryList()
AddRecoveryEntry(Value, 2, Template);
}
}
ui.chkAutoRecovery->setChecked(m_pBox->GetBool("AutoRecover", false));
m_RecoveryChanged = false;
else if (bUpdate)
{
for (int i = 0; i < ui.treeRecovery->topLevelItemCount(); )
{
QTreeWidgetItem* pItem = ui.treeRecovery->topLevelItem(i);
int Type = pItem->data(0, Qt::UserRole).toInt();
if (Type == -1) {
delete pItem;
continue; // entry from template
}
i++;
}
}
}
void COptionsWindow::AddRecoveryEntry(const QString& Name, int type, const QString& Template)
@ -2165,7 +2257,7 @@ void COptionsWindow::LoadTemplates()
{
if (Category.isEmpty())
continue;
ui.cmbCategories->addItem(Category, Category);
ui.cmbCategories->addItem(GetCategoryName(Category), Category);
}
}
@ -2188,25 +2280,43 @@ void COptionsWindow::OnScreenReaders()
m_TemplatesChanged = true;
}
QString COptionsWindow::GetCategoryName(const QString& Category)
{
if (Category.compare("Local", Qt::CaseInsensitive) == 0) return tr("Custom Templates");
if (Category.compare("EmailReader", Qt::CaseInsensitive) == 0) return tr("Email Reader");
if (Category.compare("Print", Qt::CaseInsensitive) == 0) return tr("PDF/Print");
if (Category.compare("Security", Qt::CaseInsensitive) == 0) return tr("Security/Privacy");
if (Category.compare("Desktop", Qt::CaseInsensitive) == 0) return tr("Desktop Utilities");
if (Category.compare("Download", Qt::CaseInsensitive) == 0) return tr("Download Managers");
if (Category.compare("Misc", Qt::CaseInsensitive) == 0) return tr("Miscellaneous");
if (Category.compare("WebBrowser", Qt::CaseInsensitive) == 0) return tr("Web Browser");
if (Category.compare("MediaPlayer", Qt::CaseInsensitive) == 0) return tr("Media Player");
if (Category.compare("TorrentClient", Qt::CaseInsensitive) == 0) return tr("Torrent Client");
return Category;
}
void COptionsWindow::ShowTemplates()
{
ui.treeTemplates->clear();
QString Category = ui.cmbCategories->currentData().toString();
QString Filter = ui.txtTemplates->text();
QString CategoryFilter = ui.cmbCategories->currentData().toString();
QString TextFilter = ui.txtTemplates->text();
for (QMultiMap<QString, QPair<QString, QString>>::iterator I = m_AllTemplates.begin(); I != m_AllTemplates.end(); ++I)
{
if (!Category.isEmpty() && I.key().compare(Category, Qt::CaseInsensitive) != 0)
if (!CategoryFilter.isEmpty() && I.key().compare(CategoryFilter, Qt::CaseInsensitive) != 0)
continue;
QString Name = I.value().first.mid(9);
if (!Name.isEmpty() && Name.indexOf(Filter, 0, Qt::CaseInsensitive) == -1)
if (!Name.isEmpty() && Name.indexOf(TextFilter, 0, Qt::CaseInsensitive) == -1)
continue;
if (I.key().isEmpty())
continue; // dont show templates without a category (these are usually deprecated templates)
QTreeWidgetItem* pItem = new QTreeWidgetItem();
pItem->setText(0, I.key());
pItem->setText(0, GetCategoryName(I.key()));
pItem->setData(1, Qt::UserRole, I.value().first);
pItem->setText(1, I.value().second);
//pItem->setFlags(pItem->flags() | Qt::ItemIsUserCheckable);

View File

@ -45,12 +45,12 @@ private slots:
void OnForceProg();
void OnForceDir();
void OnDelForce();
void OnShowForceTmpl() { LoadForced(); }
void OnShowForceTmpl() { LoadForcedTmpl(true); }
void OnAddLingering();
void OnAddLeader();
void OnDelStopProg();
void OnShowStopTmpl() { LoadStop(); }
void OnShowStopTmpl() { LoadStopTmpl(true); }
void OnRestrictStart();
void OnAddStartProg();
@ -72,13 +72,13 @@ private slots:
void OnAddWnd() { AddAccessEntry(eWnd, eDirect, "", ""); }
void OnAddCOM() { AddAccessEntry(eCOM, eDirect, "", ""); }
void OnDelAccess();
void OnShowAccessTmpl() { LoadAccessList(); }
void OnShowAccessTmpl() { LoadAccessListTmpl(true); }
void OnAddRecFolder();
void OnAddRecIgnore();
void OnAddRecIgnoreExt();
void OnDelRecEntry();
void OnShowRecoveryTmpl() { LoadRecoveryList(); }
void OnShowRecoveryTmpl() { LoadRecoveryListTmpl(true); }
void OnAddAutoExec();
void OnDelAutoExec();
@ -106,6 +106,7 @@ private slots:
//void OnRestrictionChanged() { m_RestrictionChanged = true; }
void OnINetBlockChanged() { m_INetBlockChanged = true; }
void OnRecoveryChanged() { m_RecoveryChanged = true; }
void OnAccessChanged() { m_AccessChanged = true; }
void OnAdvancedChanged();
void OnDebugChanged();
@ -186,15 +187,18 @@ protected:
void SaveGroups();
void LoadForced();
void LoadForcedTmpl(bool bUpdate = false);
void AddForcedEntry(const QString& Name, int type, const QString& Template = QString());
void SaveForced();
void LoadStop();
void LoadStopTmpl(bool bUpdate = false);
void AddStopEntry(const QString& Name, int type, const QString& Template = QString());
void SaveStop();
QString AccessTypeToName(EAccessEntry Type);
void LoadAccessList();
void LoadAccessListTmpl(bool bUpdate = false);
QString GetAccessTypeStr(EAccessType Type);
QString GetAccessModeStr(EAccessMode Mode);
void ParseAndAddAccessEntry(EAccessEntry EntryType, const QString& Value, const QString& Template = QString());
@ -208,6 +212,7 @@ protected:
void CloseAccessEdit(QTreeWidgetItem* pItem, bool bSave = true);
void LoadRecoveryList();
void LoadRecoveryListTmpl(bool bUpdate = false);
void AddRecoveryEntry(const QString& Name, int type, const QString& Template = QString());
void SaveRecoveryList();
@ -222,6 +227,8 @@ protected:
void LoadIniSection();
void SaveIniSection();
QString GetCategoryName(const QString& Category);
bool m_ConfigDirty;
QColor m_BorderColor;

View File

@ -287,7 +287,7 @@ void CPopUpWindow::SendPromptResult(CPopUpPrompt* pEntry, int retval)
pEntry->m_pProcess.objectCast<CSbieProcess>()->SetRememberedAction(pEntry->m_Result["id"].toInt(), retval);
}
void CPopUpWindow::AddFileToRecover(const QString& FilePath, const QString& BoxName, quint32 ProcessId)
void CPopUpWindow::AddFileToRecover(const QString& FilePath, QString BoxPath, const QString& BoxName, quint32 ProcessId)
{
CSandBoxPtr pBox = theAPI->GetBoxByName(BoxName);
if (!pBox.isNull() && pBox.objectCast<CSandBoxPlus>()->IsRecoverySuspended())
@ -299,7 +299,10 @@ void CPopUpWindow::AddFileToRecover(const QString& FilePath, const QString& BoxN
.arg(FilePath.mid(FilePath.lastIndexOf("\\") + 1)).arg(QString(BoxName).replace("_", " "))
.arg(pProcess.isNull() ? tr("an UNKNOWN process.") : tr("%1 (%2)").arg(pProcess->GetProcessName()).arg(pProcess->GetProcessId()));
CPopUpRecovery* pEntry = new CPopUpRecovery(Message, FilePath, BoxName, this);
if (BoxPath.isEmpty()) // legacy case, no BoxName, no support for driver serial numbers
BoxPath = theAPI->GetBoxedPath(BoxName, FilePath);
CPopUpRecovery* pEntry = new CPopUpRecovery(Message, FilePath, BoxPath, BoxName, this);
QStringList RecoverTargets = theAPI->GetUserSettings()->GetTextList("SbieCtrl_RecoverTarget", true);
pEntry->m_pTarget->insertItems(pEntry->m_pTarget->count()-1, RecoverTargets);
@ -352,10 +355,10 @@ void CPopUpWindow::OnRecoverFile(int Action)
}
QString FileName = pEntry->m_FilePath.mid(pEntry->m_FilePath.lastIndexOf("\\") + 1);
QString BoxedFilePath = theAPI->GetBoxedPath(pEntry->m_BoxName, pEntry->m_FilePath);
//QString BoxedFilePath = theAPI->GetBoxedPath(pEntry->m_BoxName, pEntry->m_FilePath); // pEntry->m_BoxPath
QList<QPair<QString, QString>> FileList;
FileList.append(qMakePair(BoxedFilePath, RecoveryFolder + "\\" + FileName));
FileList.append(qMakePair(pEntry->m_BoxPath, RecoveryFolder + "\\" + FileName));
SB_PROGRESS Status = theGUI->RecoverFiles(FileList, Action);
if (Status.GetStatus() == OP_ASYNC)

View File

@ -215,10 +215,11 @@ class CPopUpRecovery : public CPopUpEntry
{
Q_OBJECT
public:
CPopUpRecovery(const QString& Message, const QString& FilePath, const QString& BoxName, QWidget* parent = 0) : CPopUpEntry(Message, parent)
CPopUpRecovery(const QString& Message, const QString& FilePath, const QString& BoxPath, const QString& BoxName, QWidget* parent = 0) : CPopUpEntry(Message, parent)
{
m_BoxName = BoxName;
m_FilePath = FilePath;
m_BoxPath = BoxPath;
QLabel* pLabel = new QLabel(Message);
pLabel->setToolTip(Message);
@ -323,6 +324,7 @@ protected:
}
QString m_FilePath;
QString m_BoxPath;
QString m_BoxName;
QComboBox* m_pTarget;
int m_LastTargetIndex;
@ -416,7 +418,7 @@ public:
virtual void AddLogMessage(const QString& Message, quint32 MsgCode, const QStringList& MsgData, quint32 ProcessId);
virtual void AddUserPrompt(quint32 RequestId, const QVariantMap& Data, quint32 ProcessId);
virtual void AddFileToRecover(const QString& FilePath, const QString& BoxName, quint32 ProcessId);
virtual void AddFileToRecover(const QString& FilePath, QString BoxPath, const QString& BoxName, quint32 ProcessId);
virtual void ShowProgress(quint32 MsgCode, const QStringList& MsgData, quint32 ProcessId);
static void SetDarkMode(bool bDark) { extern bool CPopUpWindow__DarkMode; CPopUpWindow__DarkMode = bDark; }

View File

@ -78,8 +78,10 @@ CRecoveryWindow::CRecoveryWindow(const CSandBoxPtr& pBox, QWidget *parent)
foreach(const QString& NtFolder, m_pBox->GetTextList("RecoverFolder", true, true))
{
QString Folder = theAPI->Nt2DosPath(NtFolder);
m_RecoveryFolders.append(Folder);
bool bOk;
QString Folder = theAPI->Nt2DosPath(NtFolder, &bOk);
if(bOk)
m_RecoveryFolders.append(Folder);
}
}
@ -137,14 +139,24 @@ int CRecoveryWindow::FindFiles()
if (ui.chkShowAll->isChecked())
{
for(char drive = 'A'; drive <= 'Z'; drive++)
Count += FindBoxFiles("\\drive\\" + QString(drive));
//for(char drive = 'A'; drive <= 'Z'; drive++)
QDir Dir(m_pBox->GetFileRoot() + "\\drive\\");
foreach(const QFileInfo & Info, Dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot))
Count += FindBoxFiles("\\drive\\" + Info.fileName());
if (m_pBox->GetBool("SeparateUserFolders", true)) {
Count += FindBoxFiles("\\user\\current");
Count += FindBoxFiles("\\user\\all");
Count += FindBoxFiles("\\user\\public");
}
Count += FindBoxFiles("\\share");
//Count += FindBoxFiles("\\share");
QDir DirSvr(m_pBox->GetFileRoot() + "\\share\\");
foreach(const QFileInfo & InfoSrv, DirSvr.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot)) {
QDir DirPub(m_pBox->GetFileRoot() + "\\share\\" + InfoSrv.fileName());
foreach(const QFileInfo & InfoPub, DirPub.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot))
Count += FindBoxFiles("\\share\\" + InfoSrv.fileName() + "\\" + InfoPub.fileName());
}
}
else
{
@ -159,12 +171,19 @@ int CRecoveryWindow::FindFiles()
int CRecoveryWindow::FindFiles(const QString& Folder)
{
//int Count = 0;
//foreach(const QString & Path, theAPI->GetBoxedPath(m_pBox, Folder))
// Count += FindFiles(Folder, Path, Folder);
//return Count;
return FindFiles(Folder, theAPI->GetBoxedPath(m_pBox, Folder), Folder);
}
int CRecoveryWindow::FindBoxFiles(const QString& Folder)
{
return FindFiles(Folder, m_pBox->GetFileRoot() + Folder, theAPI->GetRealPath(m_pBox, m_pBox->GetFileRoot() + Folder));
QString RealFolder = theAPI->GetRealPath(m_pBox, m_pBox->GetFileRoot() + Folder);
if (RealFolder.isEmpty())
return 0;
return FindFiles(Folder, m_pBox->GetFileRoot() + Folder, RealFolder);
}
int CRecoveryWindow::FindFiles(const QString& RecParent, const QString& BoxedFolder, const QString& RealFolder)
@ -225,7 +244,7 @@ int CRecoveryWindow::FindFiles(const QString& RecParent, const QString& BoxedFol
void CRecoveryWindow::RecoverFiles(bool bBrowse)
{
bool HasShare = false;
//bool HasShare = false;
QMap<QString, QString> FileMap;
foreach(const QModelIndex& Index, ui.treeFiles->selectionModel()->selectedIndexes())
{
@ -239,8 +258,8 @@ void CRecoveryWindow::RecoverFiles(bool bBrowse)
if (!File["ParentID"].isNull())
{
if (File["DiskPath"].toString().indexOf("\\device\\mup", 0, Qt::CaseInsensitive) == 0)
HasShare = true;
//if (File["DiskPath"].toString().indexOf("\\device\\mup", 0, Qt::CaseInsensitive) == 0)
// HasShare = true;
FileMap[File["BoxPath"].toString()] = File["DiskPath"].toString();
}
else
@ -254,18 +273,18 @@ void CRecoveryWindow::RecoverFiles(bool bBrowse)
if (File.isEmpty())
continue;
if (File["DiskPath"].toString().indexOf("\\device\\mup") == 0)
HasShare = true;
//if (File["DiskPath"].toString().indexOf("\\device\\mup") == 0)
// HasShare = true;
FileMap[File["BoxPath"].toString()] = File["DiskPath"].toString();
}
}
}
if (HasShare && !bBrowse) {
/*if (HasShare && !bBrowse) {
QMessageBox::warning(this, "Sandboxie-Plus", tr("One or more selected files are located on a network share, and must be recovered to a local drive, please select a folder to recover all selected files to."));
bBrowse = true;
}
}*/
QString RecoveryFolder;

View File

@ -285,10 +285,10 @@ void CSettingsWindow::apply()
QStringList Rejected;
for (int i = 0; i < ui.treeCompat->topLevelItemCount(); i++) {
QTreeWidgetItem* pItem = ui.treeCompat->topLevelItem(i);
if (pItem->checkState(0) == Qt::Checked)
Used.append(pItem->data(0, Qt::UserRole).toString());
else
if (pItem->checkState(0) == Qt::Unchecked)
Rejected.append(pItem->data(0, Qt::UserRole).toString());
else
Used.append(pItem->data(0, Qt::UserRole).toString());
}
theAPI->GetGlobalSettings()->UpdateTextList("Template", Used, false);
@ -370,7 +370,12 @@ void CSettingsWindow::OnTab()
QTreeWidgetItem* pItem = new QTreeWidgetItem();
pItem->setText(0, Title);
pItem->setData(0, Qt::UserRole, I.key());
pItem->setCheckState(0, (I.value() & CSbieTemplates::eDisabled) == 0 ? Qt::Checked : Qt::Unchecked);
if((I.value() & CSbieTemplates::eDisabled) != 0)
pItem->setCheckState(0, Qt::Unchecked);
else if((I.value() & CSbieTemplates::eEnabled) != 0)
pItem->setCheckState(0, Qt::Checked);
else
pItem->setCheckState(0, Qt::PartiallyChecked);
ui.treeCompat->addTopLevelItem(pItem);
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -266,6 +266,62 @@
<source>COM Object</source>
<translation>COM объект</translation>
</message>
<message>
<source>Custom Templates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Email Reader</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>PDF/Print</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Security/Privacy</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Desktop Utilities</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download Managers</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Miscellaneous</source>
<translation type="unfinished">Разное</translation>
</message>
<message>
<source>Web Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Media Player</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Torrent Client</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enter the template identifier</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only local templates can be removed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Do you really want to delete the selected local template?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CPopUpMessage</name>
@ -416,27 +472,47 @@
<message>
<source>Do you want to allow %4 (%5) to copy a %1 large file into sandbox: %2?
File name: %3</source>
<translation>Разрешить %4 (%5) копировать большой файл %1 в песочницу: %2?
<translation type="vanished">Разрешить %4 (%5) копировать большой файл %1 в песочницу: %2?
Имя файла: %3</translation>
</message>
<message>
<source>Do you want to allow %1 (%2) access to the internet?
Full path: %3</source>
<translation>Вы хотите разрешить %1 (%2) доступ к Интернету?
<translation type="vanished">Вы хотите разрешить %1 (%2) доступ к Интернету?
Полный путь: %3</translation>
</message>
<message>
<source>%1 is eligible for quick recovery from %2.
The file was written by: %3</source>
<translation>%1 может быть быстро восстановлен из %2.
<translation type="vanished">%1 может быть быстро восстановлен из %2.
Файл был записан: %3</translation>
</message>
<message>
<source>Migrating a large file %1 into the sandbox %2, %3 left.
Full path: %4</source>
<translation>Перенос большого файла %1 в песочницу %2, осталось %3.
<translation type="vanished">Перенос большого файла %1 в песочницу %2, осталось %3.
Полный путь: %4</translation>
</message>
<message>
<source>Do you want to allow %4 (%5) to copy a %1 large file into sandbox: %2?
File name: %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Do you want to allow %1 (%2) access to the internet?
Full path: %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 is eligible for quick recovery from %2.
The file was written by: %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Migrating a large file %1 into the sandbox %2, %3 left.
Full path: %4</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CRecoveryWindow</name>
@ -473,27 +549,27 @@ Full path: %4</source>
<name>CResMonModel</name>
<message>
<source>Type</source>
<translation>Тип</translation>
<translation type="vanished">Тип</translation>
</message>
<message>
<source>Value</source>
<translation>Значение</translation>
<translation type="vanished">Значение</translation>
</message>
<message>
<source>Status</source>
<translation>Статус</translation>
<translation type="vanished">Статус</translation>
</message>
<message>
<source>Time Stamp</source>
<translation>Временная метка</translation>
<translation type="vanished">Временная метка</translation>
</message>
<message>
<source>Process</source>
<translation>Процесс</translation>
<translation type="vanished">Процесс</translation>
</message>
<message>
<source>Unknown</source>
<translation>Неизвестно</translation>
<translation type="vanished">Неизвестно</translation>
</message>
</context>
<context>
@ -667,7 +743,7 @@ Full path: %4</source>
</message>
<message>
<source>Sandboxie-Plus was running in portable mode, now it has to clean up the created services. This will prompt for administrative privileges.</source>
<translation>Sandboxie-Plus работал в портативном режиме, теперь нужно очистить созданные службы. Это потребует административных привилегий.</translation>
<translation type="vanished">Sandboxie-Plus работал в портативном режиме, теперь нужно очистить созданные службы. Это потребует административных привилегий.</translation>
</message>
<message>
<source> - Portable</source>
@ -705,7 +781,7 @@ Full path: %4</source>
</message>
<message>
<source>Resource Logging</source>
<translation>Ведение журнала ресурсов</translation>
<translation type="vanished">Ведение журнала ресурсов</translation>
</message>
<message>
<source>Online Documentation</source>
@ -741,7 +817,7 @@ Full path: %4</source>
</message>
<message>
<source>Resource Monitor</source>
<translation>Монитор ресурсов</translation>
<translation type="vanished">Монитор ресурсов</translation>
</message>
<message>
<source>A sandbox must be emptied before it can be deleted.</source>
@ -1111,6 +1187,20 @@ Full path: %4</source>
<source>Cleanup Trace Log</source>
<translation>Очистка журнала трассировки</translation>
</message>
<message>
<source>Trace Log</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Trace Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sandboxie-Plus was running in portable mode, now it has to clean up the created services. This will prompt for administrative privileges.
Do you want to do the clean up?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CSbieModel</name>
@ -1153,6 +1243,126 @@ Full path: %4</source>
<source>Running</source>
<translation>Выполняется</translation>
</message>
<message>
<source>Sbie RpcSs</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sbie DcomLaunch</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sbie Crypto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sbie WuAu Svc</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sbie BITS</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sbie Svc</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Msi Installer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Trusted Installer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Windows Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Windows Explorer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Internet Explorer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FireFox</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Windows Media Player</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WinAmp</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>KM Player</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Windows Live Mail</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Service Model Reg</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>RunDll32</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>DllHost</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Windows Ink Services</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chromium Based</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Google Updater</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Acrobat Reader</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MS Outlook</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MS Excel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Flash Player</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FireFox Plugin Container</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Generic Web Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Generic Mail Client</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> (%1)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CSbieView</name>
@ -1464,6 +1674,68 @@ Full path: %4</source>
<translation>Пожалуйста, введите имя для нового снимка.</translation>
</message>
</context>
<context>
<name>CTraceModel</name>
<message>
<source>Unknown</source>
<translation type="unfinished">Неизвестно</translation>
</message>
<message>
<source>%1 (%2)</source>
<translation type="unfinished">%1 (%2)</translation>
</message>
<message>
<source>Process %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thread %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Process</source>
<translation type="unfinished">Процесс</translation>
</message>
<message>
<source>Type</source>
<translation type="unfinished">Тип</translation>
</message>
<message>
<source>Status</source>
<translation type="unfinished">Статус</translation>
</message>
<message>
<source>Value</source>
<translation type="unfinished">Значение</translation>
</message>
</context>
<context>
<name>CTraceView</name>
<message>
<source>Show as task tree</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>PID:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[All]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TID:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 (%2)</source>
<translation type="unfinished">%1 (%2)</translation>
</message>
<message>
<source>%1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewBoxWindow</name>
<message>
@ -1550,7 +1822,7 @@ Full path: %4</source>
&apos;Direct&apos; File and Key access only applies to program binaries located outside the sandbox.
Note that all Close...=!&lt;program&gt;,... exclusions have the same limitations.
For files access you can use &apos;Direct All&apos; instead to make it apply to all programs.</source>
<translation>Настройте, какие процессы могут получить доступ к каким ресурсам. Дважды щелкните запись, чтобы отредактировать ее.
<translation type="vanished">Настройте, какие процессы могут получить доступ к каким ресурсам. Дважды щелкните запись, чтобы отредактировать ее.
&apos;Direct&apos; доступ к файлам и ключам применяется только к двоичным файлам программ, расположенным за пределами песочницы.
Обратите внимание, что все Close...=!&lt;program&gt;,... исключения имеют те же ограничения.
Для доступа к файлам вы можете использовать &apos;Direct All&apos; вместо этого, чтобы применить его ко всем программам.</translation>
@ -2008,7 +2280,7 @@ Note: Forced Programs and Force Folders settings for a sandbox do not apply to
</message>
<message>
<source>Allow access to Smart Cards</source>
<translation>Разрешить доступ к смарт-картам</translation>
<translation type="vanished">Разрешить доступ к смарт-картам</translation>
</message>
<message>
<source>Sandbox isolation</source>
@ -2024,7 +2296,7 @@ Note: Forced Programs and Force Folders settings for a sandbox do not apply to
</message>
<message>
<source>Allow access to Bluetooth</source>
<translation>Разрешить доступ к Bluetooth</translation>
<translation type="vanished">Разрешить доступ к Bluetooth</translation>
</message>
<message>
<source>Elevation restrictions</source>
@ -2082,6 +2354,102 @@ Note: Forced Programs and Force Folders settings for a sandbox do not apply to
<source>Ntdll syscall Trace (creates a lot of output)</source>
<translation>Трассировка системных вызовов Ntdll (создает много выходных данных)</translation>
</message>
<message>
<source>Prompt user for large file migration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Block read access to the clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Configure which processes can access what resources. Double click on an entry to edit it.
&apos;Direct&apos; File and Key access only applies to program binaries located outside the sandbox.
For files access you can use &apos;Direct All&apos; instead to make it apply to all programs.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply Close...=!&lt;program&gt;,... directives also to all binaries located in the sandboxed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Emulate sandboxed window station for all processes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Isolation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Allow sandboxed programs to Change User Passwords and alike</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Various advanced isolation features can break compatibility, with some applications, if you are using this sandbox &lt;b&gt;NOT for Security&lt;/b&gt; but for simple application portability by changing these options you can restore compatibility by sacrificing some security.&lt;br&gt;These options can be used securely when you don&apos;t grant any of the sandboxed process admin rights.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Allow sandboxed programs to Managing Hardware/Devices</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open access to windows Security Account Manager</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open access to windows Local Security Authority</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Access isolation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Compatibility Templates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add Template</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove Template</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Template Folders</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Configure the folder locations used by your other applications.
Please note that this values are currently user specific and saved globally for all boxes.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Value</source>
<translation type="unfinished">Значение</translation>
</message>
<message>
<source>Accessibility</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>To compensate for the lost protection, please consult the Drop Rights settings page in the Restrictions settings group.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Screen Readers: JAWS, NVDA, Window-Eyes, System Access</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The following settings enable the use of Sandboxie in combination with accessibility software. Please note that some measure of Sandboxie protection is necessarily lost when these settings are in effect.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CAUTION: When running under the built in administrator, processes can not drop administrative privileges.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PopUpWindow</name>
@ -2101,23 +2469,23 @@ Note: Forced Programs and Force Folders settings for a sandbox do not apply to
<name>QPlatformTheme</name>
<message>
<source>Cancel</source>
<translation>Отмена</translation>
<translation type="vanished">Отмена</translation>
</message>
<message>
<source>Apply</source>
<translation>Применить</translation>
<translation type="vanished">Применить</translation>
</message>
<message>
<source>OK</source>
<translation>ОК</translation>
<translation type="vanished">ОК</translation>
</message>
<message>
<source>&amp;Yes</source>
<translation>&amp;Да</translation>
<translation type="vanished">&amp;Да</translation>
</message>
<message>
<source>&amp;No</source>
<translation>&amp;Нет</translation>
<translation type="vanished">&amp;Нет</translation>
</message>
</context>
<context>
@ -2207,7 +2575,7 @@ Note: Forced Programs and Force Folders settings for a sandbox do not apply to
</message>
<message>
<source>Use Dark Theme</source>
<translation>Использовать темную тему</translation>
<translation type="vanished">Использовать темную тему</translation>
</message>
<message>
<source>Enable</source>
@ -2337,6 +2705,10 @@ Note: Forced Programs and Force Folders settings for a sandbox do not apply to
<source>Other settings</source>
<translation>Другие настройки</translation>
</message>
<message>
<source>Use Dark Theme (fully applied after a restart)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SnapshotsWindow</name>

View File

@ -266,6 +266,62 @@
<source>COM Object</source>
<translation>COM Objesi</translation>
</message>
<message>
<source>Custom Templates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Email Reader</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>PDF/Print</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Security/Privacy</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Desktop Utilities</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download Managers</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Miscellaneous</source>
<translation type="unfinished">Çeşitli</translation>
</message>
<message>
<source>Web Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Media Player</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Torrent Client</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enter the template identifier</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only local templates can be removed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Do you really want to delete the selected local template?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CPopUpMessage</name>
@ -493,27 +549,27 @@ Full path: %4</source>
<name>CResMonModel</name>
<message>
<source>Type</source>
<translation>Tür</translation>
<translation type="vanished">Tür</translation>
</message>
<message>
<source>Value</source>
<translation>Değer</translation>
<translation type="vanished">Değer</translation>
</message>
<message>
<source>Status</source>
<translation>Durum</translation>
<translation type="vanished">Durum</translation>
</message>
<message>
<source>Time Stamp</source>
<translation>Zaman Damgası</translation>
<translation type="vanished">Zaman Damgası</translation>
</message>
<message>
<source>Process</source>
<translation>İşlem</translation>
<translation type="vanished">İşlem</translation>
</message>
<message>
<source>Unknown</source>
<translation>Bilinmeyen</translation>
<translation type="vanished">Bilinmeyen</translation>
</message>
</context>
<context>
@ -687,7 +743,7 @@ Full path: %4</source>
</message>
<message>
<source>Sandboxie-Plus was running in portable mode, now it has to clean up the created services. This will prompt for administrative privileges.</source>
<translation>Sandboxie-Plus taşınabilir modda çalışıyordu, şimdi oluşturulan hizmetleri temizlemesi gerekiyor. Bu, yönetici ayrıcalıkları isteyecektir.</translation>
<translation type="vanished">Sandboxie-Plus taşınabilir modda çalışıyordu, şimdi oluşturulan hizmetleri temizlemesi gerekiyor. Bu, yönetici ayrıcalıkları isteyecektir.</translation>
</message>
<message>
<source> - Portable</source>
@ -725,7 +781,7 @@ Full path: %4</source>
</message>
<message>
<source>Resource Logging</source>
<translation>Kaynak Günlüğü</translation>
<translation type="vanished">Kaynak Günlüğü</translation>
</message>
<message>
<source>Online Documentation</source>
@ -761,7 +817,7 @@ Full path: %4</source>
</message>
<message>
<source>Resource Monitor</source>
<translation>Kaynak İzleme</translation>
<translation type="vanished">Kaynak İzleme</translation>
</message>
<message>
<source>A sandbox must be emptied before it can be deleted.</source>
@ -1131,6 +1187,20 @@ Full path: %4</source>
<source>Cleanup Trace Log</source>
<translation>İzleme Günlüğünü Temizle</translation>
</message>
<message>
<source>Trace Log</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Trace Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sandboxie-Plus was running in portable mode, now it has to clean up the created services. This will prompt for administrative privileges.
Do you want to do the clean up?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CSbieModel</name>
@ -1173,6 +1243,126 @@ Full path: %4</source>
<source>Running</source>
<translation>Çalışıyor</translation>
</message>
<message>
<source>Sbie RpcSs</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sbie DcomLaunch</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sbie Crypto</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sbie WuAu Svc</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sbie BITS</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sbie Svc</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Msi Installer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Trusted Installer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Windows Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Windows Explorer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Internet Explorer</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FireFox</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Windows Media Player</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>WinAmp</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>KM Player</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Windows Live Mail</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Service Model Reg</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>RunDll32</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>DllHost</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Windows Ink Services</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Chromium Based</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Google Updater</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Acrobat Reader</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MS Outlook</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>MS Excel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Flash Player</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>FireFox Plugin Container</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Generic Web Browser</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Generic Mail Client</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> (%1)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CSbieView</name>
@ -1488,6 +1678,68 @@ Full path: %4</source>
<translation>Lütfen yeni Anlık Görüntü için bir ad girin.</translation>
</message>
</context>
<context>
<name>CTraceModel</name>
<message>
<source>Unknown</source>
<translation type="unfinished">Bilinmeyen</translation>
</message>
<message>
<source>%1 (%2)</source>
<translation type="unfinished">%1 (%2)</translation>
</message>
<message>
<source>Process %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Thread %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Process</source>
<translation type="unfinished">İşlem</translation>
</message>
<message>
<source>Type</source>
<translation type="unfinished">Tür</translation>
</message>
<message>
<source>Status</source>
<translation type="unfinished">Durum</translation>
</message>
<message>
<source>Value</source>
<translation type="unfinished">Değer</translation>
</message>
</context>
<context>
<name>CTraceView</name>
<message>
<source>Show as task tree</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>PID:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[All]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TID:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 (%2)</source>
<translation type="unfinished">%1 (%2)</translation>
</message>
<message>
<source>%1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewBoxWindow</name>
<message>
@ -1574,7 +1826,7 @@ Full path: %4</source>
&apos;Direct&apos; File and Key access only applies to program binaries located outside the sandbox.
Note that all Close...=!&lt;program&gt;,... exclusions have the same limitations.
For files access you can use &apos;Direct All&apos; instead to make it apply to all programs.</source>
<translation>Hangi işlemlerin hangi kaynaklara erişebileceğini yapılandırın. Düzenlemek için bir girişi çift tıklayın.
<translation type="vanished">Hangi işlemlerin hangi kaynaklara erişebileceğini yapılandırın. Düzenlemek için bir girişi çift tıklayın.
&apos;Doğrudan&apos; Dosya ve Anahtar erişimi, yalnızca sanal alanın dışında bulunan program ikili dosyaları için geçerlidir.
Tüm...=!&lt;program&gt;,... kapat istisnalarının aynı sınırlamalara sahip olduğunu unutmayın.
Dosyalara erişim için tek tek tüm programlara uygulamak yerine &apos;Tümünü Yönlendir&apos; kullanabilirsiniz.</translation>
@ -2040,7 +2292,7 @@ Not: Bir korumalı kutuya ilişkin Zorlanmış Programlar ve Zorlanmış Dizinle
</message>
<message>
<source>Allow access to Smart Cards</source>
<translation>Akıllı Kartlara erişime izin ver</translation>
<translation type="vanished">Akıllı Kartlara erişime izin ver</translation>
</message>
<message>
<source>Lift security restrictions</source>
@ -2060,7 +2312,7 @@ Not: Bir korumalı kutuya ilişkin Zorlanmış Programlar ve Zorlanmış Dizinle
</message>
<message>
<source>Allow access to Bluetooth</source>
<translation>Bluetooth erişimine izin ver</translation>
<translation type="vanished">Bluetooth erişimine izin ver</translation>
</message>
<message>
<source>Log all SetError&apos;s to Trace log</source>
@ -2122,6 +2374,102 @@ Not: Bir korumalı kutuya ilişkin Zorlanmış Programlar ve Zorlanmış Dizinle
<source>Ntdll syscall Trace (creates a lot of output)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Prompt user for large file migration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Block read access to the clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Configure which processes can access what resources. Double click on an entry to edit it.
&apos;Direct&apos; File and Key access only applies to program binaries located outside the sandbox.
For files access you can use &apos;Direct All&apos; instead to make it apply to all programs.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Apply Close...=!&lt;program&gt;,... directives also to all binaries located in the sandboxed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Emulate sandboxed window station for all processes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Isolation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Allow sandboxed programs to Change User Passwords and alike</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Various advanced isolation features can break compatibility, with some applications, if you are using this sandbox &lt;b&gt;NOT for Security&lt;/b&gt; but for simple application portability by changing these options you can restore compatibility by sacrificing some security.&lt;br&gt;These options can be used securely when you don&apos;t grant any of the sandboxed process admin rights.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Allow sandboxed programs to Managing Hardware/Devices</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open access to windows Security Account Manager</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open access to windows Local Security Authority</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Access isolation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Compatibility Templates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add Template</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove Template</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Template Folders</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Configure the folder locations used by your other applications.
Please note that this values are currently user specific and saved globally for all boxes.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Value</source>
<translation type="unfinished">Değer</translation>
</message>
<message>
<source>Accessibility</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>To compensate for the lost protection, please consult the Drop Rights settings page in the Restrictions settings group.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Screen Readers: JAWS, NVDA, Window-Eyes, System Access</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The following settings enable the use of Sandboxie in combination with accessibility software. Please note that some measure of Sandboxie protection is necessarily lost when these settings are in effect.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>CAUTION: When running under the built in administrator, processes can not drop administrative privileges.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PopUpWindow</name>
@ -2247,7 +2595,7 @@ Not: Bir korumalı kutuya ilişkin Zorlanmış Programlar ve Zorlanmış Dizinle
</message>
<message>
<source>Use Dark Theme</source>
<translation>Koyu Tema Kullan</translation>
<translation type="vanished">Koyu Tema Kullan</translation>
</message>
<message>
<source>Enable</source>
@ -2377,6 +2725,10 @@ Not: Bir korumalı kutuya ilişkin Zorlanmış Programlar ve Zorlanmış Dizinle
<source>Other settings</source>
<translation>Diğer ayarlar</translation>
</message>
<message>
<source>Use Dark Theme (fully applied after a restart)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SnapshotsWindow</name>

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,8 @@
#pragma once
#define VERSION_MJR 0
#define VERSION_MIN 7
#define VERSION_REV 5
#define VERSION_MIN 8
#define VERSION_REV 0
#define VERSION_UPD 0
#ifndef STR