首页
社区
课程
招聘
[分享]个人优化版的GetKeServiceDescriptorTable64
发表于: 2019-4-11 15:40 6491

[分享]个人优化版的GetKeServiceDescriptorTable64

2019-4-11 15:40
6491

一个是 __readmsr(0xC0000082)开始搜索0x500,这个对于个别系统和最新的1809系统已经无效了.
另一个是_strnicmp到KdDebuggerNotPresent内存块进行搜索特征,估计有个别系统内存块断片,导致蓝屏,兼容性一般
查看了WIN7-WIN10几个版本的系统,发现"\x8B\xF8\xC1\xEF\x07\x83\xE7\x20\x25\xFF\x0F\x00\x00"特征码总是在ZwXXX函数到NtXXX函数的内存块中间.
所以就写成下面这样的,兼容性还行,就是没有测试全系统.发出来大家去试试吧.有问题的系统发出来看看,再优化
PUCHAR GetKeServiceDescriptorTable64_2()
{
	char KiSystemServiceStart_pattern[] = "\x8B\xF8\xC1\xEF\x07\x83\xE7\x20\x25\xFF\x0F\x00\x00";	//特征码
	
	PUCHAR StartSearchAddress = (PUCHAR)ZwClose;
	PUCHAR CodeScanStart = (PUCHAR)NtClose;
	int  searchsize = CodeScanStart- StartSearchAddress;
	PUCHAR ssdtaddr = 0, memaddr = 0;
        //dv_SearchMem功能就是从StartSearchAddress开始搜索searchsize大小的内存块有没有KiSystemServiceStart_pattern特征,有就返回特征所在偏移
	int of = dv_SearchMem(StartSearchAddress, searchsize, KiSystemServiceStart_pattern, sizeof(KiSystemServiceStart_pattern) - 1, 0, FALSE);
	if (of > 0)
	{
		of = dv_SearchMem(StartSearchAddress, searchsize, "\x4C\x8D\x15", 3, of, FALSE);
		if (of > 0)
		{
			memaddr = StartSearchAddress + of;
			ssdtaddr = memaddr + 7 + ((*(LONG*)(memaddr + 3)));	
		}
	}

	return ssdtaddr;
}

查看了WIN7-WIN10几个版本的系统,发现"\x8B\xF8\xC1\xEF\x07\x83\xE7\x20\x25\xFF\x0F\x00\x00"特征码总是在ZwXXX函数到NtXXX函数的内存块中间.
查看了WIN7-WIN10几个版本的系统,发现"\x8B\xF8\xC1\xEF\x07\x83\xE7\x20\x25\xFF\x0F\x00\x00"特征码总是在ZwXXX函数到NtXXX函数的内存块中间.
所以就写成下面这样的,兼容性还行,就是没有测试全系统.发出来大家去试试吧.有问题的系统发出来看看,再优化
PUCHAR GetKeServiceDescriptorTable64_2()
{
	char KiSystemServiceStart_pattern[] = "\x8B\xF8\xC1\xEF\x07\x83\xE7\x20\x25\xFF\x0F\x00\x00";	//特征码
	
	PUCHAR StartSearchAddress = (PUCHAR)ZwClose;
	PUCHAR CodeScanStart = (PUCHAR)NtClose;
	int  searchsize = CodeScanStart- StartSearchAddress;
	PUCHAR ssdtaddr = 0, memaddr = 0;
        //dv_SearchMem功能就是从StartSearchAddress开始搜索searchsize大小的内存块有没有KiSystemServiceStart_pattern特征,有就返回特征所在偏移
	int of = dv_SearchMem(StartSearchAddress, searchsize, KiSystemServiceStart_pattern, sizeof(KiSystemServiceStart_pattern) - 1, 0, FALSE);
	if (of > 0)
	{
		of = dv_SearchMem(StartSearchAddress, searchsize, "\x4C\x8D\x15", 3, of, FALSE);
		if (of > 0)
		{
			memaddr = StartSearchAddress + of;
			ssdtaddr = memaddr + 7 + ((*(LONG*)(memaddr + 3)));	
		}
	}

	return ssdtaddr;
}


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

