⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 注册表重定向.txt

📁 文件系统驱动开发的文档资料(IFS DDK)
💻 TXT
字号:
========注册表重定向!!有代码======

想做一个注册表重定向,如当有应用程序读\\Registry\\Machine\\SOFTWARE\\A时,将其定向到\\Registry\\Machine\\SOFTWARE\\B, 
如何做?各位大侠给点思路。多谢! 

另外有个问题: 
参考REGMON,我在HookRegOpenKey中判断,如果是我HOOK的键值\\Registry\\Machine\\SOFTWARE\\A,我就这么处理: 
OBJECT_ATTRIBUTES obj; 
UNICODE_STRING uRegistryPath; 
WCHAR uPath[]=L"\\\\REGISTRY\\\\MACHINE\\\\SOFTWARE\\\\B"; 
RtlInitUnicodeString(&uRegistryPath,uPath); 
InitializeObjectAttributes(&obj,&uRegistryPath,OBJ_CASE_INSENSITIVE, NULL, NULL ); 
pOpenInfo=&obj; 
ntstatus = RealRegOpenKey( pHandle, ReqAccess, pOpenInfo ); 
但总是不成功,不知道为什么? 

========================================


[quote]想做一个注册表重定向,如当有应用程序读\Registry\Machine\SOFTWARE\A时,将其定向到\Registry\Machine\SOFTWARE\B, 
如何做?各位大侠给点思路。多谢! 

另外有个问题: 
参考REGMON,我在HookRegOpenKey中判断,如果是我HOOK的键值\Registry\Machine\SOFTWARE\A,我就这么处理: 
OBJECT_ATTRIBUTES obj; 
UNICODE_STRING uRegistryPath; 
WCHAR uPath[]=L"\\REGISTRY\\MACHINE\\SOFTWARE\\B"; 
RtlInitUnicodeString(&uRegistryPath,uPath); 
InitializeObjectAttributes(&obj,&uRegistryPath,OBJ_CASE_INSENSITIVE, NULL, NULL ); 
pOpenInfo=&obj; 
ntstatus = RealRegOpenKey( pHandle, ReqAccess, pOpenInfo ); 
但总是不成功,不知道为什么? 

================================


NTSTATUS HookRegOpenKey( IN OUT PHANDLE pHandle, IN ACCESS_MASK ReqAccess, 
IN POBJECT_ATTRIBUTES pOpenInfo ) 
{ 
NTSTATUS ntstatus; 
POBJECT regobj; 
CHAR fullname[MAXPATHLEN]; 
PREDIR_ENTRY pEntry=NULL; 
OBJECT_ATTRIBUTES obj; 
char szTmp[256]; 
UNICODE_STRING uRegistryPath; 
WCHAR uPath[]=L"\\\\REGISTRY\\\\MACHINE\\\\SOFTWARE\\\\B"; 
CHAR aPath[]="\\\\REGISTRY\\\\MACHINE\\\\SOFTWARE\\\\A"; 
BOOLEAN bIsMy=FALSE; 

GetFullName( pOpenInfo->RootDirectory, pOpenInfo->ObjectName, fullname ); 

if(_stricmp(fullname+1,aPath)==0) 
{ 
sprintf(szTmp,"OpenMyKey,path:%s",fullname+1); 
WriteLog(szTmp); 
bIsMy=TRUE; 
RtlInitUnicodeString(&uRegistryPath,uPath); 
InitializeObjectAttributes(&obj,&uRegistryPath,OBJ_CASE_INSENSITIVE, NULL, NULL ); 
ntstatus = RealRegOpenKey( pHandle, ReqAccess, &obj ); 
//执行完后ntstatus=STATUS_ACCESS_VIOLATION,访问非法,为什么? 
} 
else 
{ 
ntstatus = RealRegOpenKey( pHandle, ReqAccess, pOpenInfo ); 
} 

if(bIsMy && NT_SUCCESS( ntstatus )) 
{ 
sprintf(szTmp,"RegOpenKey success:%s => %x, %s", fullname, *pHandle,ErrorString(ntstatus )); 
WriteLog(szTmp); 
} 
else if(bIsMy) 
{ 
sprintf(szTmp,"RegOpenKey fail:%s => %x, %s", fullname, *pHandle,ErrorString(ntstatus )); 
WriteLog(szTmp); 
} 
if( NT_SUCCESS( ntstatus )) 
{ 
regobj = GetPointer( *pHandle ); 
RegmonFreeHashEntry( regobj ); 
RegmonLogHash( regobj, fullname ); 
ReleasePointer( regobj ); 
} 
return ntstatus; 
}

=================================

出错部分改为如下: 
if(_stricmp(fullname,"HKLM\\\\software\\\\A") 
{ 
UNICODE_STRING uRegistryPath; 
WCHAR uPath[]=L"SOFTWARE\\\\B"; 

OBJECT_ATTRIBUTES obj; 

RtlInitUnicodeString(&uRegistryPath,uPath); 

pOpenInfo->ObjectName->Length=uRegistryPath.Length; 
RtlMoveMemory( pOpenInfo->ObjectName->Buffer, 
uRegistryPath.Buffer, 
uRegistryPath.Length); 


InitializeObjectAttributes( &obj, 
pOpenInfo->ObjectName, 
pOpenInfo->Attributes, 
pOpenInfo->RootDirectory, 
NULL ); 
ntstatus = RealRegOpenKey( pHandle, ReqAccess, &obj ); 
} 

===============================
或直接使用原先的pOpenInfo 
if(_stricmp(fullname,"HKLM\\software\\A") 
{ 
UNICODE_STRING uRegistryPath; 
WCHAR uPath[]=L"SOFTWARE\\B"; 

RtlInitUnicodeString(&uRegistryPath,uPath); 

pOpenInfo->ObjectName->Length=uRegistryPath.Length; 
RtlMoveMemory( pOpenInfo->ObjectName->Buffer, 
uRegistryPath.Buffer, 
uRegistryPath.Length); 
} 


ntstatus = RealRegOpenKey( pHandle, ReqAccess,pOpenInfo); 
===============================
[quote]我试了一下,open没有问题了,谢谢! 
高手出招就是不一样!呵呵 

但enum时还有问题,也就是当用regedit打开时,看到的键值不对 
请继续关注..... [/quote] 


说得很模糊,问题出在哪里? 

你是EnumerateKey还是EnumerateValueKey 
你跟踪一下, 
有些使用的是"相对路径+handle"标识键的
==============
我是这么重定向的: 
当有应用程序读\\Registry\\Machine\\SOFTWARE\\A时,(其中A这个键值在注册表中并不存在)将其定向到\\Registry\\Machine\\SOFTWARE\\B 

我只在HookRegOpenKey和HookRegCreateKey中做了处理,处理方法同上面的方法 

当应用程序以Create方式打开注册表时就会蓝屏,信息如下: 
UNEXPECTED_KERNEL_MODE_TRAP 
有时还居然是这个信息: 
IRQL_NOT_LESS_OR_EQUAL 
==============
在HookRegCreateKey函数中,用与HookRegOpenKey同样的方法来处理,为什么会蓝屏呢? 

KERNEL_EXPECTION_NOT_HANDLED 

为什么? 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -