首页
社区
课程
招聘
[求助]win7,32位 hook ssdt 的奇怪问题
发表于: 2014-3-18 17:47 8633

[求助]win7,32位 hook ssdt 的奇怪问题

2014-3-18 17:47
8633
BOOL HookSSDT()
{
	DWORD dwMajorVer = 0;
	DWORD dwMinorVer = 0;
	PMDL pMdlSystemCall = NULL;
	DWORD * MappedSystemCallTable = 0;

    int veroffset = 0x35;  //默认xp的NtCreateThread偏移
	PsGetVersion(&dwMajorVer,&dwMinorVer,NULL,NULL);

	if (dwMajorVer != 5 || dwMinorVer !=1)//(dwMajorVer = 5,dwMinorVer = 1,xp)
	{
        veroffset = 0x57; //win7的偏移量NtCreateThread为0x57
	}
   	pMdlSystemCall = IoAllocateMdl(
								   KeServiceDescriptorTable->ntoskrnl.ServiceTable,
								   KeServiceDescriptorTable->ntoskrnl.CounterTable*4, 
								   0,
								   0,
								   NULL
								   );
   	MmBuildMdlForNonPagedPool(pMdlSystemCall);
	MappedSystemCallTable=(DWORD *)MmMapLockedPages(pMdlSystemCall, KernelMode);

	RealNtCreateThread = (NT_CREATE_THREAD)InterlockedExchange(
		(volatile LONG *)&(MappedSystemCallTable[veroffset]),(ULONG)HookedNtCreateThread); //[0x35]

	IoFreeMdl(pMdlSystemCall);

	return TRUE;
}
xp下的服务号由以下得出:
windbg 下看出 
0:000> u NtCreateThread
ntdll!ZwCreateThread:
7c92d1ae b835000000      mov     eax,35h
7c92d1b3 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
7c92d1b8 ff12            call    dword ptr [edx]
7c92d1ba c22000          ret     20h
7c92d1bd 90              nop
ntdll!ZwCreateTimer:
7c92d1be b836000000      mov     eax,36h
7c92d1c3 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
7c92d1c8 ff12            call    dword ptr [edx]

win7下的服务号由以下得出:
0:000> u NtCreateThread
ntdll!NtCreateThread:
779a4b60 b857000000      mov     eax,57h
779a4b65 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
779a4b6a ff12            call    dword ptr [edx]
779a4b6c c22000          ret     20h
779a4b6f 90              nop
ntdll!ZwCreateThreadEx:
779a4b70 b858000000      mov     eax,58h
779a4b75 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
779a4b7a ff12            call    dword ptr [edx]
0:000> u ZwCreateThreadEx
ntdll!ZwCreateThreadEx:
779a4b70 b858000000      mov     eax,58h
779a4b75 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
779a4b7a ff12            call    dword ptr [edx]
779a4b7c c22c00          ret     2Ch
779a4b7f 90              nop
ntdll!NtCreateTimer:
779a4b80 b859000000      mov     eax,59h
779a4b85 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
779a4b8a ff12            call    dword ptr [edx]


以上函数在xp上可以正常运行,但在win7上PCHunter32看到内核钩子SSDT的NtCreateThread的确实也被Hook了,但是就是没执行我的hook函数,百思不得其解啊!!
如果我把服务号换成0x58,则能执行,但会蓝屏。。。

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

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 1
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
同样的,我用堕落天才的如下代码(只是一部分)
ULONG Address;
Address = (ULONG)KeServiceDescriptorTable->ntoskrnl.ServiceTable + 0x57*4;   //NtCreateThread服务ID
....(省略部分代码)
__asm
                {
                        //去掉内存保护
                        cli
                                mov eax,cr0
                                and eax,not 10000h
                                mov cr0,eax
                }

.....
也会出现上述情况,就是PCHunter32看到被hook,但是无法执行hook代码的情况

以上代码可能贴得比较多,但思路简单,各位帮忙看看....
2014-3-18 17:53
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
vista开始系统主要使用 NtCreateThreadEx
2014-3-18 20:17
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我HOOK的ZwCreateThread好像可以在win732位上挂钩并且执行
2014-3-18 20:58
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你的Hook函数是什么样子的,按照道理既然xuetr上都有显示,应该是可以执行的。建议把Hook的函数代码发上来看看
2014-3-18 20:59
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
NtCreateThread在WIN7好像废弃了
2014-3-18 22:18
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
NtCreateThread函数的功能在NT6以上系统由NtCreateThreadEx替代了
2014-3-18 22:25
0
雪    币: 1
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
刚刚看了ZwCreateThread,发现它和NtCreateThread参数一样,服务号一样。也就是说,我想Hook NtCreateThread,但是实际hook的也是ZwCreateThread, 结果也是没有成功。。。

何解呢?
2014-3-19 12:00
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
HOOKZw和Nt系列函数基本一样,我看你还是像上面大牛说的那样改成Hook NtCreateThreadEx吧!反正也差不多
2014-3-19 15:08
0
雪    币: 1
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
NtCreateThreadEx的参数不好确定。而且刚刚好像在看雪其它帖子说,Win7下Nt系列函数会绕过SSDT,这样就没法Hook了。
兄台,你的ZwCreateThread怎么实现的呢?
2014-3-19 16:14
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我看了下当时的结果,好像win7下确实没有调用ZwCreateThread函数。。。当时也没有注意。。。
2014-3-20 11:22
0
游客
登录 | 注册 方可回帖
返回
//