📄 注册表重定向.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 + -