首页
社区
课程
招聘
[旧帖] [原创]Hook ExMapHandleToPointer,防止打开被保护进程和线程句柄 0.00雪花
2011-11-12 18:13 4487

[旧帖] [原创]Hook ExMapHandleToPointer,防止打开被保护进程和线程句柄 0.00雪花

2011-11-12 18:13
4487
【文章标题】: 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;
  }

  
  3. PspCidTable 是什么?怎么得到?
  
  PspCidTable是进程和线程ID的句柄表。每个进程Id或线程Id都能从该表中得到句柄对象。
  PspCidTable是一个全局变量。可以通过搜索特征码的方式搜索其位置.
  Xp或2003搜索方法:
  从PsLookupProcessByProcessId函数开始搜索特征码 0x35ff(2个字节,即汇编push dword ptr[g_pPspCidTableAddr]的指令码)。
  Vista或Win7搜索方法:
  从PsLookupProcessByProcessId函数开始搜索特征码 0x3d8b(2个字节,即汇编mov edi, dword ptr[g_pPspCidTableAddr]的指令码)。
  g_pPspCidTableAddr中保存的值就是PspCidTable。
  
  
  4. 定位ExMapHandleToPointer函数
  
  定位ExMapHandleToPointer函数很容易:从PsLookupProcessByProcessId函数开始搜索特征码 0xE8,即第一个Call既是。
  
  5. MyExMapHandleToPointer
  
  当前写好MyExMapHandleToPointer就可以开始Hook了,
  NTKERNELAPI PHANDLE_TABLE_ENTRY MyExMapHandleToPointer( IN PHANDLE_TABLE HandleTable,IN HANDLE Handle )
  {
  if( PsGetCurrentProcessId() == g_MyPid )
  {
  goto CALL;
  }
    if( HandleTable != g_PspCidTable )
  {
  goto CALL;
  }
  
  if( Handle == g_MyPid )
  {
  goto NOCALL;
  }
  if( Handle == g_MyTid )
  {
  goto NOCALL;
  }
  
  CALL:
  return RealExMapHandleToPointer( HandleTable, Handle );
  NOCALL:
  return NULL;
  }

  Vista以后的系统实现略有不同~
  
  
  另外:Hook ExMapHandleToPointer,还可以防止上层其它进程读写保护进程。这个就让各位发挥吧~
  
  欢迎拍砖,
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2011年11月12日 18:06:48

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞5
打赏
分享
最新回复 (6)
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
笨奔 1 2011-11-12 20:16
2
0
不错,有探索精神。
雪    币: 106
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
少宇 2011-11-12 20:20
3
0
小弟看不懂  不过还是顶下 呵呵
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hendyj 2011-11-12 20:33
4
0
楼主一看就是技术流的,学习加支持!!
雪    币: 541
活跃值: (654)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
ddlx 5 2011-11-13 08:40
5
0
这么好的文章怎么就没人顶呢
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
exile 1 2011-11-13 14:41
6
0
只要是用了HOOK,其实HOOK哪都一样的
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
Naylon 2 2011-11-14 13:04
7
0
lz探索精神可嘉,但不建议深究进线程终止/保护之类的内容...
游客
登录 | 注册 方可回帖
返回