首页
社区
课程
招聘
[原创]发个xp~win10_x86/x64全兼容的ShadowSSDT获取函数
发表于: 2015-6-2 09:37 14903

[原创]发个xp~win10_x86/x64全兼容的ShadowSSDT获取函数

2015-6-2 09:37
14903
获取SSDT部分是来自于titanhide的代码,我只是加了由SSDT搜索ShadowSSDT的方法,请各位大神批评指正!

PKSERVICE_TABLE_DESCRIPTOR FindKeServiceDescriptorTableShadow()
{
	static PKSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTableShadow = NULL;
	PKSERVICE_TABLE_DESCRIPTOR SSDT = 0;
	if (!KeServiceDescriptorTableShadow)
	{
		UNICODE_STRING routineName;
#ifndef _WIN64
		//x86 code
		RtlInitUnicodeString(&routineName, L"KeServiceDescriptorTable");
		SSDT = (PKSERVICE_TABLE_DESCRIPTOR)MmGetSystemRoutineAddress(&routineName);
#else
		//x64 code
		RtlInitUnicodeString(&routineName, L"KeAddSystemServiceTable");
		PVOID KeASST = MmGetSystemRoutineAddress(&routineName);
		if (!KeASST)
		{
			Log("[TITANHIDE] Failed to find KeAddSystemServiceTable!\n");
			return 0;
		}
		unsigned char function[1024];
		unsigned int function_size = 0;
		RtlCopyMemory(function, KeASST, sizeof(function));
		for (unsigned int i = 0; i < sizeof(function); i++)
		{
			if (function[i] == 0xC3) //ret
			{
				function_size = i + 1;
				break;
			}
		}
		if (!function_size)
		{
			Log("[TITANHIDE] Failed to get function size of KeAddSystemServiceTable!\n");
			return 0;
		}

		/*
		000000014050EA4A 48 C1 E0 05                shl rax, 5
		000000014050EA4E 48 83 BC 18 80 3A 36 00 00 cmp qword ptr [rax+rbx+363A80h], 0 <- we are looking for this instruction
		000000014050EA57 0F 85 B2 5C 0A 00          jnz loc_1405B470F
		000000014050EA5D 48 8D 8B C0 3A 36 00       lea rcx, rva KeServiceDescriptorTableShadow[rbx]
		000000014050EA64 48 03 C8                   add rcx, rax
		000000014050EA67 48 83 39 00                cmp qword ptr [rcx], 0
		*/
		int rvaSSDT = 0;
		for (unsigned int i = 0; i < function_size; i++)
		{
			if (((*(unsigned int*)(function + i)) & 0x00FFFFF0) == 0xBC8340 &&
				!*(unsigned char*)(function + i + 8)) //4?83bc?? ???????? 00 cmp qword ptr [r?+r?+????????h],0
			{
				rvaSSDT = *(int*)(function + i + 4);
				break;
			}
		}
		if (rvaSSDT) //this method worked
		{
			Log("[TITANHIDE] SSDT RVA: 0x%X\n", rvaSSDT);
			PVOID base = GetKernelBase();
			if (!base)
			{
				Log("[TITANHIDE] GetKernelBase() failed!\n");
				return 0;
			}
			Log("[TITANHIDE] GetKernelBase()->0x%p\n", base);
			SSDT = (PKSERVICE_TABLE_DESCRIPTOR)((unsigned char*)base + rvaSSDT);
		}
		else
		{
			/*
			Windows 10 Technical Preview:
			fffff800e21b30ec 757f             jne nt!KeAddSystemServiceTable+0x91 (fffff800e21b316d)
			fffff800e21b30ee 48833deafee4ff00 cmp qword ptr [nt!KeServiceDescriptorTable+0x20 (fffff800e2002fe0)],0 <- we are looking for this instruction
			fffff800e21b30f6 7575             jne nt!KeAddSystemServiceTable+0x91 (fffff800e21b316d)
			fffff800e21b30f8 48833da0fee4ff00 cmp qword ptr [nt!KeServiceDescriptorTableShadow+0x20 (fffff800e2002fa0)],0
			fffff800e21b3100 756b             jne nt!KeAddSystemServiceTable+0x91 (fffff800e21b316d)
			*/
			int rvaFound = -1;
			for (unsigned int i = 0; i < function_size; i++)
			{
				if (((*(unsigned int*)(function + i)) & 0x00FFFFFF) == 0x3D8348 &&
					!*(unsigned char*)(function + i + 7)) //48833d ???????? 00 cmp qword ptr [X],0
				{
					rvaFound = i;
					rvaSSDT = *(int*)(function + i + 3);
					break;
				}
			}
			if (rvaFound == -1)
			{
				Log("[TITANHIDE] Failed to find pattern...\n");
				return 0;
			}
			//Sanity check SSDT & contents
			__try
			{
				SSDT = (PKSERVICE_TABLE_DESCRIPTOR)((ULONG_PTR)KeASST + rvaFound + rvaSSDT + 8 - 0x20);
				ULONG_PTR check = (ULONG_PTR)KeASST & 0xFFFFFFFF00000000;
				if (((ULONG_PTR)SSDT & 0xFFFFFFFF00000000) != check ||
					((ULONG_PTR)SSDT->Base & 0xFFFFFFFF00000000) != check ||
					(SSDT->Limit & 0xFFFFFFFFFFFF0000) != 0 ||
					((ULONG_PTR)SSDT->Number & 0xFFFFFFFF00000000) != check)
				{
					Log("[TITANHIDE] Found SSDT didn't pass all checks...\n");
					return 0;
				}
			}
			__except (EXCEPTION_EXECUTE_HANDLER)
			{
				Log("[TITANHIDE] An exception was thrown while accessing the SSDT...\n");
				return 0;
			}
		}
#endif
		// search shadowSSDT from the address of ssdt
		if (SSDT)
		{
			unsigned char* startAddr = (unsigned char*)SSDT + sizeof(KSERVICE_TABLE_DESCRIPTOR);
			__try
			{
				for (int i = 0; i < 0x100; ++i)
				{
					if (memcmp(startAddr + i, SSDT, sizeof(KSERVICE_TABLE_DESCRIPTOR)) == 0)
					{
						KeServiceDescriptorTableShadow = (PKSERVICE_TABLE_DESCRIPTOR)(startAddr + i);
						break;
					}
				}
			}
			__except (EXCEPTION_EXECUTE_HANDLER) { }
		}
	}
	return KeServiceDescriptorTableShadow;
}

