首页
社区
课程
招聘
[原创]关于Win7 x64 Shadow SSDT 的探索和 Inline HOOK
发表于: 2016-5-24 11:27 31906

[原创]关于Win7 x64 Shadow SSDT 的探索和 Inline HOOK

2016-5-24 11:27
31906

来看雪一年了,在这里面学到了很多知识,非常感谢各位前辈对知识的分享和不懈的研究,也非常感谢各位大神对我们这些小白的照顾,特别要感谢MaMy、hksoobe、luolinlove等大神的指导。我也一直非常希望能为看雪贡献一点什么,但是小白的理解估计大神也看不上,这次也是注册看雪一周年,冲着这个也来发表一点自己的理解吧,写的不好还望各位看官海涵

PS:我们不生产技术,只是技术的搬运工

进入正题:
    SSSDT就是win32k.sys里面的函数,大多数都跟图形相关,比如什么NtUserGetDCEx或者NtUserCreateWindowEx等。所以要查看这些内核函数地址,光在驱动中进行和SSDT一样的访问会引发异常蓝屏的。
    所以有前辈就想出办法,在驱动程序里面调用KeAttachProces到csrss.exe中,获取这个系统进程的地址空间从而在驱动中获取SSSDT中的函数地址,传送门:http://bbs.pediy.com/showthread.php?p=1245567#post1245567
    但是我自己可能没有领略到这个方法的精髓,不论怎么做还是蓝屏了,所以就想了另外一个办法,用一个控制台应用程序自己加载自己的驱动(当然是用虚拟机里面的测试模式),然后再在驱动里面打印SSSDT中的各个函数地址,关于怎么自己加载驱动请看http://www.mengwuji.net/forum.php?mod=viewthread&tid=2859&page=1#pid56859
    这样做了以后居然成功了,驱动程序成功打印出来了SSSDT中的函数地址而不蓝屏。驱动程序里面打印SSSDT函数地址的代码我会在最后给出。现在看一下一小部分打印出来的样子:


Shadow SSDT ID:4902, Address:FFFFF960000FBC30!
Shadow SSDT ID:4903, Address:FFFFF960001A1AB0!
Shadow SSDT ID:4904, Address:FFFFF9600019F5F4!
Shadow SSDT ID:4905, Address:FFFFF960001A2418!
Shadow SSDT ID:4906, Address:FFFFF960001A11C8!
Shadow SSDT ID:4907, Address:FFFFF9600019FAB0!
Shadow SSDT ID:4908, Address:FFFFF960001A9EE0!
Shadow SSDT ID:4909, Address:FFFFF9600019B15C!

kd> u FFFFF960001A392C
win32k!NtUserQueryDisplayConfig:
fffff960`001a392c ?? ???
^ Memory access error in 'u FFFFF960001A392C'
kd> u FFFFF960000FBC30;
win32k!NtUserSwitchDesktop:
fffff960`000fbc30 ?? ???
^ Memory access error in 'u FFFFF960000FBC30;'
kd> u FFFFF960001A1AB0;
win32k!NtUserTestForInteractiveUser:
fffff960`001a1ab0 ?? ???
^ Memory access error in 'u FFFFF960001A1AB0;'
kd> u FFFFF9600019F5F4;
win32k!NtUserTrackPopupMenuEx:
fffff960`0019f5f4 ?? ???
^ Memory access error in 'u FFFFF9600019F5F4;'

typedef struct _SYSTEM_SERVICE_TABLE{
PVOID ServiceTableBase;
PVOID ServiceCounterTableBase;
ULONGLONG NumberOfServices;
PVOID ParamTableBase;
} SYSTEM_SERVICE_TABLE, *PSYSTEM_SERVICE_TABLE;


PSYSTEM_SERVICE_TABLE g_KeServiceDescriptorTableShadow = NULL;


ULONGLONG GetKeServiceDescriptorTableShadow64()
{
PUCHAR StartSearchAddress = (PUCHAR)__readmsr(0xC0000082);
PUCHAR EndSearchAddress = StartSearchAddress + 0x500;
PUCHAR i = NULL;
UCHAR b1=0,b2=0,b3=0;
ULONG templong=0;
ULONGLONG addr=0;
for(i=StartSearchAddress;i<EndSearchAddress;i++)
{
if( MmIsAddressValid(i) && MmIsAddressValid(i+1) && MmIsAddressValid(i+2) )
{
b1=*i;
b2=*(i+1);
b3=*(i+2);
if( b1==0x4c && b2==0x8d && b3==0x1d ) //4c8d1d
{
memcpy(&templong,i+3,4);
addr = (ULONGLONG)templong + (ULONGLONG)i + 7;
return addr;
}
}
}
return 0;
}


