HoviDelphic 发表于 2010-4-23 20:14:37

[半原创]发个注册表保护的源码 - 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的注册表键值修改、删除有效。

HoviDelphic 发表于 2010-4-23 20:16:26

沙发不留。
破解方案:
**** Hidden Message *****

xiaoly99 发表于 2010-4-23 20:20:59

板凳 我来看看破解方案~

xiaoly99 发表于 2010-4-23 20:21:26

额 这也叫......

HoviDelphic 发表于 2010-4-23 22:50:28

我发现到了周末底层区的人气就特别旺。

everyone 发表于 2010-4-24 18:34:43

看看绕过方案

本网站最菜的人 发表于 2010-4-24 20:06:18

oopww 发表于 2010-4-24 22:05:51

X菜鸟是谁啊!?呵呵1···回复 2# HoviDelphic

oopww 发表于 2010-4-24 22:07:32

为什么阅读权限是11!???

Tesla.Angela 发表于 2010-4-25 10:47:02

回复 8# oopww


只可意会,不可言传。
我发现他还很喜欢玩进程,他的工具的特色就是进程保护和强杀,玩了几年都不厌。
如果我再写ARK,进程部分绝对不是重点。

Tesla.Angela 发表于 2010-4-25 10:48:09

为什么阅读权限是11!???
oopww 发表于 2010-4-24 22:07 http://www.m5home.com/bbs/images/common/back.gif

额,你不能下吗?多发点帖子嘛!要不,请老马帮你加点分?

Tesla.Angela 发表于 2010-4-25 10:51:04

某菜鸟ARK。。。。。。
其实是某神牛懒得写HIVE,然后从网上完全COPY了一个
本网站最菜的人 发表于 2010-4-24 20:06 http://www.m5home.com/bbs/images/common/back.gif


    在这个世界上,没有“懒得”这一说。

Tesla.Angela 发表于 2010-4-25 10:52:12

对了,xiaoly99好像放过一个Inline Hook模板,OOPWW你去找找,自己增补一下代码就可以了。

oopww 发表于 2010-4-25 12:44:46

好的回复 13# Tesla.Angela

oopww 发表于 2010-4-25 12:45:31

怎么我权限突然到了20!!
   :victory:

马大哈 发表于 2010-4-25 19:26:31

那还不好呀?嘿嘿.

oopww 发表于 2010-4-26 13:20:55

非常感谢老马 嘿嘿。。。

乔丹二世 发表于 2010-4-27 19:29:14

我也想下载

本网站最菜的人 发表于 2010-5-29 22:24:28

364589886 发表于 2010-6-27 11:51:33

这个在驱动里有专门的设置回调的函数吧。。。。我的建议是,有正统的九阴真经时,尽量不要用hook这种邪门功夫,容易走火入魔

364589886 发表于 2010-6-27 11:52:48

结果是把好好的九阴真经练成了九阴白骨爪

马大哈 发表于 2010-6-27 12:07:37

记得有人说过,正规方式编程难度要大些,HOOK之类的由于只需要改个指针,相对容易,所以比较多的人当然是使用简单的方案,这毕竟是在写驱动.

不过好象这些简单的方案由于没有按系统的结构去工作,所以貌似有兼容性问题......比如硬编码啥的.....

reaten 发表于 2010-7-10 21:23:27

学习

xbs2008 发表于 2010-7-12 00:19:04

看破解

pe1011 发表于 2010-7-23 21:31:27

不是解析hive?

ghostlanse 发表于 2010-9-29 09:10:00

学习

zhudejun007 发表于 2011-10-11 13:16:31

好东西啊呵呵

zhudejun007 发表于 2011-10-11 13:16:48

我想看看

zhudejun007 发表于 2011-10-11 13:17:11

我要学习学习

xueyao_zhjyl 发表于 2011-11-16 16:00:23

参观学习 拿分

dagangwood 发表于 2015-5-22 00:51:52

Thanks!

upring 发表于 2015-5-22 11:56:23

感谢楼主的分享精神
页: [1]
查看完整版本: [半原创]发个注册表保护的源码 - TaRegProtectDemo