首页
社区
课程
招聘
[求助]如何SSDT Hook 未公开NtCreateThread函数
发表于: 2008-3-1 21:07 11157

[求助]如何SSDT Hook 未公开NtCreateThread函数

2008-3-1 21:07
11157
我想要写一个SSDT Hook 由ntdll.dll导出的NtCreateThread的驱动,我以前写过Hook NtCreateFile的程序,当时使用的是一个这样的函数来取得NtCreateFile的ID和入口地址的
FORCEINLINE USHORT GetFunctionID(PVOID pFunction,OUT PVOID *pOld)
{
        USHORT ID = 0;
        ID = * (PUSHORT)(ULONG(pFunction) + 1);
        KdPrint(("ID=%lX\n",ID));
        *pOld = (PVOID)KeServiceDescriptorTable.ServiceTableBase[ID];
        return ID;
}
===========================================
ID_CreateFile = GetFunctionID(ZwCreateFile,(PVOID *)&pOld);

但是NtCreateThread是DDK中个未公开的函数,不能这样取地址了,请问应该如何才能取到它的ID和地址呢

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
2
CreateFile DeviceIoControl
switch
memcpy
2008-3-1 21:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
打开ntdll找serviceId就是
2008-3-1 22:59
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
打开ntdll是指用ZwOpenFile打开吗?打开后再怎么找呢?我现在用的办法是现在Ring3下找到ID然后传入驱动
2008-3-2 00:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看不懂是啥意思哦&^^^^^^^^^^^^^
2008-3-2 00:27
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
6
MmGetSystemRoutine?
2008-3-2 01:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
zwopenfile可以。  然后自己翻一遍IAT
2008-3-2 07:41
0
雪    币: 709
活跃值: (2590)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
8
MmGetSystemRoutine 就是在驱动中动态调用得到已经被ntoskrnl.exehal.dll导出的函数的实际地址。

和自己在其EAT中找差不多。
2008-3-2 08:08
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
可是NtCreateThread不是由ntoskrnl.exe导出的,是由ntdll导出的
2008-3-2 09:55
0
雪    币: 709
活跃值: (2590)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
10
嗯,这个可以。

SSDT表中就有ZwCreateThread ,直接调用就可以了。不需要找。

#define SYSTEMSERVICE(_function) \
KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)_function+1)]
2008-3-2 10:11
0
雪    币: 709
活跃值: (2590)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
11
再具体的过程如下,希望LZ能够搞明白:

1. 映射ntdll.dll到内存-->ZwMapViewOfSection.
2. 搜索其EAT, 得到 ZwCreateThread的地址p
3. p + 1 处便是ntdll.dll 转入ntoskrnl.exe的服务号.
4. NtCreateThread 的地址 就可以通过这个服务号 在KeServiceDescriptorTable中取出
5. 用你的fake函数替换掉即可.


呵呵,这样就可以了
2008-3-2 14:04
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼上说的懂了,谢谢
这么说必须要自己来解析了,我这个程序还要用IOCTL和用户层交换数据,如果要自己解析的话我觉得还是从用户层先用GetProcAddress得到ZwCreathThread的入口然后+1取出ID在传给驱动更简单一些
2008-3-2 14:08
0
雪    币: 709
活跃值: (2590)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
13
嗯,在R3得到服务号,传给R0也是很好的。

呵呵,用Windbg一看就能得到服务号ID了.
2008-3-2 14:33
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
;2个未公开的函数,ZwCreateThread, ZwTerminateThread,这两个函数,需要我们从ntdll.dll的导出表中找到
; 2003  55
; xp    53
        push        offset g_usNtCreateThread
        call        MmGetSystemRoutineAddress                        ; 经过测试无法用次获取此Native API地址
        push        eax                                                ; 必须通过SSDT获取Native API地址
        call        DebugShowData
        ;jmp        SetInLineHookNtCreateThread_exit

        ;mov        eax, ZwCreateThread                                ; 等候用户程序传入ZW*地址
        ;mov        eax, dword ptr [eax+1]                                ; 从用户程序中获取SSDT服务的索引值
2008-7-13 08:40
0
游客
登录 | 注册 方可回帖
返回