描述:
我想对RegMon进行改造,能做到在Hook注册表SetValue操作时,先获取该注册表项值修改之前的原值。
具体操作如下(针对430版本):
在HookRegSetValueKey函数中,GetFullName( KeyHandle, valueName, fullname );代码之后,加入如下代码:
ResultLength = 0;
ntstatus = ZwQueryValueKey(KeyHandle,valueName,KeyValueFullInformation,
pKeyValueInformation,ResultLength,&ResultLength);//获取所需内存空间大小
strcpy(olddata,"STATUS_EMPTY");
if(ResultLength>0){
pKeyValueInformation = ( PKEY_VALUE_FULL_INFORMATION) \
ExAllocatePool( PagedPool, ResultLength);//分配内存空间
ntstatus = ZwQueryValueKey( KeyHandle,
valueName,
KeyValueFullInformation,
pKeyValueInformation,
ResultLength, &ResultLength);//实际取值
if(ntstatus==STATUS_BUFFER_TOO_SMALL)
strcpy(olddata,"BUF TOO SMALL");
else if(ntstatus==STATUS_INVALID_PARAMETER)
strcpy(olddata,"STATUS_INVALID_PARAMETER");
else if(ntstatus==STATUS_OBJECT_NAME_NOT_FOUND)
strcpy(olddata,"STATUS_OBJECT_NAME_NOT_FOUND");
else
strcpy(olddata,"STATUS_SUCESS");
}
现在有两个问题:1、第一次调用ZwQueryValueKey时没有问题,正确返回了所需内存大小,但是第二次调用时,用SoftIce调试,出现问题,不再继续执行接下来的代码了。2、若第二次调用ZwQueryValueKey成功,我如何将获取的注册表项值也同样采用后续的 LogRecord方式返回给用户态程序?我不大会用字符转换的咚咚。
请各位指点,如果我上述方法是错误的,请问各位都是用什么办法实现的?