gpt4 book ai didi

c# - PssCreateSnapshot - 访问被拒绝的奇怪情况

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:05 27 4
gpt4 key购买 nike

我已经创建了一些代码,用于使用 PssCaptureSnapshot 执行进程克隆,然后执行克隆的小型转储。

但是,在某些进程中,我在运行 PssCaptureSnapshot(以提升的方式运行)时被拒绝访问。这根本不是问题,事实上,我无法执行克隆的进程也无法使用 ProcDump(来自 SysInternals 的工具)进行克隆。

但是,奇怪的是,如果我打开本地主机的 PowerShell PSSession 并从那里运行我的应用程序...创建克隆没有问题!

现在,我脑海中立刻浮现的是……特权。所以我检查了 PSSession 内部的权限与外部的权限,然后......宾果游戏! PSSession 几乎拥有人类已知的所有特权,而在 PSSession 之外,我只有少数特权。

没什么大不了的,我想...我会开始为自己分配权限,一次一个,在两者之间调用 PssCaptureSnapshot。当我不再被拒绝访问时,我知道我需要哪种特权!

这个计划是万无一失的。那是……直到我用完分配的权限并且我仍然被拒绝访问……

所以现在我真的很纠结:为什么它在 PSSession 内部工作而不是外部,当所有的特权(理论上)都相同时?我该如何进一步解决这个问题?

如有任何帮助,我们将不胜感激。

PS:如果您认为有帮助,我很乐意发布代码。但请记住,我的访问被拒绝,事实上它在 PSSession 内部工作但不在 之外,而且 ProcDump 也不能为这些进程创建克隆......我不认为代码是相关的。

编辑

whoami/all 的结果

本地 session :

USER INFORMATION
----------------

User Name SID
================== ===========================================
xxxxxxxxxxxxxxxxxx S-1-5-21-1509752874-53682476-648048294-1107


