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

[分享]个人优化版的GetKeServiceDescriptorTable64

2019-4-11 15:40
6316

一个是 __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)
雪    币: 6524
活跃值: (4316)
能力值: ( 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
雪    币: 1036
活跃值: (1306)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
3
https://github.com/mrexodia/TitanHide/blob/master/TitanHide/ssdt.cpp 
一直用的这个SSDT的找法,到目前最新的win10 1809系统也没发现什么问题
2019-4-11 20:40
1
雪    币: 7498
活跃值: (5327)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
yimingqpa 你这个内存搜索不能带通配符, 给你一个带通配的。 int&nbsp;CSearchMem::SearchAddress(int&nbsp;inStartAddr,&nbsp; ...
通配符有个很尴尬的问题,万一通配符就是特征呢?
2019-4-12 19:03
0
雪    币: 6524
活跃值: (4316)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
5
lononan 通配符有个很尴尬的问题,万一通配符就是特征呢?
不影响啊.
2019-4-12 21:55
0
雪    币: 6124
活跃值: (4631)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
https://github.com/mrexodia/TitanHide/blob/master/TitanHide/ssdt.cpp 
+10086
2019-5-19 14:15
0
游客
登录 | 注册 方可回帖
返回
//