首页
社区
课程
招聘
未解决 [讨论]NtQueryInformationThread 过 NGS 的问题
发表于: 2019-7-27 11:35 7798

未解决 [讨论]NtQueryInformationThread 过 NGS 的问题

2019-7-27 11:35
7798
NGS的保护  会检测 硬件断点 我想实现  HOOK  NtQueryInformationThread 来达到 自己设置 硬件断点 。现在的问题是 HOOK 这个函数 在
THREADINFOCLASS=ThreadWow64Context 时 清空了ThreadInformation 但是 问题来了, 游戏中我设置的断点只会触发一次, 然后就没有了, 谁能给指导下 应该如何去做呢?   系统X64 目标32位;

PWOW64_CONTEXT threadContext;
    PETHREAD target_thread;
pName = PsGetProcessImageFileName( PsGetCurrentProcess());
    ntstaus = ((_NtQueryInformationThread)pfNtQueryInformationThread)(ThreadHandle,ThreadInformationClass,ThreadInformation,ThreadInformationLength,ReturnLength);
    if (NT_SUCCESS(ntstaus)&& ExGetPreviousMode()!=KernelMode)
    {
        if (ThreadInformationClass == ThreadWow64Context &&ThreadHandle!=NULL)
        {
            Status = ObReferenceObjectByHandle(ThreadHandle,THREAD_GET_CONTEXT,*PsThreadType,KernelMode,(PVOID *)&target_thread,NULL);
            if (NT_SUCCESS(Status)&&(_stricmp(pName,"KDC.exe")==0) )
            {
                if (target_thread == PsGetCurrentThread())
                {
                    threadContext = (PWOW64_CONTEXT)ThreadInformation;
                    threadContext->Dr0 = threadContext->Dr1 = threadContext->Dr7 = 0;
                }
            }
            ObDereferenceObject(target_thread);
        }
    }
    return ntstaus;

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

最后于 2019-7-27 11:36 被yyinzlf编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
2
呃呃呃 昨天问的时候都还是dnf.exe 咋今天就变成kdc.exe了
2019-7-27 11:50
0
雪    币: 168
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
Sprite雪碧 呃呃呃 昨天问的时候都还是dnf.exe 咋今天就变成kdc.exe了
都是韩服的东西  都一样
2019-7-27 11:57
0
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
4
BOOL __stdcall Wow64GetThreadContext(HANDLE hThread, PWOW64_CONTEXT lpContext)
{
  unsigned int v2; // eax

  v2 = RtlWow64GetThreadContext(hThread, lpContext);
  if ( (v2 & 0x80000000) == 0 )
    return 1;
  BaseSetLastNTError(v2);
  return 0;
}

2019-7-27 12:12
0
雪    币: 168
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
Sprite雪碧 BOOL __stdcall Wow64GetThreadContext(HANDLE hThread, PWOW64_CONT ...
先谢谢您  但是 RtlWow64GetThreadContext 这个函数 报没有定义 ?  你这个是内核 还是R3 的 ?
2019-7-27 12:35
0
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
6
函数是内核的 Wow64GetThreadContext 直接声明就能用
参数是线程句柄 函数的底层实现是 RtlWow64GetThreadContext 应该也是通过 ETHREAD 去取的⑧ 不清楚
RtlWow64GetThreadContext 是从其他文件导入的
最后于 2019-7-27 12:54 被Sprite雪碧编辑 ,原因:
2019-7-27 12:53
0
雪    币: 168
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Sprite雪碧 函数是内核的 Wow64GetThreadContext 直接声明就能用参数是线程句柄 函数的底层实现是 RtlWow64Get ...
十分感谢  我去DBG 看看这个函数  不知道 X64下32位程序 是不是 走这里。 再次谢谢
2019-7-27 13:03
0
雪    币: 168
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8

DBG中查不到 这两个函数

2019-7-27 13:37
0
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
9
那就是我搞错了。函数是r3的,刚仔细看了下,这玩意最终还是进入的是NtQueryInformationThread。
      result = ObReferenceObjectByHandleWithTag((ULONG_PTR)hThread, 0x746C6644, (unsigned __int64)&EThread, 0i64, v93);
      if ( result >= 0 )
      {
        v77 = PspWow64GetContextThreadOnAmd64((__int64)EThread, (int *)v67->m128i_i64, v70);
        ObfDereferenceObject(EThread);
        if ( v77 >= 0 && a5 )
          *(_DWORD *)a5 = 716;
        result = v77;
      }
取Context应该就是这个了 剩下的应该看得懂吧
最后于 2019-7-27 13:59 被Sprite雪碧编辑 ,原因:
2019-7-27 13:58
0
雪    币: 168
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
问题没有解决  不知道 这个Wow64GetThreadContext 如何去找地址来HOOK  DBG 中看不到
2019-7-27 14:20
0
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
11
yyinzlf 问题没有解决 不知道 这个Wow64GetThreadContext 如何去找地址来HOOK DBG 中看不到
不是给你说了最终进入了 ntquerythread了吗 上面伪代码写的很清楚了 Wow64GetThreadContext 是r3调用的
2019-7-27 14:40
0
雪    币: 168
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
Sprite雪碧 不是给你说了最终进入了 ntquerythread了吗 上面伪代码写的很清楚了 Wow64GetThreadContext 是r3调用的
汗 你上面说 是内核代码所以我才看的, 32位进程在 X64下 调用 GetContextThread 在内核是 走的 NtQueryInformationThread 这个 但是 我目前面临的问题是如何 返回个没有硬件断点的 CONTEXT 给 应用层 而同时还可以实现 自己设定的硬件断点 即在内核层 CONTEXT 不是空的、
我的实现方式是在0层 而非R3
X32下 HOOK NtGetContextThread 就可以办到这点, 但是 X64却不是走的这个函数 所以目前卡在了 NtQueryInformationThread  这块的处理上
最后于 2019-7-27 14:43 被yyinzlf编辑 ,原因:
2019-7-27 14:42
0
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
13
我这句更正的话已经说的很明白了吧,贴的就是NtQueryInfoThread取Context的代码。
你hook query后,判断是不是检测调用的,如果是,直接返回注册没断点的寄存器。
如果不是检测调用的,就手动调用这个psp开头的api不就行了
2019-7-27 14:51
0
雪    币: 168
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
你上边的更正没注意到 只看贴的代码了 不好意思

问题是怎么判断 是检测调用的 ?  这问题就在这里呢
最后于 2019-7-28 19:17 被yyinzlf编辑 ,原因:
2019-7-27 14:59
0
雪    币: 367
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
x32都来辣
2020-1-2 17:56
0
雪    币: 1182
活跃值: (954)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
NGS好像没有r0的检测
2020-1-20 01:14
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
GetThreadContext
NtQueryInformationThread  ->  ThreadWow64Context  ->  PWOW64_CONTEXT
两种方式么?
2020-8-23 04:43
0
游客
登录 | 注册 方可回帖
返回
//