[半原创]发个注册表保护的源码 - TaRegProtectDemo
本帖最后由 HoviDelphic 于 2010-4-25 11:03 编辑无聊的注册表键值保护,能轻易在Ring 3下绕过。
不过网上键值保护的代码貌似比较少,所以还是公布出来吧!
仅仅Hook了三个函数:NtSetValueKey、NtDeleteValueKey、NtRestoreKey。
要完全保护键值,请参考卡巴斯基2010的SSDT HOOK列表。
KERNEL HOOK这东西,估计很快就没有市场了,因为x64不准HOOK。
破PatchGuard确实可以,不过估计没有人会用于商业软件,因为不稳定。
PVOID GetPointer( HANDLE handle )
{
PVOID pKey;
if(!handle)
return NULL;
if(ObReferenceObjectByHandle( handle, 0, NULL, KernelMode, &pKey, NULL ) != STATUS_SUCCESS )
pKey = NULL;
return pKey;
}
NTSTATUS fake_NtSetValueKey
(
IN HANDLE KeyHandle,
IN PUNICODE_STRING ValueName,
IN ULONG TitleIndex OPTIONAL,
IN ULONG Type,
IN PVOID Data,
IN ULONG DataSize
)
{
PVOID pKey;
UNICODE_STRING *pUniName;
ULONG actualLen;
ANSI_STRING keyname;
NTSTATUS status;
UNICODE_STRING uStrValueName,OurKey;
if(pKey = GetPointer( KeyHandle))
{
//分配内存
pUniName = ExAllocatePool(NonPagedPool, 1024*2);
pUniName->MaximumLength = 512*2;
//将pUniName里的内容清空
memset(pUniName,0,pUniName->MaximumLength);
//得到注册表项的路径
if(NT_SUCCESS(ObQueryNameString(pKey, pUniName, 512*2, &actualLen)))
{
RtlUnicodeStringToAnsiString(&keyname, pUniName, TRUE);
keyname.Buffer=_strupr(keyname.Buffer);//大写所有字母
//判断是不是Run项
if (strcmp(keyname.Buffer,"\\REGISTRY\\MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN") == 0)
{
RtlInitUnicodeString( &OurKey, L"test" );
if( RtlCompareUnicodeString(ValueName,&OurKey,TRUE)==0 )
{
//释放内存
RtlFreeAnsiString(&keyname);
if(pUniName) ExFreePool(pUniName);
return STATUS_ACCESS_DENIED;
}
}
}
}
RtlFreeAnsiString(&keyname);
if(pUniName) ExFreePool(pUniName);
return Old_NtSetValueKey(KeyHandle,ValueName,TitleIndex,Type,Data,DataSize);
}
NTSTATUS fake_NtDeleteValueKey(IN HANDLEKeyHandle,IN PUNICODE_STRINGValueName)
{
PVOID pKey;
UNICODE_STRING *pUniName;
ULONG actualLen;
ANSI_STRING keyname;
NTSTATUS status;
UNICODE_STRING uStrValueName,OurKey;
if(pKey = GetPointer( KeyHandle))
{
//分配内存
pUniName = ExAllocatePool(NonPagedPool, 1024*2);
pUniName->MaximumLength = 512*2;
//将pUniName里的内容清空
memset(pUniName,0,pUniName->MaximumLength);
//得到注册表项的路径
if(NT_SUCCESS(ObQueryNameString(pKey, pUniName, 512*2, &actualLen)))
{
RtlUnicodeStringToAnsiString(&keyname, pUniName, TRUE);
keyname.Buffer=_strupr(keyname.Buffer); //大写所有字母
//判断是不是Run项
if (strcmp(keyname.Buffer,"\\REGISTRY\\MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN") == 0)
{
RtlInitUnicodeString( &OurKey, L"test" );
if( RtlCompareUnicodeString(ValueName,&OurKey,TRUE)==0 )
{
//释放内存
RtlFreeAnsiString(&keyname);
if(pUniName) ExFreePool(pUniName);
return STATUS_ACCESS_DENIED;
}
}
}
}
RtlFreeAnsiString(&keyname);
if(pUniName) ExFreePool(pUniName);
return Old_NtDeleteValueKey(KeyHandle,ValueName);
}
NTSTATUS fake_NtRestoreKey(IN HANDLE KeyHandle, IN HANDLE FileHandle, IN ULONG RestoreOption)
{
PVOID pKey;
UNICODE_STRING *pUniName;
ULONG actualLen;
ANSI_STRING keyname;
NTSTATUS status;
UNICODE_STRING uStrValueName,OurKey;
if(pKey = GetPointer( KeyHandle))
{
//分配内存
pUniName = ExAllocatePool(NonPagedPool, 1024*2);
pUniName->MaximumLength = 512*2;
//将pUniName里的内容清空
memset(pUniName,0,pUniName->MaximumLength);
//得到注册表项的路径
if(NT_SUCCESS(ObQueryNameString(pKey, pUniName, 512*2, &actualLen)))
{
RtlUnicodeStringToAnsiString(&keyname, pUniName, TRUE);
keyname.Buffer=_strupr(keyname.Buffer); //大写所有字母
//判断是不是Run项
if (strcmp(keyname.Buffer,"\\REGISTRY\\MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN") == 0)
{
//释放内存
RtlFreeAnsiString(&keyname);
if(pUniName) ExFreePool(pUniName);
return STATUS_ACCESS_DENIED;
}
}
}
RtlFreeAnsiString(&keyname);
if(pUniName) ExFreePool(pUniName);
return Old_NtRestoreKey(KeyHandle,FileHandle,RestoreOption);
}
经测试,仅对regedit.exe和某菜鸟ARK的注册表键值修改、删除有效。 沙发不留。
破解方案:
**** Hidden Message ***** 板凳 我来看看破解方案~ 额 这也叫...... 我发现到了周末底层区的人气就特别旺。 看看绕过方案 X菜鸟是谁啊!?呵呵1···回复 2# HoviDelphic 为什么阅读权限是11!??? 回复 8# oopww
只可意会,不可言传。
我发现他还很喜欢玩进程,他的工具的特色就是进程保护和强杀,玩了几年都不厌。
如果我再写ARK,进程部分绝对不是重点。 为什么阅读权限是11!???
oopww 发表于 2010-4-24 22:07 http://www.m5home.com/bbs/images/common/back.gif
额,你不能下吗?多发点帖子嘛!要不,请老马帮你加点分? 某菜鸟ARK。。。。。。
其实是某神牛懒得写HIVE,然后从网上完全COPY了一个
本网站最菜的人 发表于 2010-4-24 20:06 http://www.m5home.com/bbs/images/common/back.gif
在这个世界上,没有“懒得”这一说。 对了,xiaoly99好像放过一个Inline Hook模板,OOPWW你去找找,自己增补一下代码就可以了。 好的回复 13# Tesla.Angela 怎么我权限突然到了20!!
:victory: 那还不好呀?嘿嘿. 非常感谢老马 嘿嘿。。。 我也想下载 这个在驱动里有专门的设置回调的函数吧。。。。我的建议是,有正统的九阴真经时,尽量不要用hook这种邪门功夫,容易走火入魔 结果是把好好的九阴真经练成了九阴白骨爪 记得有人说过,正规方式编程难度要大些,HOOK之类的由于只需要改个指针,相对容易,所以比较多的人当然是使用简单的方案,这毕竟是在写驱动.
不过好象这些简单的方案由于没有按系统的结构去工作,所以貌似有兼容性问题......比如硬编码啥的..... 学习 看破解 不是解析hive? 学习 好东西啊呵呵 我想看看 我要学习学习 参观学习 拿分
Thanks! 感谢楼主的分享精神
页:
[1]