tiechui_lesson06_注册表操作

news2024/11/21 2:28:20

这节课主要学习注册表的相关操作,包括注册表的打开,读取,修改,删除。可以自己通过底层API手动来获取和设置注册表,也可以用微软提供的运行时函数。我的看法是底层函数用来了解原理,真正在代码中使用的时候还是会优先使用微软封装好的Rtl运行时函数。

而且通过这节课也让我对注册表有了一些认识,注册表就像是一种可视化的数据结构,存放一些程序需要或者系统需要的一些数值,是一些键值对的集合。

一、课程代码

封装了一个函数RegistryCopy,来实验课程代码,不用上来就复制整个文件代码了。

涉及API:

  • ZwCreateKey
  • ZwOpenKey (简化版 ZwCreateKey)
  • ZwQueryValueKey
  • ZwSetValueKey
  • ZwDeleteKey
  • RtlWriteRegistryValue
  • RtlCheckRegistryKey
  • RtlCreateRegistryKey
//注册表操作
VOID RegistryCopy(IN PDRIVER_OBJECT DriverObject,
	IN PUNICODE_STRING RegistryPath)
{
	UNREFERENCED_PARAMETER(DriverObject);
	NTSTATUS status = STATUS_SUCCESS;
	HANDLE keyhandle = NULL;
	OBJECT_ATTRIBUTES obja = { 0 };
	ULONG keyop = 0;
	PVOID keyinfo = NULL;	// 存放注册表
	InitializeObjectAttributes(&obja, RegistryPath,
		OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
		NULL,
		NULL);
	
	DbgPrint("驱动注册表路径:%wZ\n", RegistryPath);

	//
	//打开注册表  ZwCreateKey 如果确定注册表存在可以使用ZwOpenKey(只用前三个参数)
	//
	status = ZwCreateKey(
		&keyhandle, 
		KEY_ALL_ACCESS, 
		&obja,
		0, 
		NULL, 
		REG_OPTION_NON_VOLATILE, 
		&keyop);
	if (NT_SUCCESS(status))
	{
		if (keyop == REG_CREATED_NEW_KEY)
		{
			DbgPrint("Key has be Created \n");
		}
		else if (keyop == REG_OPENED_EXISTING_KEY)
		{
			DbgPrint("Key has be Opened \n");
		}
		else {
			DbgPrint("Error\n");
		}
	}

	//
	//读取注册表
	//
	keyinfo = ExAllocatePoolWithTag(NonPagedPool, 0x1000, '1213');
	if (!keyinfo)
	{
		return ;
	}
	RtlZeroMemory(keyinfo, 0x1000);

	UNICODE_STRING keyname = RTL_CONSTANT_STRING(L"ImagePath");

	status = ZwQueryValueKey(keyhandle, &keyname,
		KeyValuePartialInformation, keyinfo, 0x1000,&keyop);
	if (!NT_SUCCESS(status))
	{
		ZwClose(keyhandle);
		ExFreePoolWithTag(keyinfo, '1213');
		return;
	}

	PKEY_VALUE_PARTIAL_INFORMATION tempinfo = (PKEY_VALUE_PARTIAL_INFORMATION)keyinfo;

	PWCHAR imagepath = (PWCHAR)(tempinfo->Data);

	DbgPrint("ImagePath is %ws\n", imagepath);

	//C:\Windows\System32\drivers

	//拷贝驱动文件
	KernelCopyFile(L"\\??\\C:\\Windows\\System32\\drivers\\asdioss.sys",
		imagepath);

	//
	//修改注册表路径
	//
	PWCHAR rootpath = L"\\SystemRoot\\system32\\dirvers\\asdioss.sys";
	status = ZwSetValueKey(keyhandle, &keyname, 0,
		REG_EXPAND_SZ, rootpath, (ULONG)(wcslen(rootpath) * 2 + 2));
	if (!NT_SUCCESS(status))
	{
		DbgPrint("Error code %x\n", status);
	}


	//释放缓冲区
	ExFreePoolWithTag(keyinfo, '1213');
	//别忘记关闭句柄
	ZwClose(keyhandle);


	//
	//	使用另外一种方式写入注册表 
	//	微软运行时函数RtlWriteRegistryValue 封装好很多。
	//
	ULONG tempstartlevel = 1;
	RtlWriteRegistryValue(
		RTL_REGISTRY_ABSOLUTE,
		RegistryPath->Buffer,
		L"Start",
		REG_DWORD,
		&tempstartlevel,	//启动 级别
		4);

	//
	//	注册表删除
	//
	//ZwDeleteKey(keyhandle);//只能删除没有子健的注册表

	//
	//运行时函数 RtlCheckRegistryKey 
	//
	status = RtlCheckRegistryKey(RTL_REGISTRY_SERVICES,L"123456");//检测某个注册表是否存在
	if (NT_SUCCESS(status))
	{
		DbgPrint("Be Founed");
	}
	else {
		DbgPrint("Not Founed");
		RtlCreateRegistryKey(RTL_REGISTRY_SERVICES, L"123456");
	}


}

