-
-
[分享]获取 win7 x64 SSDT 算法为何如此
-
发表于:
2014-11-20 22:42
8313
-
[分享]获取 win7 x64 SSDT 算法为何如此
/*
硬编码定位 获取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直播授课