阅读:3062回复:12
========注册表重定向!!有代码======
想做一个注册表重定向,如当有应用程序读\\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 ); 但总是不成功,不知道为什么? |
|
最新喜欢:hongsi... |
沙发#
发布于:2004-12-22 21:00
想做一个注册表重定向,如当有应用程序读\Registry\Machine\SOFTWARE\A时,将其定向到\Registry\Machine\SOFTWARE\B, 这个思路基本可行,你调试一下代码看是什么原因? |
|
|
板凳#
发布于:2004-12-23 08:35
跟踪一下,返回什么错误?
|
|
|
地板#
发布于:2004-12-23 10:03
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; } |
|
地下室#
发布于:2004-12-23 11:00
有没有人在呀?快帮看看呀!
|
|
5楼#
发布于:2004-12-23 15:30
出错部分改为如下:
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 ); } |
|
|
6楼#
发布于:2004-12-23 15:39
或直接使用原先的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); |
|
|
7楼#
发布于:2004-12-23 18:01
我试了一下,open没有问题了,谢谢!
高手出招就是不一样!呵呵 但enum时还有问题,也就是当用regedit打开时,看到的键值不对 请继续关注..... |
|
8楼#
发布于:2004-12-24 12:45
我试了一下,open没有问题了,谢谢! 说得很模糊,问题出在哪里? 你是EnumerateKey还是EnumerateValueKey 你跟踪一下, 有些使用的是"相对路径+handle"标识键的 |
|
|
9楼#
发布于:2004-12-28 17:38
用上述的方法,open是没问题了,但仅限于用自己的程序来open,如果用regedit来打开,每次都蓝屏!
问题一定在HookRegOpenKey函数里,但调试了两天了,还没搞定! 高手再看看吧!谢谢了! |
|
10楼#
发布于:2004-12-29 08:36
篮屏信息是什么
|
|
|
11楼#
发布于:2004-12-29 17:43
我是这么重定向的:
当有应用程序读\\Registry\\Machine\\SOFTWARE\\A时,(其中A这个键值在注册表中并不存在)将其定向到\\Registry\\Machine\\SOFTWARE\\B 我只在HookRegOpenKey和HookRegCreateKey中做了处理,处理方法同上面的方法 当应用程序以Create方式打开注册表时就会蓝屏,信息如下: UNEXPECTED_KERNEL_MODE_TRAP 有时还居然是这个信息: IRQL_NOT_LESS_OR_EQUAL [编辑 - 12/29/04 by pursuer_zhao] |
|
12楼#
发布于:2004-12-30 12:55
在HookRegCreateKey函数中,用与HookRegOpenKey同样的方法来处理,为什么会蓝屏呢?
KERNEL_EXPECTION_NOT_HANDLED 为什么? |
|