找NT!openprocess的当前和起源地址

今天学了下找NT!openprocess的地址 当前地址和起源地址 为什么有当前地址和起源 因为如果被SSDT被hook了地址就发生变化

 

第一个函数功能是找到OpenProcess在SSDT中的当前地址 并保存在szSSDT_NtOpenProcess中

第二个函数功能是找到OpenProcess在SSDT中的起源地址 并保存在szSSDT_OldNTOpenProcess中

 

szOldOpenProcess  dw 'N','t','O','p','e','n','P','r','o','c','e','s','s',0

.

.

.

szSSDT_NtOpenProcess dd ?

szSSDT_CurNTOpenProcess dd ?

.

.

.

_FindOpenSSDTaddr proc
pushad

mov eax,KeServiceDescriptorTable 

mov eax,dword ptr [eax]
mov eax,dword ptr [eax]

mov ebx,7ah
shl ebx,2

add eax,ebx
mov eax,dword ptr [eax]
mov szSSDT_NtOpenProcess,eax

popad
ret
_FindOpenSSDTaddr endp

 

_FindOpenSSDTOldaddr proc ;找到NT!OpenProcess在在SSDT中的起源地址 并保存在szSSDT_CurNTOpenProcess中
local OldOpenPrecessaddr:UNICODE_STRING
pushad
invoke RtlInitUnicodeString,addr OldOpenPrecessaddr,offset szOldOpenProcess
invoke MmGetSystemRoutineAddress,addr OldOpenPrecessaddr
mov szSSDT_CurNTOpenProcess,eax

popad
ret
_FindOpenSSDTOldaddr endp

<think>好的,用户问的是“OpenProcess不到进程”,我需要先理解这个问题的背景。通常这种情况发生在Windows系统中,当尝试使用OpenProcess函数访问另一个进程时,如果没有足够的权限或者进程不存在,就会失败。 首先,我应该考虑常见的原因。比如权限不足,用户可能没有以管理员身份运行程序,导致无法访问某些受保护的进程。另外,进程ID可能不正确,或者目标进程已经结束,导致不到该进程。还有可能是系统保护机制,比如某些关键系统进程不允许被随意访问。 接下来,解决方法方面,用户可能需要检查进程是否存在,确认PID是否正确。可以建议使用任务管理器或命令行工具如tasklist来查看进程列表。另外,确保程序有足够的权限,可能需要以管理员身份运行。如果问题仍然存在,可能需要使用更高级的调试工具或者检查是否有安全软件阻止了访问。 然后,用户可能还想知道如何正确使用OpenProcess函数,比如参数是否正确,特别是dwProcessId是否有效。另外,错误处理部分,比如调用GetLastError获取具体的错误代码,这有助于诊断问题。 还要考虑其他可能性,比如进程处于挂起状态或者由其他用户账户运行,导致当前用户无法访问。这时候可能需要调整访问控制列表(ACL)或者使用其他工具如PsExec来提升权限。 最后,需要提醒用户操作进程时要小心,避免导致系统不稳定或安全问题。如果用户是开发者,可能需要检查代码逻辑,确保正确处理错误情况,并释放获得的句柄。 总结一下,回答应该包括常见原因解决步骤,同时提供相关的问题扩展,帮助用户全面了解解决这个问题。 </think>当使用 `OpenProcess` 函数时无法到目标进程,通常有以下原因及解决方法: ### 常见原因与解决方法 1. **权限不足** - 确保程序以管理员身份运行(右键选择“以管理员身份运行”)。 - 检查目标进程是否受系统保护(如Windows关键进程)。 2. **进程ID(PID)错误** - 确认目标进程的PID是否正确。可通过任务管理器(详细信息页)或命令行 `tasklist` 命令验证。 - 如果进程已退出,PID可能已被释放,需重新获取有效PID。 3. **进程不存在或已终止** - 检查目标进程是否仍在运行。例如,某些程序在后台短暂运行后可能已关闭。 4. **系统保护机制** - 部分系统进程(如 `System` 或 `Registry`)受内核保护,普通用户无法直接访问。 5. **代码逻辑问题** - 检查 `OpenProcess` 的参数是否正确,尤其是 `dwProcessId` 是否合法。 - 调用后立即调用 `GetLastError()` 获取错误代码(如 `ERROR_INVALID_PARAMETER` 或 `ERROR_ACCESS_DENIED`)。 ### 示例代码(检查错误) ```c HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId); if (hProcess == NULL) { DWORD error = GetLastError(); printf("OpenProcess失败,错误代码: %d\n", error); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值