如何保护某个注册表项不被修改

haipoliehu 2010-05-11 11:39:38
我自己写了程序,在注册表当中有一些数据,我不希望别人来修改我的相关注册表数据。需要对此进行保护。
请达人帮忙指点一下,如果是将整个注册表都禁用这种方法就不需要了。
只要完成直接修改这个注册表项的时候提示无法修改就OK了,
是否有办法通过注册表内部的一些设置或者一些表项的设置来达成这点,请教达人了。
100分先奉上,不够再加
...全文
给本帖投票
1590 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
AIHANZI 2010-05-11
  • 打赏
  • 举报
回复
hkey换成你的键
AIHANZI 2010-05-11
  • 打赏
  • 举报
回复
void CMyDlg::OnButton1()
{
HKEY hkey;
DWORD regd = 0;
::RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",&hkey);
LONG bSuccess =
RegSetValueEx(hkey,"SFCDisable",NULL,REG_DWORD,(BYTE*)®d, sizeof(regd));
RegCloseKey(hkey);
if (bSuccess = ERROR_SUCCESS)
{
MessageBox("很可惜,打开文件保护失败");
}
else
{
MessageBox("恭喜你,成功打开文件保护");
}
}
dinjay 2010-05-11
  • 打赏
  • 举报
回复
创建注册表项的时候参数定为KEY_READ只读,就不会被修改了
wangk 2010-05-11
  • 打赏
  • 举报
回复
1.注册表键的权限分配(缺点,只要对方有管理员权限很容易就提权绕过)
2.驱动保护
hzy694358 2010-05-11
  • 打赏
  • 举报
回复
hook
估计可行
mcaok 2010-05-11
  • 打赏
  • 举报
回复
用驱动隐藏注册表。


PGET_CELL_ROUTINE OrigGetCellRoutine = NULL;
PGET_CELL_ROUTINE *OrigGetCellRoutineAddr = NULL;
PCM_KEY_NODE g_HideNode = NULL;
PCM_KEY_NODE g_LastNode = NULL;

HANDLE OpenKeyByName(PCWSTR pwcsKeyName)
{
NTSTATUS ntStatus;
UNICODE_STRING KeyNameUnicodeString;
OBJECT_ATTRIBUTES ObjectAttributes;
HANDLE hKey;

RtlInitUnicodeString(&KeyNameUnicodeString, pwcsKeyName);
InitializeObjectAttributes(
&ObjectAttributes,
&KeyNameUnicodeString,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL,
NULL);
ntStatus = ZwCreateKey(
&hKey,
KEY_READ,
&ObjectAttributes,
0,
NULL,
REG_OPTION_NON_VOLATILE,
NULL);
if ( !NT_SUCCESS(ntStatus) )
{
return NULL;
}
return hKey;
}

PVOID GetKeyControlBlock(HANDLE hKey)
{
NTSTATUS ntStatus;
PCM_KEY_BODY pKeyBody;
PVOID KeyControlBlock;

if (hKey == NULL)
return NULL;

ntStatus = ObReferenceObjectByHandle(hKey,
KEY_READ,
NULL,
KernelMode,
&pKeyBody,
NULL);
if (!NT_SUCCESS(ntStatus))
{
return NULL;
}
KeyControlBlock = pKeyBody->KeyControlBlock;
ObDereferenceObject(pKeyBody);
return KeyControlBlock;
}

PVOID GetLastKeyNode(PVOID Hive, PCM_KEY_NODE Node)
{

PCM_KEY_NODE ParentNode = (PCM_KEY_NODE)OrigGetCellRoutine(Hive, Node->Parent);
PCM_KEY_INDEX Index = (PCM_KEY_INDEX)OrigGetCellRoutine(Hive, ParentNode->SubKeyLists[0]);

if (Index->Signature == CM_KEY_INDEX_ROOT)
{
Index = (PCM_KEY_INDEX)OrigGetCellRoutine(Hive, Index->List[Index->Count-1]);
}

if ( Index->Signature == CM_KEY_FAST_LEAF || Index->Signature == CM_KEY_HASH_LEAF)
{
return OrigGetCellRoutine(Hive, Index->List[2*(Index->Count-1)]);
}
else
{
return OrigGetCellRoutine(Hive, Index->List[Index->Count-1]);
}
}