最后于 2019-4-11 15:53 被游乐娃子编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (5)
雪    币: 7187
活跃值: (5186)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
2
你这个内存搜索不能带通配符, 给你一个带通配的。

int CSearchMem::SearchAddress(int inStartAddr, int inSize, const byte* pOpCode, int inOpSize, bool bDirection, int inOffset)
{
	int inRet = 0;

	try
	{
		if ((0 == inStartAddr) || (inSize <= 0) || (NULL == pOpCode) || (NULL == inOpSize))
		{
			return inRet;
		}

		int inFindCount = 0;
		byte* pData = (byte*)inStartAddr;

		for (int i = 0; i < inSize; i++, pData++)
		{
			const byte* pOpData = pOpCode;

			for (int j = 0; j < inOpSize; j++, pOpData++)
			{
				while (0xFF == *pOpData)
				{
					inFindCount++;

					i++;
					pData++;

					j++;
					pOpData++;
				}

				if (*pData == *pOpData)
				{
					inFindCount++;

					i++;
					pData++;
				}
				else
				{
					inFindCount = 0;
					break;
				}
			}

			if (inFindCount == inOpSize)
			{
				break;
			}
		}

		if (inFindCount == inOpSize)
		{
			inRet = (int)pData - inFindCount;

			if (bDirection)
			{
				inRet = inRet + inOffset;
			}
			else
			{
				inRet = inRet - inOffset;
			}
		}
	}
	catch (...)
	{
		inRet = 0;
	}

	return inRet;
}



char chOpCode[] = "\x6A\x04\x8D\x86\x5C\x01\xFF\xFF\x50\x6A\x04\x68";

dwRet = SearchAddress(dwModuleBase, dwModuleSize, (const byte*)chOpCode, ::strlen(chOpCode), true, 0x13);

2019-4-11 16:07
0
雪    币: 1044
活跃值: (1385)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
3
727K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6E0M7X3g2^5L8$3c8A6j5g2)9J5c8W2c8A6N6r3q4F1d9r3W2V1k6g2)9J5c8X3u0D9L8$3u0Q4x3V1k6E0j5i4y4@1k6i4u0Q4x3V1k6f1K9i4c8S2L8V1S2A6k6r3g2Q4x3V1k6K6M7$3c8@1i4K6u0W2j5%4m8H3i4K6t1$3L8X3u0K6M7q4)9K6b7R3`.`.
一直用的这个SSDT的找法,到目前最新的win10 1809系统也没发现什么问题
2019-4-11 20:40
1
雪    币: 8397
活跃值: (6323)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
yimingqpa 你这个内存搜索不能带通配符, 给你一个带通配的。 int&nbsp;CSearchMem::SearchAddress(int&nbsp;inStartAddr,&nbsp; ...
通配符有个很尴尬的问题,万一通配符就是特征呢?
2019-4-12 19:03
0
雪    币: 7187
活跃值: (5186)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
5
lononan 通配符有个很尴尬的问题,万一通配符就是特征呢?
不影响啊.
2019-4-12 21:55
0
雪    币: 6129
活跃值: (4971)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
61cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6E0M7X3g2^5L8$3c8A6j5g2)9J5c8W2c8A6N6r3q4F1d9r3W2V1k6g2)9J5c8X3u0D9L8$3u0Q4x3V1k6E0j5i4y4@1k6i4u0Q4x3V1k6f1K9i4c8S2L8V1S2A6k6r3g2Q4x3V1k6K6M7$3c8@1i4K6u0W2j5%4m8H3i4K6t1$3L8X3u0K6M7q4)9K6b7R3`.`.
+10086
2019-5-19 14:15
0
游客
登录 | 注册 方可回帖
返回