GROUP INFORMATION
-----------------
(listing only groups that appear in this session, but don't appear in the other)
NT AUTHORITY\REMOTE INTERACTIVE LOGON Well-known group S-1-5-14 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\INTERACTIVE Well-known group S-1-5-4 Mandatory group, Enabled by default, Enabled group
LOCAL Well-known group S-1-2-0


PRIVILEGES INFORMATION
----------------------

Privilege Name Description State
=============================== ========================================= ========
SeIncreaseQuotaPrivilege Adjust memory quotas for a process Disabled
SeSecurityPrivilege Manage auditing and security log Disabled
SeTakeOwnershipPrivilege Take ownership of files or other objects Disabled
SeLoadDriverPrivilege Load and unload device drivers Disabled
SeSystemProfilePrivilege Profile system performance Disabled
SeSystemtimePrivilege Change the system time Disabled
SeProfileSingleProcessPrivilege Profile single process Disabled
SeIncreaseBasePriorityPrivilege Increase scheduling priority Disabled
SeCreatePagefilePrivilege Create a pagefile Disabled
SeBackupPrivilege Back up files and directories Disabled
SeRestorePrivilege Restore files and directories Disabled
SeShutdownPrivilege Shut down the system Disabled
SeDebugPrivilege Debug programs Enabled
SeSystemEnvironmentPrivilege Modify firmware environment values Disabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeRemoteShutdownPrivilege Force shutdown from a remote system Disabled
SeUndockPrivilege Remove computer from docking station Disabled
SeManageVolumePrivilege Perform volume maintenance tasks Disabled
SeImpersonatePrivilege Impersonate a client after authentication Enabled
SeCreateGlobalPrivilege Create global objects Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled
SeTimeZonePrivilege Change the time zone Disabled
SeCreateSymbolicLinkPrivilege Create symbolic links Disabled

USER CLAIMS INFORMATION
-----------------------

User claims unknown.

Kerberos support for Dynamic Access Control on this device has been disabled.

在 PSSession 中:

USER INFORMATION
----------------

User Name SID
================== ===========================================
xxxxxxxxxxxxxxxxxx S-1-5-21-1509752874-53682476-648048294-1107


GROUP INFORMATION
-----------------
(listing only groups that appear in this session, but don't appear in the other)
NT AUTHORITY\NETWORK Well-known group S-1-5-2



PRIVILEGES INFORMATION
----------------------

Privilege Name Description State
=============================== ========================================= =======
SeIncreaseQuotaPrivilege Adjust memory quotas for a process Enabled
SeSecurityPrivilege Manage auditing and security log Enabled
SeTakeOwnershipPrivilege Take ownership of files or other objects Enabled
SeLoadDriverPrivilege Load and unload device drivers Enabled
SeSystemProfilePrivilege Profile system performance Enabled
SeSystemtimePrivilege Change the system time Enabled
SeProfileSingleProcessPrivilege Profile single process Enabled
SeIncreaseBasePriorityPrivilege Increase scheduling priority Enabled
SeCreatePagefilePrivilege Create a pagefile Enabled
SeBackupPrivilege Back up files and directories Enabled
SeRestorePrivilege Restore files and directories Enabled
SeShutdownPrivilege Shut down the system Enabled
SeDebugPrivilege Debug programs Enabled
SeSystemEnvironmentPrivilege Modify firmware environment values Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeRemoteShutdownPrivilege Force shutdown from a remote system Enabled
SeUndockPrivilege Remove computer from docking station Enabled
SeManageVolumePrivilege Perform volume maintenance tasks Enabled
SeImpersonatePrivilege Impersonate a client after authentication Enabled
SeCreateGlobalPrivilege Create global objects Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
SeTimeZonePrivilege Change the time zone Enabled
SeCreateSymbolicLinkPrivilege Create symbolic links Enabled

USER CLAIMS INFORMATION
-----------------------

User claims unknown.

Kerberos support for Dynamic Access Control on this device has been disabled.

最佳答案

在对 cogumel0 进行了相对较长的研究之后,我们找到了问题的确切根源。

首先我们发现PssCaptureSnapshot当且仅当它用 PSS_CAPTURE_VA_CLONE 调用时才会失败标志 - 因此用于捕获进程中所有可克隆页面的快照。

尽管我们有进程句柄和对进程的所有必需访问权限(比如 PROCESS_ALL_ACCESS)- 对于某些进程 PssCaptureSnapshot返回错误。为什么?

我注意到错误是仅当进程在某个作业中运行时。 (为了确定这一点,我们可以使用 IsProcessInJob )和 PssCaptureSnapshot在这种情况下可以返回 2 个不同的错误:

  • ERROR_NOT_ENOUGH_QUOTA - 我在 win8.1 和 win10 中查看 - 它为某些 chrome.exe 进程(不是全部)返回 say
  • ERROR_ACCESS_DENIED - 此错误仅在我们处理想要 snap - 在另一个 session 中运行(比较我们的过程)和这个仅在 win8.1 中 - 在 win10 中没有此错误,即使在工作和另一个 session 。

为了理解为什么会发生这种情况 - 需要看看如何 PssCaptureSnapshot内部工具PSS_CAPTURE_VA_CLONE语义。它通过 fork 目标进程(是的,在 windows 下 fork)来完成。为此任务使用了未记录的 ZwCreateProcessEx接口(interface)。当 SectionHandle == 0(win32 CreateProcess 总是在此处传递在 exe 文件上创建的部分(如果现在说完全正确 CreateProcess 使用另一个 api , 这是早)) ZwCreateProcessEx克隆(fork)进程(ParentProcess)而不是基于SectionHandle(基于一些 exe 文件)创建新进程

但是如果 ParentProcess 在工作中 - 子(我们的 fork )进程也将被放置在这个工作中。这可能是问题。

第一个作业可以限制作业中的进程数。如果说作业有此限制 - 作业中不超过 1 个进程 - ZwCreateProcessEx并因错误 STATUS_QUOTA_EXCEEDED 而失败 - 结果为 PssCaptureSnapshot返回给我们 ERROR_NOT_ENOUGH_QUOTA。这是 chrome.exe 案例 - 出于安全原因,一些 chrome 进程在作业中运行(限制在 1 个进程中)(此进程也有 Untrusted Mandatory Level 但这与问题)

但即使作业在 win8.1 中没有事件进程数限制(或者我们没有超过此限制)- 在作业中属于另一个 session - 调用失败并显示 STATUS_ACCESS_DENIED。为什么这个 ?这已经是内部实现细节,现在(在 Windows 10 中)它发生了变化——不再有这个错误——我们可以 fork 进程,即使它在工作和另一个 session 中。一些提示为什么我们可以得到 AssignProcessToJobObject页:

All processes within a job must run within the same session as the job.

所以这里有一些与作业对象和跨 session 相关的窗口限制。

如果有趣,如何在 Windows 8.1 上重现/测试此错误?在我看来,最简单的方法是——在 session 0 中运行一些 Windows 服务——该服务必须对系统不重要(很容易启动/停止它)并且有自己的 exe。对于我来说,“msdtc.exe”是完美的受害者。所以打开它,先尝试快照,然后放入作业中,然后再尝试快照。并查看不同的:

NTSTATUS status;
BOOLEAN b;
if (0 <= (status = RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, TRUE, FALSE, &b)))
{
// GetProcessIdByName custom function not shown here
if (ULONG dwProcessId = GetProcessIdByName(L"msdtc.exe"))
{
DbgPrint("found dwProcessId=%x\n", dwProcessId);

if (HANDLE hProcess = OpenProcess(PROCESS_CREATE_PROCESS|PROCESS_QUERY_LIMITED_INFORMATION |
PROCESS_SET_QUOTA|PROCESS_TERMINATE , FALSE, dwProcessId))
{
BOOL bInJob;

if (IsProcessInJob(hProcess, 0, &bInJob))
{
if (!bInJob)
{
HPSS SnapshotHandle;
ULONG err;
if (!(err = PssCaptureSnapshot(hProcess, PSS_CAPTURE_VA_CLONE, 0,&SnapshotHandle)))
{
PssFreeSnapshot(NtCurrentProcess(), SnapshotHandle);
}

DbgPrint("PssCaptureSnapshot=%u\n", err);

if (HANDLE hJob = CreateJobObject(0, 0))
{
bInJob = AssignProcessToJobObject(hJob, hProcess);
CloseHandle(hJob);

if (bInJob)
{
if (IsProcessInJob(hProcess, 0, &bInJob) && bInJob)
{
DbgPrint("process in job now!\n");

if (!(err = PssCaptureSnapshot(hProcess, PSS_CAPTURE_VA_CLONE, 0,&SnapshotHandle)))
{
PssFreeSnapshot(NtCurrentProcess(), SnapshotHandle);
}

DbgPrint("PssCaptureSnapshot=%u\n", err);
}
else
{
DbgPrint("process not in job !?\n");
}
}
else
{
DbgPrint("AssignProcessToJobObject error=%u\n", GetLastError());
}
}
else
{
DbgPrint("CreateJobObject error=%u\n", GetLastError());
}
}
else
{
DbgPrint("process already in job\n");
}
}
else
{
DbgPrint("IsProcessInJob error=%u\n", GetLastError());
}

CloseHandle(hProcess);
}
else
{
DbgPrint("OpenProcess error=%u\n", GetLastError());
}
}
}
else
{
DbgPrint("RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE)=%x\n", status);
}

在 Windows 8.1 中,我得到了下一个 dbgprint:

found dwProcessId=950
PssCaptureSnapshot=0
process in job now!
PssCaptureSnapshot=5

但在 windows 10 中是另外一张图:

found dwProcessId=4d0
PssCaptureSnapshot=0
process in job now!
PssCaptureSnapshot=0

这是 Windows 错误还是功能 - 很难说

关于c# - PssCreateSnapshot - 访问被拒绝的奇怪情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44067938/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com