首页
社区
课程
招聘
[原创]逆ExpLookupHandleTableEntry
发表于: 2016-5-6 22:55 6870

[原创]逆ExpLookupHandleTableEntry

2016-5-6 22:55
6870
额,最近在补内核的基础,看到对象那里,然后就想起之前32位下的PspCidTable了。
好像也没人发,然后逆了下Win7 64 下的这个函数。。比较简单,大牛飘过。。。

优化代码
PEPROCESS MyWin764_ExpLookupHandleTableEntry(
	IN PVOID HandleTable,
	IN HANDLE LookupHandle,
	IN BOOLEAN bClear)
{

	PEPROCESS pResult = NULL;
	ULONG uIndex = (ULONG)((ULONG_PTR)LookupHandle & 0xfffffffc);
	PULONG pNextHandleNeedingPool = (PULONG)((PUCHAR)HandleTable + 0x5c);
	PULONG_PTR pTable = NULL;
	ULONG uLayer = 0;


	if (HandleTable == NULL) goto _EXIT;
	if (uIndex >= *pNextHandleNeedingPool) goto _EXIT;

  pTable = (PULONG_PTR)(*(PULONG_PTR)HandleTable);
	uLayer = (ULONG)((ULONG_PTR)pTable & 3);
	pTable = (PULONG_PTR)((ULONG_PTR)pTable - uLayer);

	switch (uLayer)
	{
	case 0:
		pResult = *(PEPROCESS *)((ULONG_PTR)pTable + 4 * uIndex);
		if (bClear) *(PEPROCESS *)((ULONG_PTR)pTable + 4 * uIndex) = 0;
		break;
	case 1:
		pResult = *(PEPROCESS *)(pTable[uIndex / 1024] + 4 * (uIndex % 1024));
		if (bClear) *(PEPROCESS *)(pTable[uIndex / 1024] + 4 * (uIndex % 1024)) = 0;
		break;
	case 2:
		pResult = *(PEPROCESS *)(*(PULONG_PTR)(pTable[uIndex / 1024 / 4096] + 8 * (uIndex / 1024 % 4096)) + 4 * (uIndex % 1024));
		if (bClear) *(PEPROCESS *)(*(PULONG_PTR)(pTable[uIndex / 1024 / 4096] + 8 * (uIndex / 1024 % 4096)) + 4 * (uIndex % 1024)) = 0;
		break;
	default:
		break;
	}
_EXIT:
	return (PEPROCESS)((ULONG_PTR)pResult & 0xfffffffffffffffc);
}


F5代码
signed __int64 __fastcall ExpLookupHandleTableEntry(__int64 a1, unsigned __int64 a2)
{
  __int64 v2; // r8@2
  signed __int64 v3; // rcx@2
  __int64 v4; // r8@2
  signed __int64 result; // rax@4
  unsigned __int64 v6; // [sp+8h] [bp+8h]@1

  v6 = a2;
  LODWORD(v6) = a2 & 0xFFFFFFFC;
  if ( v6 >= *(_DWORD *)(a1 + 92) )
  {
    result = 0i64;
  }
  else
  {
    v2 = *(_QWORD *)a1;
    v3 = *(_QWORD *)a1 & 3i64;
    v4 = v2 - (unsigned int)v3;
    if ( (_DWORD)v3 )
    {
      if ( (_DWORD)v3 == 1 )
        result = *(_QWORD *)(((a2 - (a2 & 0x3FF)) >> 7) + v4) + 4 * (a2 & 0x3FF);
      else
        result = *(_QWORD *)(*(_QWORD *)(((((a2 - (a2 & 0x3FF)) >> 7) - (((a2 - (a2 & 0x3FF)) >> 7) & 0xFFF)) >> 9) + v4)
                           + (((a2 - (a2 & 0x3FF)) >> 7) & 0xFFF))
               + 4 * (a2 & 0x3FF);
    }
    else
    {
      result = v4 + 4 * a2;
    }
  }
  return result;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
2
先点个赞~
F5整理的,还是自己看汇编逆的?
2016-5-7 00:35
0
雪    币: 284
活跃值: (250)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
用的IDA的Graphic模式看的汇编代码,F5直接把汇编优化过的代码给写上去了。。
2016-5-7 08:44
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
二楼一眼看穿,实力果然了得

看回复说明功利似乎有欠缺
2016-5-7 15:41
0
雪    币: 284
活跃值: (250)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
话说你看穿了啥?
2016-5-7 19:09
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
不能通用。  没什么意义啊   
就算改到能通用  系统句柄表  结构也经常变       太小众
2016-5-9 13:23
0
雪    币: 719
活跃值: (777)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
支持~点赞。虽然 坛子很多了
2016-5-9 13:35
0
雪    币: 44
活跃值: (186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
都是大神呀,只能膜拜
2016-5-9 18:27
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
IDA一键F5太好用了
2016-5-9 18:36
0
雪    币: 284
活跃值: (250)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
10
有理有据。。
2016-5-9 19:14
0
雪    币: 284
活跃值: (250)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
11
哈哈,确实
2016-5-9 19:15
0
雪    币: 284
活跃值: (250)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
12
额,可能我逛论坛的时候没看到。。
2016-5-9 19:17
0
游客
登录 | 注册 方可回帖
返回