首页
社区
课程
招聘
[求助]关于HOOK ZwTerminateThread 的问题
发表于: 2008-7-28 21:50 12245

[求助]关于HOOK ZwTerminateThread 的问题

2008-7-28 21:50
12245
在HOOK SSDT 中的 ZwTerminateThread 的时候遇到了问题
我对 ZwTerminateThread 做如下处理
运行以后用IS看SSDT HOOK 成功了,但是再过几秒就BSOD了````
不知道是不是下面的代码的问题

NTSTATUS HookZwTerminateThread(
  IN PHANDLE ThreadHandle,
  IN NTSTATUS ExitStatus)
{
  NTSTATUS ntstatus;
  PETHREAD eThreadBKill;
  DWORD ThreadProcess;

  ntstatus = ObReferenceObjectByHandle(ThreadHandle,GENERIC_READ,NULL,KernelMode,&eThreadBKill,0);

  if(!NT_SUCCESS(ntstatus))
    return STATUS_ACCESS_DENIED;

  ThreadProcess = *((DWORD *)((DWORD)eThreadBKill + 0x220));

  if (ThreadProcess == (DWORD)eprocBProtect)      //eprocBProtect 是传进来的被保护的进程的 EPROCESS 
    ntstatus = STATUS_ACCESS_DENIED;
  else
    ntstatus = ((ZWTERMINATETHREAD)(OrgZwTerminateThread))(
      ThreadHandle,
      ExitStatus);

  return ntstatus;
}

驱动其他代码应该没有问题,因为之前做过 ZwTerminateProcess 也没见出现问题

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
Deference一下看看
2008-7-28 22:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
有什么区别呢?

NTSTATUS HookZwTerminateProcess(
        IN PHANDLE ProcessHandle,
        IN NTSTATUS ExitStatus)
{
        NTSTATUS ntstatus;
        PEPROCESS eprocFromHandle;

        ntstatus = ObReferenceObjectByHandle(ProcessHandle,GENERIC_READ,NULL,KernelMode,&eprocFromHandle,0);

        if(!NT_SUCCESS(ntstatus))
                return STATUS_ACCESS_DENIED;

        if((DWORD)eprocFromHandle == (DWORD)eprocBeingProtect)
        {
                ntstatus = STATUS_ACCESS_DENIED;
        }
        else
                ntstatus = ((ZWTERMINATEPROCESS)(OrgZwTerminateProcess))(
                        ProcessHandle,
                        ExitStatus);

        return ntstatus;
}

这是我处理TerminateProcess的代码```没有问题```
2008-7-28 22:21
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
同dami
R以后要D一下,因为引用了额。

不D一下不知道会不会变成Zombie Generator~~~

NTKERNELAPI
PEPROCESS
PsGetThreadProcess(
                                   IN PETHREAD Thread
                                   );
把硬编码改改用这个。

或者使用NtQueryInformationThread。

你应该发一下错误代码的。
2008-7-28 22:37
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
IN PHANDLE ThreadHandle

PHANDLE?

注意Dereference

ThreadHandle=0特殊判断下

ObReferenceObjectByHandle最好是UserMode。 DesiredAccess用0
2008-7-28 22:52
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
6
炉子牛来了。
2008-7-28 23:15
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
我现在很奇怪为什么ThreadHandle声明为PHANDLE还能传给ObReferenceObjectByHandle而不出错  - -#

顺道捏大米
2008-7-29 07:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢大家的帮助``

代码已经改过来了```

NTSTATUS HookZwTerminateThread(
        IN HANDLE ThreadHandle,
        IN NTSTATUS ExitStatus)
{
        NTSTATUS ntstatus;
        PETHREAD eThreadBKill;
        DWORD ThreadProcess;

        if(ThreadHandle == 0)
                return STATUS_SUCCESS;

        ntstatus = ObReferenceObjectByHandle(ThreadHandle,0,NULL,UserMode,&eThreadBKill,0);

        if(!NT_SUCCESS(ntstatus))
                return STATUS_UNSUCCESSFUL;

        ThreadProcess = (DWORD)PsGetThreadProcess(eThreadBKill);
                //*((DWORD *)((DWORD)eThreadBKill + 0x220));

        if (ThreadProcess == (DWORD)eprocBeingProtect)
                ntstatus = STATUS_UNSUCCESSFUL;
        else
                ntstatus = ((ZWTERMINATETHREAD)(OrgZwTerminateThread))(
                        ThreadHandle,
                        ExitStatus);
       
        ObDereferenceObject(eThreadBKill);

        return ntstatus;
}

但是 BSOD 依然是有`````

错误代码:C000021a
UnKnow Hard Error
2008-7-29 10:37
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
9
ObDereferenceObject(eThreadBKill);放到

if (ThreadProcess == (DWORD)eprocBeingProtect)
    ntstatus = STATUS_UNSUCCESSFUL;
  else
    ntstatus = ((ZWTERMINATETHREAD)(OrgZwTerminateThread))(
      ThreadHandle,
      ExitStatus);

前面。。。
2008-7-29 12:07
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
UserMode 的ObReferenceObject需要指明ObjectType (*PsThreadType)
2008-7-29 13:08
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
还有就是  ZwTerminateThread可能是由线程自己发起的,这时候要允许执行。
2008-7-29 13:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
终于不 BSOD 了`````

但是会导致一个 Svchost.exe 的CPU占用 100%
2008-7-29 18:11
0
游客
登录 | 注册 方可回帖
返回
//