首页
社区
课程
招聘
[分享]获取 win7 x64 SSDT 算法为何如此
发表于: 2014-11-20 22:42 8313

[分享]获取 win7 x64 SSDT 算法为何如此

2014-11-20 22:42
8313


/*
	硬编码定位 获取x64 KeServiceDescriptorTable
*/
EXTERN_C __int64 __readmsr(int);
#pragma intrinsic(__readmsr)
ULONGLONG	Zhenw0GetKeServiceDescriptorTableX64()
{
	//通过读取0xc000082特殊寄存器获取到KiSystemCall64的地址 作为搜索的其实地址
	PUCHAR	StartSearchAddr	= (PUCHAR)__readmsr(0xc0000082);
	//计算搜索结束地址
	PUCHAR	EndSearchAddr	= StartSearchAddr + 0x500;
	PUCHAR	i = NULL;
	UCHAR	b1=0,b2=0,b3=0;
	ULONG	templong	= 0;
	ULONGLONG	addr	= 0;
	//
	for (i= StartSearchAddr;i<EndSearchAddr;i++)
	{
		if (MmIsAddressValid(i) && MmIsAddressValid(i+1) && MmIsAddressValid(i+2))
		{
			b1	= *i;
			b2	= *(i+1);
			b3	= *(i+2);
			// 判断硬编码 4c8d15 fffff800`04102840
			if (0x4c ==b1 && 0x8d == b2 && 0x15 == b3 )
			{
				memcpy(&templong,i+3,4);
				[COLOR="Red"]addr	= (ULONGLONG)templong + (ULONGLONG)i + 7;[/COLOR]
				DbgPrint("SSDT`s Addr %p \r\n",addr);
				return addr ;
			}
		}
	}
	return 0;
}


那么问题来了!
nt!KiSystemServiceRepeat:
0xFFFFF80003ED2772 4c8d15c7202300       lea r10,[nt!KeServiceDescriptorTable (fffff800`04104840)]
0xFFFFF80003ED2779 4c8d1d00212300       lea r11,[nt!KeServiceDescriptorTableShadow (fffff800`04104880)]

为什么 标红处要这么计算呢!

我跟踪了下 标蓝处 执行完后 地址确实变了 r10 = 0xFFFFF80004104840

和红色处 计算的addr相等! 弄不明白了!

还请前辈指点

对比了下 x86 的 lea ,感觉确实差别不小;目测应该为了精简指令长度,将后面的弄成了,相对位移了。

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

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
无聊的很
2014-11-20 23:14
0
雪    币: 1555
活跃值: (3103)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
3
不要沉下去
2014-11-21 21:56
0
游客
登录 | 注册 方可回帖
返回
//