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

[求助]ZwQueryInformationThread 的使用问题

2023-5-29 10:56
5816

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


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞1
打赏
分享
最新回复 (10)
雪    币: 205
活跃值: (2574)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
yeyeshun 2 2023-5-29 14:19
2
0

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

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

原型:

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 ....

尝试下看看.

雪    币: 888
活跃值: (1265)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Hbruce 2023-5-29 17:52
5
0
TkBinary 原型:NTSTATUS ZwQueryInformationThread (   _In_ &nbs ...
第一次返回的need_size 还是0,错误还是STATUS_INFO_LENGTH_MISMATCH      ((NTSTATUS)0xC0000004L)
雪    币: 405
活跃值: (1870)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wowocock 1 2023-5-30 11:26
6
1
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;
雪    币: 823
活跃值: (3490)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
逆向爱好者 2023-5-31 08:59
7
0
解决没有
雪    币: 888
活跃值: (1265)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Hbruce 2023-5-31 09:53
8
0

                            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编辑 ,原因:
雪    币: 888
活跃值: (1265)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Hbruce 2023-5-31 11:05
9
0
问题已经解决,感谢各位大神答疑
雪    币: 2390
活跃值: (9210)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
TkBinary 5 2023-5-31 11:32
10
0
Hbruce 问题已经解决,感谢各位大神答疑

上面方法解决的?


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

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