在DriverEntry中:

//入口函数
NTSTATUS DriverEntry(
	IN PDRIVER_OBJECT DriverObject, 
	IN PUNICODE_STRING RegistryPath
)
{
	UNREFERENCED_PARAMETER(RegistryPath);
	
    ······

	//KernelCopyFile(L"\\??\\C:\\888.exe", L"\\??\\C:\\567.exe");
	RegistryCopy(DriverObject, RegistryPath);

	return 0;
}

 

 二、运行效果

创建的注册表:

小结

感觉打基础是相当枯燥的事情,不想继续敲了!😣😣😣

不过拓展知识边界的感觉也还不错,就是“这个能有什么用”的小声音再困扰自己,先坚持敲完吧!

这节还是需要注意句柄的打开和关闭,缓冲区的申请和释放。还有驱动服务注册表的Start字段是代表着驱动服务的启动级别(1、2、3、4),正常是3,如果是4的话代表禁止启动,如果是1的话那代表开机自启,不过这个有条件限制需要注意!

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/501968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《三十岁,一切刚刚开始》读书笔记

目录 书籍简介 经典语句 书籍简介 在抖音上看到此书,顺便看了看。 《三十岁,一切刚刚开始》作者李尚龙。写给敢于探险、敢于突破自己的年轻人的进取之书。人这一生可以有无数种可能。 如果你近期特别丧,或者正处于瓶颈期间,不…

VLAN【实验】

虚拟局域网VLAN VLAN即虚拟局域网,是将一个物理的局域网在逻辑上划分成为多个广播域的技术。通过在交换机上配置VLAN,可以实现在同一个VLAN内的用户进行二层互访,而不通的VLAN间的用户被二层隔离。这样既能够隔离广播域,又能够提…

身临其境文化之旅——VR全景图片畅游世界各地文化景点

文化旅游是一种独特的旅游体验,它不仅让人们感受到异域文化的魅力,更能增进对世界的了解和认知。VR全景图片和文化旅游之间有着密不可分的关系。作为一种数字化技术,VR全景图片可以为文化旅游提供更加深入、真实、立体的体验。随着VR技术的发…

品牌宣传软文发布,多久一次合适?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 品牌宣传有许多手段,线下活动,电视广告,讲座,招商等手段,其中软文发布是性价比较高的一种方式,那么软文宣传多久一…

神奇,声网Web SDK还能这么实现直播中美颜功能

前言 本篇文章是通过使用声网Web SDK来实现直播中美颜效果的深度体验文章,其中发现了屏幕共享并本地合图多个视频、图片,声网美颜插件等功能特性十分强大和专业,特为此做一个技术体验的分享,毕竟好技术就是要去传播的。 随着音视…

深入了解Facebook广告工具和资源,优化你的营销活动

作为企业主或营销人员,利用Facebook的广告工具和资源,可以帮助你更好地推广品牌、吸引潜在客户,并提升销售业绩。在本文中,我们将深入了解Facebook的广告工具和资源,帮助你优化营销活动,实现更好的效果。 1…

Ubuntu多卡服务器、普通用户安装paddlepaddle环境

Ubuntu多卡服务器、普通用户安装paddlepaddle环境 1. 建立conda虚拟环境2. 安装paddlepaddle gpu版本2.1 选择cuda版本2.2 安装paddle 3. 验证及排错3.1 验证方法3.2 第一次报错:cuda问题3.3 第二次报错:NCCL问题(多卡) 4. 设置环…

echarts 地图_地图 json 免费下载_自定义icon

Echarts 常用各类图表模板配置 注意: 这里主要就是基于各类图表,更多的使用 Echarts 的各类配置项; 以下代码都可以复制到 Echarts 官网,直接预览; 图标模板目录 Echarts 常用各类图表模板配置一、地图二、环形图三、…

Microsoft Edge浏览器崩溃,错误代码: STATUS_STACK_BUFFER_OVERRUN

--------------------8日15:34更新------------------- 8号下午经历了短暂的兴奋,突然就好了,但是转瞬即逝,试用一会后就不行了。 目前使用beta版本是很稳定的。 最新版的beta也可以,注意数据同步。 --------------------原文-…

