首页
社区
课程
招聘
[求助]关于HOOK NtCreateThread的问题
发表于: 2008-10-10 20:38 9243

[求助]关于HOOK NtCreateThread的问题

2008-10-10 20:38
9243
最近学习rootkit遇到点问题,还望高人指点指点。
我在Hook NtCreateThread的时候,编译老提示未导入ZwCreateThread,我知道ZwCreateThread是未导出的函数,因此在头文件中自己声明了一个,不过编译还是报。郁闷啊。
部分代码:
//定义服务描述表
typedef struct ServiceDescriptorEntry {
        unsigned int *ServiceTableBase;
        unsigned int *ServiceCounterTableBase;
        unsigned int NumberOfServices;
        unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry;

extern PServiceDescriptorTableEntry KeServiceDescriptorTable;

#define SYSCALL(_function) KeServiceDescriptorTable->ServiceTableBase[*(PULONG)((PUCHAR)_function+1)]

//ZwCreateThread
NTSYSAPI
NTSTATUS
NTAPI
ZwCreateThread
(
OUT PHANDLE ThreadHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN HANDLE ProcessHandle,
OUT PCLIENT_ID ClientId,
IN PCONTEXT ThreadContext,
IN PUSER_STACK UserStack,
IN BOOLEAN CreateSuspended
);
typedef NTSTATUS (*ZWCREATETHREAD)
(
OUT PHANDLE ThreadHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN HANDLE ProcessHandle,
OUT PCLIENT_ID ClientId,
IN PCONTEXT ThreadContext,
IN PUSER_STACK UserStack,
IN BOOLEAN CreateSuspended
);
ZWCREATETHREAD OldZwCreateThread;

NTSTATUS HookZwCreateThread
(
OUT PHANDLE ThreadHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN HANDLE ProcessHandle,
OUT PCLIENT_ID ClientId,
IN PCONTEXT ThreadContext,
IN PUSER_STACK UserStack,
IN BOOLEAN CreateSuspended
);
HookInjectOn()
{
        DbgPrint("HookInjectOn");
        OldZwCreateThread = (ZWCREATETHREAD)(SYSCALL(ZwCreateThread));
        _asm
        {
                CLI
                        MOV EAX,CR0
                        AND EAX,NOT  10000H
                        MOV CR0,EAX
        }
        (ZWCREATETHREAD)(SYSCALL(ZwCreateThread)) = HookZwCreateThread;
        _asm
        {
                MOV EAX,CR0
                        OR EAX,10000H
                        MOV CR0,EAX
                        STI
        }
}

望高人指点。。先谢谢啊。。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 424
活跃值: (2529)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
已经导出但是未文档化的API,可以自己写个声明就可以用了,比如ObReferenceObjectByName
但是没有导出的API,只写个声明是用不了的,因为.lib里没有对应的符号

ntoskrnl.exe没有导出ZwCreateThread,但是ntdll.dll导出了,可以在Ring3 GetProcAddress(..., "ZwCreateThread")+1取得ZwCreateThread在SSDT里的index,然后传到驱动里HOOK就行了。不想在Ring3做的话,也可以在驱动里ZwCreateFile静态分析ntdll.dll,通过分析PE结构找到ZwCreateThread
2008-10-11 00:47
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢2楼,我还有一个问题,如果我知道NtCreateThread的服务号,直接在ring0下可不可以。
//0x35为NtCreateThread在SSDT中的偏移地址(服务号)
        AddressCT=0x35*4+(ULONG)KeServiceDescriptorTable->ServiceTableBase;
        OldNtCreateThread = *(ULONG*)AddressCT;
     _asm
        {
                CLI
                        MOV EAX,CR0
                        AND EAX,NOT  10000H
                        MOV CR0,EAX
        }       
        *((ULONG*)AddressCT) = (ULONG)HookZwCreateThread;
        _asm
        {
                MOV EAX,CR0
                        OR EAX,10000H
                        MOV CR0,EAX
                        STI
        }
2008-10-11 09:32
0
雪    币: 424
活跃值: (2529)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
可以,但是这样硬编码不大好,在Windows 2003里,0x35对应的就不一定是NtCreateThread,所以最好还是动态获取
2008-10-11 12:20
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
恩,非常谢谢。
2008-10-11 13:26
0
游客
登录 | 注册 方可回帖
返回