首页
社区
课程
招聘
[求助]ZwQueryInformationThread 的使用问题
发表于: 2023-5-29 10:56 6759

[求助]ZwQueryInformationThread 的使用问题

2023-5-29 10:56
6759

最近想做个线程监控并拦截的功能,实现方式主要是通过线程回调函数CreateThreadNotifyFunction来监控
但是在拦截线程的使用遇到了问题
监控函数只能获取线程id,所以先通过ZwOpenThread 函数获取线程句柄
再调用 PVOID pvStart = NULL;
ULONG nReturnLen = 0;
state = ZwQueryInformationThread(threadHandle, ThreadQuerySetWin32StartAddress, pvStart, sizeof(pvStart), &nReturnLen);
获取线程的回调函数,通过修改线程回调函数来实现拦截,ZwQueryInformationThread 一直返回 0xC0000005 错误


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (10)
雪    币: 775
活跃值: (3420)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
2

pvStart需要你自己先分配空间,长度也不是sizeof(pvStart)

最后于 2023-5-29 14:20 被yeyeshun编辑 ,原因:
2023-5-29 14:19
0
雪    币: 1572
活跃值: (1880)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
yeyeshun pvStart需要你自己先分配空间,长度也不是sizeof(pvStart)
传入了分配的内存和长度,返回错误长度不匹配,但是最后个参数ReturnLength值一直不变,初始值是多少还是多少
2023-5-29 16:38
0
雪    币: 881
活跃值: (9856)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
4

原型:

NTSTATUS ZwQueryInformationThread (
  _In_      HANDLE          ThreadHandle,
  _In_      THREADINFOCLASS ThreadInformationClass,
  _In_      PVOID           ThreadInformation,
  _In_      ULONG           ThreadInformationLength,
  _Out_opt_ PULONG          ReturnLength
);

微软Api都有套路. 可以第一次调用函数. 调用后获取一下需要申请的空间大小.

如:

PVOID buffer = nullptr;
ULONG need_size = 0;
ZwQueryInformationThread(threadHandle, ThreadQuerySetWin32StartAddress, NULL,0,&need_size);
//check....
//申请空间,申请need_size大小.然后重新调用
ZwQueryInformationThread(threadHandle, ThreadQuerySetWin32StartAddress, buffer,need_size,&need_size);
//check...
//your code ....

尝试下看看.

2023-5-29 17:24
1
雪    币: 1572
活跃值: (1880)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
TkBinary 原型:NTSTATUS ZwQueryInformationThread (   _In_ &nbs ...
第一次返回的need_size 还是0,错误还是STATUS_INFO_LENGTH_MISMATCH      ((NTSTATUS)0xC0000004L)
2023-5-29 17:52
0
雪    币: 405
活跃值: (2285)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
case ThreadQuerySetWin32StartAddress:
        if (ThreadInformationLength != sizeof (ULONG_PTR)) {
            return STATUS_INFO_LENGTH_MISMATCH;
        }

        st = ObReferenceObjectByHandle (ThreadHandle,
                                        THREAD_QUERY_INFORMATION,
                                        PsThreadType,
                                        PreviousMode,
                                        &Thread,
                                        NULL);

        if (!NT_SUCCESS (st)) {
            return st;
        }

        Win32StartAddressValue = Thread->Win32StartAddress;
        ObDereferenceObject (Thread);

        try {
            *(PVOID *) ThreadInformation = Win32StartAddressValue;

            if (ARGUMENT_PRESENT (ReturnLength) ) {
                *ReturnLength = sizeof (ULONG_PTR);
            }
        } except (EXCEPTION_EXECUTE_HANDLER) {
            return GetExceptionCode ();
        }

        return st;
2023-5-30 11:26
1
雪    币: 1553
活跃值: (4603)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
解决没有
2023-5-31 08:59
0
雪    币: 1572
活跃值: (1880)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8

                            PVOID pvStart = ExAllocatePool(NonPagedPool, sizeof(PULONG_PTR));
                            ULONG nLength = 0;
                            state = ZwQueryInformationThread(threadHandle, ThreadQuerySetWin32StartAddress, pvStart, sizeof(PULONG_PTR), &nLength);

                           这样写成功了

                            不过修改回调地址拦截没生效

                            

                                KIRQL irql = CloseWriteProf();

                                *(UCHAR*)pvStart = 0xC3;

                                OpenWriteProf(irql);

                           

                            

KIRQL CloseWriteProf()

{

    KIRQL irql = KeRaiseIrqlToDpcLevel();

    ULONG_PTR cr0 = __readcr0();


    cr0 &= 0xfffffffffffeffff;

    _disable();

    __writecr0(cr0);


    return irql;

}

VOID OpenWriteProf(KIRQL irql)

{

    ULONG_PTR cr0 = __readcr0();

    cr0 |= 0x10000;

    __writecr0(cr0);

    _enable();

    KeLowerIrql(irql);

}


最后于 2023-5-31 10:36 被Hbruce编辑 ,原因:
2023-5-31 09:53
0
雪    币: 1572
活跃值: (1880)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
问题已经解决,感谢各位大神答疑
2023-5-31 11:05
0
雪    币: 881
活跃值: (9856)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
10
Hbruce 问题已经解决,感谢各位大神答疑

上面方法解决的?


还有修改回调地址 可以使用 Attach MDL .....等方式. 

最后于 2023-5-31 11:33 被TkBinary编辑 ,原因:
2023-5-31 11:32
0
雪    币: 1572
活跃值: (1880)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
TkBinary Hbruce 问题已经解决,感谢各位大神答疑 上面方法解决的?还有修改回调地址 可以使用 Attach MDL .....等方式.&nb ...
是的,上面写的获取成功了,修改回调地址上面加入attach后也成功了
2023-5-31 15:28
0
游客
登录 | 注册 方可回帖
返回
//