ChatGPT的Prompts关键词提示工程集合:包含AI绘画和GPT文本对话

文章目录 1 前言2 Awesome ChatGPT Prompts2.1 文本提示词2.2 提示词汇总2.3 绘画提示词 3 PromptBase4 Prompt-Engineering-Guide5 讨论 1 前言 明确一个概念,ChatGPT是一种大型的自然语言处理模型,它基于深度神经网络和语言模型技术,可以通…

c++中vector初始化的一个有趣的细节问题

vector的初始化&#xff0c;相信会写c的人都很熟悉&#xff0c;c11对此也改进了很多&#xff0c;更方便。 以下是使用vector初始化的几个例子&#xff1a; 从数组初始化vector&#xff1a; int arr[] {1, 2, 3, 4, 5}; vector<int> vec(arr, arr sizeof(arr) / size…

定时清理文件脚本

一、定时清理文件 编写一个bat脚本。新建一个文本文档&#xff08;txt文件&#xff09;&#xff0c;在里面输入echo offdel /f /s /q E:\temp\*.*&#xff0c;E代表E盘&#xff0c;temp是E盘下的需要清理的文件夹&#xff0c;运行脚本后&#xff0c;就是清理E:\temp文件夹下的…

Win下查看端口占用情况并释放该端口

开发中&#xff0c;经常会遇到端口意外被占用&#xff0c;需释放该端口的问题。一般解决思路是找到被占用端口关联的进程号&#xff0c;即PID&#xff0c;后通过PID终止该进程以释放该端口。 netstat 命令 显示协议统计信息和当前 TCP/IP网络连接,常用参数: -a: 显示所有连接和…

Packet Tracer - 配置基于区域的策略防火墙 (ZPF)

Packet Tracer - 配置基于区域的策略防火墙 (ZPF) 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 交换机端口 R1 G0/1 192.168.1.1 255.255.255.0 不适用 S1 F0/5 S0/0/0 (DCE) 10.1.1.1 255.255.255.252 不适用 不适用 R2 S0/0/0 10.1.1.2 255…

项目管理工具的必备功能,你需要知道这些

一个项目有很多事情需要计划、控制和管理&#xff0c;因此需要使用项目管理软件来对项目进行管理&#xff0c;除了制定计划、进度跟踪等之外&#xff0c;项目管理软件还应该有这些功能&#xff1a; 甘特图&#xff1a;帮你规划任务。比如说甘特图就可以设置多级任务、耗时和分…

AI与全民开发:挑战和机会并存

注&#xff1a;全民开发的英文是Citizen Development&#xff0c;由咨询公司Gartner在2010年提出的概念&#xff0c;指非专业开发人员使用低代码或无代码平台创建应用程序&#xff0c;无需IT部门的支持&#xff0c;旨在提高生产力并降低开发成本。 国内普遍将Citizen Developme…

dubbo服务导出源码解析

服务导出流程 需要对源码debug&#xff0c;可以参考官网的源码分析进行debug&#xff1a;https://cn.dubbo.apache.org/zh-cn/docsv2.7/dev/source/export-service/接收到 ContextRefreshedEvent 刷新事件&#xff0c;调用 ServiceBean.export()&#xff0c;会执行 ServiceCon…

刷力扣 LeetCode 算法题需要充值会员吗?

一、刷题成就 大家好&#xff0c;我是『负雪明烛』。 在过去的这些年里&#xff0c;我的一项业余爱好就是写作算法题解。如今写了上千篇题解了&#xff01; 在 CSDN 上&#xff0c;我的博客获得了 200 多万的阅读。 在力扣中国题解区&#xff0c;我也获得了180 万的阅读。…

我忽然发现周围同事都在无效内卷

想写这篇文章已经很久了&#xff0c;在三月份的时候就想写这篇文章了。 可三月份那时候需求比较多&#xff0c;每天下班时间基本都在九点多了&#xff0c;回到家就想躺着&#xff0c;压根不想写&#xff1b;四月份则是2022年度绩效评比沟通&#xff0c;一月时间又没了&#xff…

一个月内面了30家公司,薪资从18K变成28K,真行啊····

工作3年&#xff0c;换了好几份工作&#xff08;行业流行性大&#xff09;&#xff0c;每次工作都是裸辞。朋友都觉得不可思议。因为我一直对自己很有信心&#xff0c;而且特别不喜欢请假面试&#xff0c;对自己负责也对公司负责。 但是这次没想到市场环境非常不好&#xff0c;…