找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4848|回复: 5

WIN10(32)寻找SHADOW表是不是需要什么特别的方法?

[复制链接]

28

主题

116

回帖

0

精华

铜牌会员

积分
273
发表于 2017-5-29 23:11:15 | 显示全部楼层 |阅读模式
以前在XP上很好使的代码忽然从WIN10开始不能用了。注意是WIN10的32位,64位用TA的代码很好使。

856

主题

2630

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36108
发表于 2017-5-30 13:11:35 | 显示全部楼层
你说的SHADOW表,是指向SSSDT的PSYSTEM_SERVICE_TABLE类型的变量吧。
不知道你代码怎么写的,一般在KeServiceDescriptorTable的正负PAGE_SIZE范围内暴力搜索一下即可。
  1. PUCHAR p=NULL;
  2. PSYSTEM_SERVICE_TABLE KeServiceDescriptorTableWIN32K=NULL;
  3. for(p=(PUCHAR)KeServiceDescriptorTable-PAGE_SIZE; p<(PUCHAR)KeServiceDescriptorTable+PAGE_SIZE; p++)
  4. {
  5.         if(p!=(PUCHAR)KeServiceDescriptorTable)
  6.         {
  7.                 if(memcmp(p, KeServiceDescriptorTable, sizeof(SYSTEM_SERVICE_TABLE))==0)
  8.                 {
  9.                         KeServiceDescriptorTableWIN32K = (PSYSTEM_SERVICE_TABLE)(p + sizeof(SYSTEM_SERVICE_TABLE));
  10.                         break;
  11.                 }
  12.         }
  13. }
复制代码
头像被屏蔽

0

主题

37

回帖

0

精华

铜牌会员

积分
75
发表于 2017-6-15 23:04:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

5

主题

156

回帖

0

精华

铜牌会员

积分
119
发表于 2020-7-29 02:30:35 | 显示全部楼层
我也在搜索一種方式/代碼,該傳統代碼(基於KeAddSystemServiceTable函數)不適用於Win10 32位。 PS:上面的TA代碼也不起作用。 還有其他建議嗎?

856

主题

2630

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36108
发表于 2020-7-31 02:39:44 | 显示全部楼层
Krueger 发表于 2020-7-29 02:30
我也在搜索一種方式/代碼,該傳統代碼(基於KeAddSystemServiceTable函數)不適用於Win10 32位。 PS:上面 ...

你获取地址的目的是为了HOOK吗?如果是的话,在WIN10上有简单的方式。

5

主题

156

回帖

0

精华

铜牌会员

积分
119
发表于 2020-8-3 04:30:36 | 显示全部楼层
您的建議以上經過一些測試和更改後才有效! 我也在read.pudn中找到了另一個類似的代碼並且可以正常工作。

兩種確定的解決方案如下:



  1. typedef struct _SERVICE_DESCRIPTOR_TABLE
  2. {
  3.         PULONG ServiceTable;
  4.         PULONG puCounterTable;
  5.         ULONG uTableSize;
  6.         PUCHAR pbArgumentTable;
  7. } SERVICE_DESCRIPTOR_TABLE, *PSERVICE_DESCRIPTOR_TABLE;

  8. extern "C" NTKERNELAPI SERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;

  9. //--------------------------- DriverEntry() -----------------------------

  10. PUCHAR p = NULL;
  11. PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTableWIN32K = NULL;

  12.         for (p = (PUCHAR)&KeServiceDescriptorTable - PAGE_SIZE; p < (PUCHAR)&KeServiceDescriptorTable + PAGE_SIZE; p++)
  13.         {
  14.                 if (p != (PUCHAR)&KeServiceDescriptorTable)
  15.                 {
  16.                         if (memcmp(p, &KeServiceDescriptorTable, sizeof(SERVICE_DESCRIPTOR_TABLE)) == 0)
  17.                         {
  18.                                 KeServiceDescriptorTableWIN32K = (PSERVICE_DESCRIPTOR_TABLE)p;
  19.                                 break;
  20.                         }
  21.                 }
  22.         }

  23.         if (KeServiceDescriptorTableWIN32K)
  24.         {
  25.                 DbgPrint("KeServiceDescriptorTableWIN32K address = %X found! \n", KeServiceDescriptorTableWIN32K);
  26.                 DbgPrint("KeServiceDescriptorTableWIN32K entries: %d \n", KeServiceDescriptorTableWIN32K[1].uTableSize);
  27.         }
  28.         else
  29.                 DbgPrint("Error: Can't get KeServiceDescriptorTableWIN32K Address! \n");
复制代码




  1. BOOLEAN FindShadowTable()
  2. {
  3.         PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTableShadow = NULL;
  4.         ULONG Sdt = (ULONG)&KeServiceDescriptorTable;

  5.         DbgPrint("KeServiceDescriptorTable = %X \n", Sdt);

  6.         for (ULONG Shadow = Sdt - PAGE_SIZE; Shadow < Sdt + PAGE_SIZE; Shadow += sizeof(SERVICE_DESCRIPTOR_TABLE))
  7.         {
  8.                 if (MmIsAddressValid((PVOID)Shadow))
  9.                 {
  10.                         PSERVICE_DESCRIPTOR_TABLE ShadowPtr = (PSERVICE_DESCRIPTOR_TABLE)Shadow;

  11.                         if (ShadowPtr != (PSERVICE_DESCRIPTOR_TABLE)&KeServiceDescriptorTable &&
  12.                                 ShadowPtr->ServiceTable == KeServiceDescriptorTable.ServiceTable &&
  13.                                 ShadowPtr->pbArgumentTable == KeServiceDescriptorTable.pbArgumentTable &&
  14.                                 ShadowPtr->uTableSize == KeServiceDescriptorTable.uTableSize)
  15.                         {
  16.                                 KeServiceDescriptorTableShadow = ShadowPtr;
  17.                                 DbgPrint("KeServiceDescriptorTableShadow = %X \n", KeServiceDescriptorTableShadow);
  18.                                 DbgPrint("KeServiceDescriptorTableShadow entries: %d \n", KeServiceDescriptorTableShadow[1].uTableSize);
  19.                                 return TRUE;
  20.                         }
  21.                 }
  22.         }
  23.         return FALSE;
  24. }
复制代码

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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