Windows 中的持久共享内存

问题描述 投票:0回答:1

我想要一个在进程终止后仍然存在的命名共享内存区域。即使没有程序暂时打开句柄,内存区域和数据也应该是可访问的。只有重新启动才能“释放”共享资源。我该怎么做?

我当前的解决方案:带有打开句柄的保持活动进程。

winapi shared-memory
1个回答
0
投票

NtMakePermanentObject(HANDLE)
在已创建的命名对象上设置
OBJ_PERMANENT
属性,使其在所有句柄消失时不会消失。该功能是在 XP 中添加的。在NT所有版本中,如果使用NT原生API创建对象,也可以在创建对象时指定
OBJ_PERMANENT

不幸的是,如果您没有

OBJ_PERMANENT
SeCreatePermanentPrivilege
),这两种设置
SE_CREATE_PERMANENT_NAME
的方法都会失败,大多数帐户通常都没有,即使是管理员。解决方法包括:

  • 将权限添加到帐户。
  • 如果你可以创建服务,让一个服务以 NT AUTHORITY\SYSTEM 运行,它通常有权限,那就去做吧。
    • PsExec
      -s some.exe
      将以 SYSTEM 身份运行任何可执行文件;它创建了一个服务来在后台完成它。
  • 如果你有
    SeDebugPrivilege
    SE_DEBUG_NAME
    ),它可以让你绕过
    OpenProcess
    中的所有安全检查,你可以忘记
    OBJ_PERMANENT
    ,只需将对象的句柄复制到
    smss.exe
    winlogon.exe
    或其他东西.我之所以提到这一点,是因为对于管理员而言,
    SeDebugPrivilege
    似乎比
    SeCreatePermanentPrivilege
    更常见,这听起来很荒谬。

NtMakeTemporaryObject(HANDLE)
,清除
OBJ_PERMANENT
,存在于所有版本的NT中。它只需要一个具有删除权限的句柄,没有特殊权限。

© www.soinside.com 2019 - 2024. All rights reserved.