【3.A.S.T】网络安全爱好者's Archiver

黑客学习

wlfjck 发表于 2008-7-24 17:24

[讨论]句柄啊,3层表啊,ExpLookupHandleTableEntry啊...[已解决]

[讨论]句柄啊,3层表啊,ExpLookupHandleTableEntry啊...[已解决]
文章作者:sudami
信息来源:邪恶八进制信息安全团队([url=http://www.eviloctal.com/]www.eviloctal.com[/url])

句柄这东西到了底层还真烦琐。HANDLE本来就是个void类型的4字节,保存指向object的指针.于是就有了

HANDLE_TABLE、HANDLE_TABLE_ENTRY、OBJECT_HEADER、 EXHANDLE

[img]http://forum.eviloctal.com/images/default/attachimg.gif[/img]  [img]http://forum.eviloctal.com/attachments/Mon_0801/9_69539_7a673f7a08ee9cd.gif[/img] [img]http://forum.eviloctal.com/images/attachicons/image.gif[/img][url=http://forum.eviloctal.com/attachment.php?aid=7093&nothumb=yes]_EXHANDLE.gif[/url] (5 KB)

2008-1-8 21:27

琢磨着这个EXHANDLE,它里面的Index保存着3层表索引。通过它,也就是EXHANDLE。Value 的后30位. 可以找到进程ID指向的object

关于这个3层表,“JIURL玩玩Win2k进程线程篇 HANDLE_TABLE”一文中也有比较详细的介绍,可惜是W2K滴, HANDLE_TABLE在XP中发生了变化,不过其中的第一个参数保存的内容仍然是指向HANDLE_TABLE_ENTRY,不过是要经过索引偏移后才能得到.

开始还准备用Windbg探索下这个3层表,发现困难重重 ---


准备搞下QQ进程中的HANDLE_TABLE,一张图接着一张图后,到 TableCode这里卡住了。不晓得具体怎么偏移才能继续到下一层的表了。。。
[img]http://forum.eviloctal.com/images/default/attachimg.gif[/img]  [img]http://forum.eviloctal.com/attachments/Mon_0801/9_69539_3b7e7a27f1394d0.gif[/img] [img]http://forum.eviloctal.com/images/attachicons/image.gif[/img][url=http://forum.eviloctal.com/attachment.php?aid=7095&nothumb=yes]Snap2.gif[/url] (2 KB)

2008-1-8 21:27
[img]http://forum.eviloctal.com/images/default/attachimg.gif[/img]  [img]http://forum.eviloctal.com/attachments/Mon_0801/9_69539_849791604051c6b.gif[/img] [img]http://forum.eviloctal.com/images/attachicons/image.gif[/img][url=http://forum.eviloctal.com/attachment.php?aid=7096&nothumb=yes]Snap3.gif[/url] (9 KB)

2008-1-8 21:27
[img]http://forum.eviloctal.com/images/default/attachimg.gif[/img]  [img]http://forum.eviloctal.com/attachments/Mon_0801/9_69539_c1ec279ddef72c3.gif[/img] [img]http://forum.eviloctal.com/images/attachicons/image.gif[/img][url=http://forum.eviloctal.com/attachment.php?aid=7097&nothumb=yes]Snap4.gif[/url] (6 KB)

2008-1-8 21:27
[img]http://forum.eviloctal.com/images/default/attachimg.gif[/img]  [img]http://forum.eviloctal.com/attachments/Mon_0801/9_69539_052fc1ea054e002.gif[/img] [img]http://forum.eviloctal.com/images/attachicons/image.gif[/img][url=http://forum.eviloctal.com/attachment.php?aid=7098&nothumb=yes]Snap5.gif[/url] (6 KB)

2008-1-8 21:27  

就是这点破东西害的偶看WRK看了2天多。还是木有完全理解。哎,等以后脑子清醒了再看吧。标记之:

[img]http://forum.eviloctal.com/images/default/attachimg.gif[/img]  [img]http://forum.eviloctal.com/attachments/Mon_0801/9_69539_f31acd7b9108bbf.gif[/img] [img]http://forum.eviloctal.com/images/attachicons/image.gif[/img][url=http://forum.eviloctal.com/attachment.php?aid=7094&nothumb=yes]d.gif[/url] (7 KB)

2008-1-8 21:27

这个破函数偶现在是看不明白了。糊涂的很,关键还是对这个3层表没有理解正确。里面一会儿求余、一会儿整除的,搞糊涂了。要是哪位牛牛能给偶解释下就好了。
复制内容到剪贴板
代码:
PHANDLE_TABLE_ENTRY
ExpLookupHandleTableEntry (
  IN PHANDLE_TABLE HandleTable,
  IN EXHANDLE tHandle
  )
{
// 一大堆局部变量
  ULONG_PTR i,j,k;
  ULONG_PTR CapturedTable;
  ULONG TableLevel;
  PHANDLE_TABLE_ENTRY Entry = NULL;
  EXHANDLE Handle;

  PUCHAR TableLevel1;
  PUCHAR TableLevel2;
  PUCHAR TableLevel3;

  ULONG_PTR MaxHandle;

  PAGED_CODE();

  Handle = tHandle;
  Handle.TagBits = 0;
  MaxHandle = *(volatile ULONG *) &HandleTable->NextHandleNeedingPool;

// 判断当前句柄是否有效
  if (Handle.Value >= MaxHandle) {
    return NULL;   
  }

//
// 得到当前的索引等级 -- 即 CapturedTable 的最后2位
// 而 (CapturedTable - TableLevel) 便是这个3层表的起始地址。
// 通过Handle.Value中的后30位保存的索引号,找到进程ID对应的HANDLE_TABLE_ENTRY
//
  CapturedTable = *(volatile ULONG_PTR *) &HandleTable->TableCode;
  TableLevel = (ULONG)(CapturedTable & 3);
  CapturedTable -= TableLevel;

// 有3种情况: 0、1、2
  switch (TableLevel) {
   
    case 0:   

      TableLevel1 = (PUCHAR) CapturedTable;

      // 就一层表。这层表中保存的就是一堆HANDLE_TABLE_ENTRY
      // 索引号*2 得到在其中的偏移量
      Entry = (PHANDLE_TABLE_ENTRY) &TableLevel1[Handle.Value * 2];

      break;
   
    case 1:
      
      TableLevel2 = (PUCHAR) CapturedTable;

      // 有2层表:上层 和 下层 [中层为空]
      // 和2KB求余后,i保存的是在下层表中的索引
      i = Handle.Value % (2 * 1024);

      // 上层开始处偏移j后指向的是下层的开始处
      Handle.Value -= i;
      j = Handle.Value / ((2 * 1024) / 8);

      TableLevel1 = (PUCHAR) *(PHANDLE_TABLE_ENTRY *) &TableLevel2[j];
      Entry = (PHANDLE_TABLE_ENTRY) &TableLevel1[i * 2];

      break;
   
    case 2:

      TableLevel3 = (PUCHAR) CapturedTable;

      i = Handle.Value % (2 * 1024);


      Handle.Value -= i;

      k = Handle.Value / ((2 * 1024) / 8);

      j = k % (4 * 1024);

      k -= j;

      k = k / (1024 / 2);


      TableLevel2 = (PUCHAR) *(PHANDLE_TABLE_ENTRY *) &TableLevel3[k];
      TableLevel1 = (PUCHAR) *(PHANDLE_TABLE_ENTRY *) &TableLevel2[j];
      Entry = (PHANDLE_TABLE_ENTRY) &TableLevel1[i * 2];

      break;

    default :
      _assume (0);
  }

  return Entry;
}WINDOWS内核疯狂爱好者
帖子242 精华[url=http://forum.eviloctal.com/digest.php?authorid=69539]6[/url] 积分5536 阅读权限150 性别男 在线时间1113 小时 注册时间2007-1-10 最后登录2008-7-23 [url=http://hi.baidu.com/sudami]查看个人网站[/url]
[url=http://forum.eviloctal.com/space.php?action=viewpro&uid=69539]查看详细资料[/url]TOP [url=http://www.google.cn/search?q=兼职&client=pub-0204114945524753&forid=1&prog=aff&ie=UTF-8&oe=UTF-8&cof=GALT%3A#008000;GL%3A1;DIV%3A336699;VLC%3A663399;AH%3Acenter;BGC%3AFFFFFF;LBGC%3A336699;ALC%3A0000FF;LC%3A0000FF;T%3A000000;GFNT%3A0000FF;GIMP%3A0000FF;FORID%3A1&hl=zh-CN]赚更多的钱[/url]

[url=http://forum.eviloctal.com/space-uid-69539.html]sudami[/url]
大米米
[img]http://forum.eviloctal.com/customavatars/69539.gif[/img]
运维管理组
[img]http://forum.eviloctal.com/images/default/star_level2.gif[/img][img]http://forum.eviloctal.com/images/default/star_level1.gif[/img][img]http://forum.eviloctal.com/images/default/star_level1.gif[/img][img]http://forum.eviloctal.com/images/default/star_level1.gif[/img]

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.