找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5411|回复: 2

分享一个在最新WIN10获取KeServiceDescriptorTable的方法

[复制链接]

2

主题

43

回帖

0

精华

银牌会员

积分
397
发表于 2019-3-7 15:11:15 | 显示全部楼层 |阅读模式
原来我们64位搜索KeServiceDescriptorTable是通过msr的0xc0000082获得KiSystemCall64字段, 但是现在msr[0xc0000082]变成了KiSystemCall64Shadow函数, 而且这个函数无法直接搜索到KeServiceDescriptorTable
  1. ULONGLONG SearchforKeServiceDescriptorTable64(ULONGLONG StartSearchAddress, ULONGLONG EndSearchAddress)
  2. {
  3.     UCHAR b1 = 0, b2 = 0, b3 = 0;
  4.     ULONG templong = 0;
  5.     ULONGLONG KeServiceDescriptorTable = 0;

  6.     //地址效验
  7.     if (MmIsAddressValid(StartSearchAddress) == FALSE)return NULL;
  8.     if (MmIsAddressValid(EndSearchAddress) == FALSE)return NULL;

  9.     for (PUCHAR i = StartSearchAddress; i < EndSearchAddress; i++)
  10.     {
  11.         if (MmIsAddressValid(i) && MmIsAddressValid(i + 1) && MmIsAddressValid(i + 2))
  12.         {
  13.             b1 = *i;
  14.             b2 = *(i + 1);
  15.             b3 = *(i + 2);
  16.             if (b1 == 0x4c && b2 == 0x8d && b3 == 0x15)  //4c8d15
  17.             {
  18.                 memcpy(&templong, i + 3, 4);
  19.                 KeServiceDescriptorTable = (ULONGLONG)templong + (ULONGLONG)i + 7;
  20.                 return KeServiceDescriptorTable;
  21.                 //当前地址 + 长度 + 数值
  22.                 //fffff800`03c8c772+7 + 002320c7 = FFFFF80003EBE840
  23.                 /*
  24.                 fffff800`03c8c772 4c8d15c7202300  lea     r10,[nt!KeServiceDescriptorTable (fffff800`03ebe840)]
  25.                 fffff800`03c8c779 4c8d1d00212300  lea     r11,[nt!KeServiceDescriptorTableShadow (fffff800`03ebe880)]
  26.                 */
  27.             }
  28.         }
  29.     }
  30.     return NULL;
  31. }

  32. //获取SSDT KeServiceDescriptorTable
  33. ULONGLONG GetKeServiceDescriptorTable64()
  34. {
  35.     PUCHAR pKiSystemCall64 = (PUCHAR)__readmsr(0xc0000082);  //rdmsr c0000082   //定位KiSystemCall64
  36.     PUCHAR EndSearchAddress = pKiSystemCall64 + 0x500;
  37.     ULONGLONG KeServiceDescriptorTable = 0;

  38.      
  39.     KeServiceDescriptorTable=SearchforKeServiceDescriptorTable64(pKiSystemCall64, EndSearchAddress);
  40.     if (KeServiceDescriptorTable)return  KeServiceDescriptorTable;

  41.     //msr[0xc0000082]变成了KiSystemCall64Shadow函数
  42.     //原来我们64位搜索KeServiceDescriptorTable是通过msr的0xc0000082获得KiSystemCall64字段, 但是现在msr[0xc0000082]变成了KiSystemCall64Shadow函数, 而且这个函数无法直接搜索到KeServiceDescriptorTable。
  43.     ULONGLONG KiSystemServiceUser = 0;
  44.     ULONGLONG templong = 0xffffffffffffffff;
  45.     for (PUCHAR i = pKiSystemCall64; i < EndSearchAddress + 0xff; i++)
  46.     {
  47.         if (*(PUCHAR)i == 0xe9 && *(PUCHAR)(i + 5) == 0xc3)
  48.         {
  49.             //fffff803`23733383 e9631ae9ff      jmp     nt!KiSystemServiceUser(fffff803`235c4deb)
  50.             //fffff803`23733388 c3              ret
  51.             RtlCopyMemory(&templong, (PUCHAR)(i + 1), 4);
  52.             KiSystemServiceUser = templong + 5 + i;//KiSystemServiceUser
  53.             EndSearchAddress= KiSystemServiceUser +0x500;
  54.             KeServiceDescriptorTable = SearchforKeServiceDescriptorTable64(KiSystemServiceUser, EndSearchAddress);
  55.             return KeServiceDescriptorTable;
  56.         }
  57.     }
  58.     return 0;
  59. }
复制代码

评分

参与人数 1水晶币 +20 收起 理由
Tesla.Angela + 20 赞一个!

查看全部评分

78

主题

190

回帖

9

精华

贵宾会员

积分
15605
发表于 2019-3-8 00:53:59 | 显示全部楼层
我差点就信了你的鬼,你这糟老头子坏得很。
Capture.PNG

0

主题

6

回帖

0

精华

初来乍到

积分
16
发表于 2022-2-8 13:39:07 | 显示全部楼层
tangptr@126.com 发表于 2019-3-8 00:53
我差点就信了你的鬼,你这糟老头子坏得很。

意思是 他不是这样的?
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表