VOID InitShadowHookSSDT()
{
g_KeServiceDescriptorTableShadow = (PSYSTEM_SERVICE_TABLE)GetKeServiceDescriptorTableShadow64();
if (g_KeServiceDescriptorTableShadow)
{
DbgPrintEx(DPFLTR_IHVDRIVER_ID, 2, "ShadowSSDT内核表基址:%p\n", g_KeServiceDescriptorTableShadow);
}
else
{
DbgPrintEx(DPFLTR_IHVDRIVER_ID, 2, "获取ShadowSSDT内核表基址失败!\n");
}
}


ULONGLONG GetSSSDTFuncCurAddr64(ULONG64 Index)
{
ULONGLONG W32pServiceTable=0, qwTemp=0;
LONG dwTemp=0;
PSYSTEM_SERVICE_TABLE pWin32k;
pWin32k = (PSYSTEM_SERVICE_TABLE)((ULONG64)g_KeServiceDescriptorTableShadow + sizeof(SYSTEM_SERVICE_TABLE));
W32pServiceTable=(ULONGLONG)(pWin32k->ServiceTableBase);
qwTemp = W32pServiceTable + 4 * (Index-0x1000);
dwTemp = *(PLONG)qwTemp;
dwTemp = dwTemp >> 4;
qwTemp = W32pServiceTable + (LONG64)dwTemp;
return qwTemp;
}


VOID PrintShadowSSDT()
{
ULONG64 i = 0;
for (i=0x1000; i<0x1338; ++i)
{
DbgPrintEx(DPFLTR_IHVDRIVER_ID, 2, "Shadow SSDT ID:%d, Address:%p!\n", i, GetSSSDTFuncCurAddr64(i));
}
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 8
支持
分享
最新回复 (30)
雪    币: 799
活跃值: (457)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2016-5-24 12:34
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错,占个座
2016-5-24 13:42
0
雪    币: 1402
活跃值: (341)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2016-5-24 14:27
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
总觉得还是读取符号表来的稳当些
2016-5-24 14:58
0
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
我不会符号表
2016-5-24 15:03
0
雪    币: 11131
活跃值: (17666)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主牛叉啊,想出这么厉害的办法
2016-5-24 17:02
0
雪    币: 114
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享!!!
2016-5-24 22:00
0
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
多谢夸奖,运气而已,而且也不算很厉害的想法
2016-5-27 09:20
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
非常有价值,感谢
2016-5-27 18:18
0
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
现已加入Shadow SSDT 的HOOK( Inline HOOK ),另想请教各位大神,如果想去从事软件安全,需要具备哪些能力呢?现在在看雪待了一年,真正的想从事软件安全了,天天写JAVA太难受了~~~
2016-6-4 09:22
0
雪    币: 284
活跃值: (250)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
12
在获取SSSDT函数地址的上下,使用KeStackAttachProcess 就可以获取到
2016-7-7 22:10
0
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
试过了,没有成功
2016-7-11 08:16
0
雪    币: 285
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不用过pg么?
2016-7-12 22:40
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
楼主好样的!
2016-9-7 18:31
0
雪    币: 12
活跃值: (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
这个大数组...一行一行手敲的?
2016-10-6 19:29
0
雪    币: 2044
活跃值: (237)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
mark....
2016-10-6 23:34
0
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
是啊,好辛苦的。。
2016-10-9 14:03
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
good, boys
2016-10-20 15:47
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
支持楼主
2016-10-21 03:26
0
雪    币: 12
活跃值: (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
其实从符号表读取地址就行了
2016-10-26 18:00
0
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
我是真的不会
2016-10-28 08:01
0
雪    币: 16455
活跃值: (1725)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
无忧论坛上下载过微软 原生影子移植的东东  几个DLL文件和exe
2016-10-28 08:50
0
雪    币: 968
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
感谢分享
2017-12-4 09:24
0
雪    币: 190
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25

感谢楼主,再加个HOOK SSDT的就好了

最后于 2020-5-28 19:38 被小米花生豆浆编辑 ,原因:
2020-5-28 19:37
0
游客
登录 | 注册 方可回帖
返回
//