PVOID HookGetCellRoutine(PVOID Hive, HANDLE Cell)
{
PVOID pRet = OrigGetCellRoutine(Hive, Cell);
if (pRet)
{
if (pRet == g_HideNode)
{
pRet = g_LastNode = (PCM_KEY_NODE)GetLastKeyNode(Hive, g_HideNode);
if (pRet == g_HideNode)
pRet = NULL;
}
else if (pRet == g_LastNode)
{
pRet = g_LastNode = NULL;
}
}
return pRet;
}

VOID UnHideRegKey()
{
if (OrigGetCellRoutineAddr)
*OrigGetCellRoutineAddr = OrigGetCellRoutine;
DbgPrint("UnHideRegKey\n");
}

NTSTATUS HideRegKey(IN PWCHAR HideKeyName)
{
ULONG BuildNumber;
ULONG KeyHiveOffset;
ULONG KeyCellOffset;
HANDLE hKey;
PVOID KCB, Hive;

if (PsGetVersion(NULL, NULL, &BuildNumber, NULL))
return STATUS_NOT_SUPPORTED;
switch (BuildNumber)
{
case 2195: // Win2000
KeyHiveOffset = 0xc;
KeyCellOffset = 0x10;
break;
case 2600: // WinXP
case 3790: // Win2003
KeyHiveOffset = 0x10;
KeyCellOffset = 0x14;
break;
default:
return STATUS_NOT_SUPPORTED;
}
hKey = OpenKeyByName(HideKeyName);
KCB = GetKeyControlBlock(hKey);
if (KCB)
{
PHHIVE Hive = (PHHIVE)GET_PTR(KCB, KeyHive);

OrigGetCellRoutineAddr = &Hive->GetCellRoutine;
OrigGetCellRoutine = Hive->GetCellRoutine;

g_HideNode = (PCM_KEY_NODE)OrigGetCellRoutine(Hive, GET_PTR(KCB, KeyCell));
Hive->GetCellRoutine = HookGetCellRoutine;
}
ZwClose(hKey);

return STATUS_SUCCESS;
}

haipoliehu 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 oyljerry 的回复:]
引用 9 楼 haipoliehu 的回复:

引用 3 楼 dinjay 的回复:
创建注册表项的时候参数定为KEY_READ只读,就不会被修改了

这个我先去试试,不过如果设置成为只读 会不会以后自己程序也没办法修改了那

设置注册表priviledge,去掉write权限等,当你要写的时候,之前修改属性
[/Quote]

请教

能否说的具体点,比如说用什么API大概的操作流程。谢谢
yli5891 2010-05-11
  • 打赏
  • 举报
回复
你可以监视特定的注册表键,
使用如下的函数

监视注册表相关项的改变要用到一个API:RegNotifyChangeKeyValue。

LONG RegNotifyChangeKeyValue(

HKEY hKey, // 要监视的一个项的句柄
BOOL bWatchSubtree, // 是否监视此项的子键
DWORD dwNotifyFilter, // 监视哪些变化
HANDLE hEvent, // 接受注册表变化事件的事件对象句柄
BOOL fAsynchronous // 注册表变化前报告还是注册表变化后才报告
);

具体的方法我不会,你可以参考一下下面的这个帖子
http://topic.csdn.net/t/20040622/09/3111704.html
另外,上面的帖子是2004年的,我印象中XP和Vista对这个机制做了跟好的扩充,你可以查一下
oyljerry 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 haipoliehu 的回复:]

引用 3 楼 dinjay 的回复:
创建注册表项的时候参数定为KEY_READ只读,就不会被修改了

这个我先去试试,不过如果设置成为只读 会不会以后自己程序也没办法修改了那
[/Quote]
设置注册表priviledge,去掉write权限等,当你要写的时候,之前修改属性
haipoliehu 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dinjay 的回复:]
创建注册表项的时候参数定为KEY_READ只读,就不会被修改了
[/Quote]
这个我先去试试,不过如果设置成为只读 会不会以后自己程序也没办法修改了那
haipoliehu 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangk 的回复:]
1.注册表键的权限分配(缺点,只要对方有管理员权限很容易就提权绕过)
2.驱动保护
[/Quote]

第一个不考虑

第二个 驱动这边 我没写过驱动的程序,我身边会写驱动的人 也未必能写出来这个。哎 郁闷
haipoliehu 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hzy694358 的回复:]
hook
估计可行
[/Quote]
我最初考虑过钩子来实现,觉得可能会比较麻烦一些,要全局钩子,也可能会对性能有影响
visualassist4680 2010-05-11
  • 打赏
  • 举报
回复
写驱动

2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部