-
-
[旧帖]
[原创]Hook ExMapHandleToPointer,防止打开被保护进程和线程句柄
0.00雪花
-
发表于:
2011-11-12 18:13
4923
-
[旧帖] [原创]Hook ExMapHandleToPointer,防止打开被保护进程和线程句柄
0.00雪花
【文章标题】: Hook ExMapHandleToPointer,防止打开被保护进程和线程句柄
【文章作者】: ddlx
【作者邮箱】: DdlxStudio@163.com
【作者声明】: 失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
新发现的方法,不敢私藏特来分享。本人文学水平有限,大家就将就着看吧~
该方法在32位Xp,2003,Vista,Win7上测试通过。
1. ExMapHandleToPointer
ExMapHandleToPointer函数是通过句柄得到对应的对象地址。函数原型为:
NTKERNELAPI PHANDLE_TABLE_ENTRY ExMapHandleToPointer ( IN PHANDLE_TABLE HandleTable,IN HANDLE Handle );
在Vista以后的系统上,该函数的第一个参数通过edi传入。
2. 为什么要Hook ExMapHandleToPointer?
Hook ExMapHandleToPointer最大的好处是不光可以拦截上层通过NtOpenProcess打开进程句柄,也可以拦截驱动调用PsLookupProcessByProcessId得进程EPROCESS。
比直接Hook SSDT中得NtOpenProcess或Hook PsLookupProcessByProcessId要好得多。并且虽然ExMapHandleToPointer函数是未导出的,但是定位容易。
ExMapHandleToPointer函数是通过Pid或Tid得对应的EPROCESS或ETHREAD的关键函数。当然,其它句柄也是通过他得对象地址的。
如PsLookupProcessByProcessId函数就先调用ExMapHandleToPointer函数从PspCidTable中得到Pid的对象地址,然后再取出EPROCESS地址。(PsLookupThreadByThreadId,PsLookupProcessThreadByCid同理)
PsLookupProcessByProcessId源码:
NTSTATUS PsLookupProcessByProcessId( IN HANDLE ProcessId, OUT PEPROCESS *Process )
{
PHANDLE_TABLE_ENTRY CidEntry;
PEPROCESS lProcess;
NTSTATUS Status;
CidEntry = [COLOR="Red"]ExMapHandleToPointer(PspCidTable, ProcessId);[/COLOR]
Status = STATUS_INVALID_PARAMETER;
if (CidEntry != NULL) {
lProcess = (PEPROCESS)CidEntry->Object;
if (lProcess != (PEPROCESS)PSP_INVALID_ID && lProcess->Pcb.Header.Type == ProcessObject && lProcess->GrantedAccess ) {
ObReferenceObject(lProcess);
*Process = lProcess;
Status = STATUS_SUCCESS;
}
ExUnlockHandleTableEntry(PspCidTable, CidEntry);
}
return Status;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)