如何通过名称调用NtOpenProcess打开进程?旧Windows语法疑问
Windows旧系统中NtOpenProcess的进程名称语法
在Windows 2000、Windows XP和Windows Server 2003这类旧系统中,NtOpenProcess支持通过对象名称打开进程,但该语法未被官方文档化。根据实际测试与逆向分析,正确的对象名称规则如下:
- 完整路径格式为
\Process\<PID的十六进制小写形式> - 必须以反斜杠开头,
Process是固定的对象目录名称,不可省略或修改 - PID需转换为无前缀、小写的十六进制字符串,不需要
0x这类前缀
修正后的代码示例
HANDLE handle = 0; WCHAR b[99]; wsprintfW(b, L"\\Process\\%x", GetCurrentProcessId()); // 补全开头反斜杠,使用小写十六进制PID UNICODE_STRING name; RtlInitUnicodeString(&name, b); OBJECT_ATTRIBUTES oa; InitializeObjectAttributes(&oa, &name, 0, NULL, NULL); NTSTATUS status = NtOpenProcess(&handle, SYNCHRONIZE, &oa, NULL); _tprintf(_T("%X %p\n"), status, handle);
额外说明
- 调用时必须保证
ClientId参数为NULL(示例代码已符合要求) - 该功能仅存在于上述旧版本系统中,后续Windows版本已移除通过名称打开进程的支持
- 需确保调用进程拥有足够权限打开目标进程,否则会返回权限不足的NTSTATUS码
内容的提问来源于stack exchange,提问作者Anders
相关产品推荐
相关产品推荐