[课程]Android-CTF解题方法汇总!

收藏
免费 3
支持
分享
最新回复 (19)
雪    币: 474
活跃值: (831)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
mark 一下
2015-6-2 10:47
0
雪    币: 6779
活跃值: (1119)
能力值: ( LV12,RANK:782 )
在线值:
发帖
回帖
粉丝
3
留个记号。
2015-6-2 13:16
0
雪    币: 7035
活跃值: (4184)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
基础-生化万物
矛盾-对立统一
火前留名
水后除字
2015-6-2 13:36
0
雪    币: 26
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
mark
2015-9-29 13:21
0
雪    币: 207
活跃值: (39)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mark.thx!
2015-9-29 14:18
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mark
2015-10-6 00:33
0
雪    币: 190
活跃值: (84)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
mark
2015-10-7 17:22
0
雪    币: 1622
活跃值: (3805)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
r3搜索好传给r0不就行了...
2015-10-7 18:15
0
雪    币: 20
活跃值: (111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
小希希 r3搜索好传给r0不就行了...
请问,r3搜索shadow  ssdt用什么方法呢,卡在这里了,看了挺多的例子都是用xp,2k,2k3  +  固定值偏移来搜索。。。
2017-7-31 11:33
0
雪    币: 2044
活跃值: (237)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
mark......
2017-8-11 14:14
0
雪    币: 583
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
sqdwr 请问,r3搜索shadow ssdt用什么方法呢,卡在这里了,看了挺多的例子都是用xp,2k,2k3 + 固定值偏移来搜索。。。
R3  怎么搜?
2017-8-11 16:50
0
雪    币: 238
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
代码不完整  招雷劈
2018-3-1 19:43
0
雪    币: 451
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
mark
2018-3-2 11:11
0
雪    币: 1484
活跃值: (1135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我试了了win7 x64系统就不能用了,楼主整个工程能放?
2018-7-29 07:54
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
mark
最后于 2018-10-9 20:00 被我来了啊编辑 ,原因:
2018-10-9 20:00
0
雪    币: 42
活跃值: (208)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
__readmsr(0xC0000082)就搞定的事情,你写这么多,真是好心情
ULONG64 GetKeServiceDescriptorTableShadow64()
{
       PUCHAR StartSearchAddress = (PUCHAR)__readmsr(0xC0000082);
       PUCHAR EndSearchAddress = StartSearchAddress + 0x500;
       PUCHAR i = NULL;
       UCHAR b1 = 0, b2 = 0, b3 = 0;
       ULONG templong = 0;
       ULONG64 addr = 0;
       for (i = StartSearchAddress; i<EndSearchAddress; i++)
       {
               if (MmIsAddressValid(i) && MmIsAddressValid(i + 1) && MmIsAddressValid(i + 2))
               {
                       b1 = *i;
                       b2 = *(i + 1);
                       b3 = *(i + 2);
                       if (b1 == 0x4c && b2 == 0x8d && b3 == 0x1d) //4c8d1d
                       {
                               memcpy(&templong, i + 3, 4);
                               addr = (ULONG64)templong + (ULONG64)i + 7;
                               return addr;
                       }
               }
       }
       return addr;
}
2018-11-3 15:26
0
雪    币: 35
活跃值: (607)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
老坛酸菜TM __readmsr(0xC0000082)就搞定的事情,你写这么多,真是好心情 ULONG64 GetKeServiceDescriptorTableShadow64() { PUCHAR S ...
你也不看年份..而且你这代码还是TA 那教程里边拔的吧..
2018-11-3 20:50
0
雪    币: 152
活跃值: (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
mark
2018-11-4 10:17
0
雪    币: 6049
活跃值: (4717)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
20
mark
2019-11-6 12:16
0
游客
登录 | 注册 方可回帖
返回
//