首页
社区
课程
招聘
[求助]ZwSetInformationThread
发表于: 2008-12-15 21:55 11065

[求助]ZwSetInformationThread

2008-12-15 21:55
11065
#include <windows.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#define NTAPI              __stdcall
typedef long              NTSTATUS;
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#define STATUS_SUCCESS    ((NTSTATUS)0L)

typedef struct _PROCESS_DEBUG_PORT_INFO
{
    HANDLE DebugPort;
}    PROCESS_DEBUG_PORT_INFO;

enum THREAD_INFO_CLASS        { ThreadHideFromDebugger          = 17 };
typedef NTSTATUS  (NTAPI *ZW_SET_INFORMATION_THREAD)(IN HANDLE ThreadHandle, IN THREAD_INFO_CLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength);

ZW_SET_INFORMATION_THREAD ZwSetInformationThread;
void main()
{

        ZwSetInformationThread = (ZW_SET_INFORMATION_THREAD)GetProcAddress(GetModuleHandle("ntdll.dll"), "ZwSetInformationThread");
        if (ZwSetInformationThread == NULL)
        {
                printf("%s", "Failed: GetProcAddress ZwSetInformationThread");
                return ;
        }
       
        if (STATUS_SUCCESS != ZwSetInformationThread(GetCurrentThread(), ThreadHideFromDebugger, NULL, 0))
        {
                printf("%d\r\n", GetLastError());

                //MessageBox(0, str, str, 0);
                cout << "Failed: ZwSetInformationThread" << endl;
        }
        cout << "OK" << endl;
        //MessageBox(0, "0", "0", 0);
}

ZwSetInformationThread
用这个函数可以将某个线程的调试端口设为0,使得Win32调试器无法再收到该线程的调试事件,使调试器无法再调试该线程。这个主要是针对VC++这样的ring3调试器的。
上面这段代码编译出来是没有错误的,但是运行的时候,用OD还是能附加,这是为什么呢,我是按照示例代码来编写的啊,为什么OD还是能调试呢?

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没人能看出是什么问题吗?
这个代码可以直接用C编译器编译的,用OD能附加上,
我看了下OD并没有HOOK ZwSetInformationThread
2008-12-16 10:58
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
3
OD在入口处断下来很正常啊~
请使用windbg验证吧~
Anti OD不是那么容易的~
2008-12-16 23:29
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我把自己的主线程设置为0了,为什么OD还能附加上,而且能正确显示代码呢?奇怪啊
2008-12-17 04:24
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
5
要把你的所有线程都设上
2008-12-17 19:00
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
循环处理看看呢
2009-1-12 07:30
0
雪    币: 271
活跃值: (21)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
这不是第三版书里那个例子吗? 我也正学习呢 呵呵
你用OD加载 在ZwSetInformationThread = (ZW_SET_INFORMATION_THREAD)GetProcAddress(GetModuleHandle("ntdll.dll"), "ZwSetInformationThread");这句下断走到那就看到ZwSetInformationThread的效果了.附加的话实际也是有效果的,附加的原理我还不懂,你在程序cout << "OK" << endl; 这句后加
  int i;
  cin  >> i;
  cout << i << endl;
  cin  >> i;
附加上这几句执行不了, 在cin  >> i;下断就知道拉
2009-1-12 10:36
0
雪    币: 271
活跃值: (21)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
ZwSetInformationThread(GetCurrentThread(), ThreadHideFromDebugger, NULL, 0))这句 贴错了
2009-1-12 10:50
0
游客
登录 | 注册 方可回帖
返回
//