大家好,我现在要做一个保护注册表的功能, 是这样的:
假设需要保护下面这个RUN注册表项,
\\REGISTRY\\MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN
而这个RUN项里面有一个或者几个键值。
现在的要求是: 保护RUN注册表项和它下面的所有键值,使得它们不能被删除、不能被重命名、不能被修改。
如果我就只Hook ZwSetValueKey这个函数,可以吗?能够达到我想要的效果吗?
大家请先看Hook的ZwSetValueKey函数-----HookZwSetValueKey的代码。
NTSTATUS HookZwSetValueKey( IN HANDLE KeyHandle,
IN PUNICODE_STRING ValueName,
IN ULONG TitleIndex OPTIONAL,
IN ULONG Type,
IN PVOID Data,
IN ULONG DataSize)
{
NTSTATUS rc;
UNICODE_STRING *pUniName; //定义得到修改注册表的UNI路径
ULONG actualLen;
ANSI_STRING keyname,
akeyname,
m_keyname,
m_akeyname; //定义得到修改注册表的UNI路径
PVOID pKey;
RtlUnicodeStringToAnsiString( &akeyname, ValueName, TRUE);
RtlUnicodeStringToAnsiString( &m_akeyname, ValueName, TRUE);
RtlUpperString(&akeyname,&m_akeyname);
RtlFreeAnsiString(&m_akeyname);
DbgPrint("*******Enter HookZwSetValueKey()*******\n");
if( pKey = GetPointer( KeyHandle))
{
pUniName = ExAllocatePool( NonPagedPool, 512*2+2*sizeof(ULONG));
pUniName->MaximumLength = 512*2;
if( NT_SUCCESS( ObQueryNameString( pKey, pUniName, MAXPATHLEN, &actualLen)))
{
RtlUnicodeStringToAnsiString( &keyname, pUniName, TRUE);
keyname.Buffer=_strupr(keyname.Buffer);
akeyname.Buffer=_strupr(akeyname.Buffer);
RtlUnicodeStringToAnsiString( &m_keyname, pUniName, TRUE);
RtlUpperString(&keyname,&m_keyname);
RtlFreeAnsiString(&m_keyname);
if (strcmp(keyname.Buffer,"\\REGISTRY\\MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN") == 0)
{
return STATUS_ACCESS_DENIED;
}
RtlFreeAnsiString(&keyname);
}
ObDereferenceObject(pKey);
}
RtlFreeAnsiString(&akeyname);
DbgPrint("调用 rc=RealZwSetValueKey(KeyHandle,ValueName,TitleIndex,Type,Data,DataSize);\n");
rc=RealZwSetValueKey(KeyHandle,ValueName,TitleIndex,Type,Data,DataSize);
DbgPrint("*******Leave HookZwSetValueKey()*******\n");
return rc;
}
如果不可以只Hook掉ZwSetValueKey这个函数,那么请问您,我应该Hook哪几个注册表函数。
[课程]Linux pwn 探索篇!