谁被允许写入分配的地址?

时间:2012-10-31 20:06:37

标签: windows winapi

我在Delphi中使用VirtualAllocEx在外部进程中保留内存,如下所示:

var
 p : pointer;
begin
 p := VirtualAllocEx(Process, nil, SizeOf(Integer), MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
end;

ProcessHandle之前已使用PROCESS_ALL_ACCESS打开。

之后,我的程序将一个简单的整数值写入分配的地址,如下所示:

WriteProcessMemory(Process, p, @MyInteger, SizeOf(Integer), BytesWritten);

由于地址存储在p中 - 我可以保存地址以将其用于其他应用程序。另一个应用程序必须再次打开外部进程以访问/写入外部进程中的地址。

我的问题是:谁/什么可以在外国过程中读/写这个地址?

是否允许每个进程都写入? 是否允许每个过程阅读? 只有拥有管理员权限的进程才有权读/写吗?

感谢您的回答。

3 个答案:

答案 0 :(得分:3)

任何具有授予读写访问权限的进程句柄的人都可以读取或写入内存。请参阅:PROCESS_VM_READPROCESS_VM_WRITE。因此,最终,它取决于您如何获得流程的处理以及该流程的DACL。

如果您创建了该过程或启用了SeDebugPrivilege,则通常可以获得所有访问权限。当您调用OpenProcess时,您必须指定所需的访问类型,并根据流程的安全描述符检查该请求。

答案 1 :(得分:2)

如果内存服务,Windows会将其归类为调试。

无论如何,您都可以调试自己的流程。

如果您被授予(并启用)SeDebugPrivilege,则可以调试其他用户的进程。

请注意,向帐户授予SeDebugPrivilege也基本上使其成为管理员帐户 - 即,如果已授予SeDebugPrivilege,则使用该帐户的人可以执行他们想要的任何操作,并启用他们自己选择的任何其他权限。 Ergo:除非你真的需要,否则不要授予它(除非你正在做类似调试系统服务流程之类的东西,否则你可能不会这样做。)

答案 2 :(得分:1)

默认情况下,具有兼容完整性级别的任何内容都可以使用ReadProcessMemoryWriteProcessMemory。这意味着完整性级别大于或等于目标进程的级别。