当前位置: 首页 > 编程日记 > 正文

一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现2

上一篇博文中主要介绍了Reactos中大部分函数的思路和HKEY和HANDLE之间的关系,本文将介绍一些Reactos中有意思的函数和存在bug的函数。(转载请指明出处)

CreateNestedKey是一个辅助创建键的函数,比如我们要创建\Regsitry\User\3\2\1,而我们只是存在\Regsitry\User\,我们最终将调用此函数将在User下创建键3,然后在3键下创建键2,最后在2键下创建键1。假如你是这个函数的实现者,你要思考这个函数的实现思路。最容易的办法是将\Regsitry\User\3\2\1路径拆成一系列键名(\Regsitry\User、3、2、1),然后从根键一步一步的调用NtCreateKey,这样就可以保证路径上的所有键都被创建。这个方法的优点是简单。但是Reactos实现的思路却不是这样的。我列一下我改写的该函数。

NTSTATUS OriCreateNestedKey(PHANDLE pKeyHandle,POBJECT_ATTRIBUTES ObjectAttributes,PUNICODE_STRING ClassString,DWORD dwOptions,REGSAM samDesired,DWORD *lpdwDisposition )
{UNICODE_STRING LocalKeyName;NTSTATUS lRes = STATUS_INVALID_PARAMETER;do {if ( NULL == ObjectAttributes || NULL == ObjectAttributes->ObjectName ) {break;}lRes = RtlCreateUnicodeString_( &LocalKeyName, ObjectAttributes->ObjectName->Buffer );CHECKRESULT(lRes);lRes = GETORIFUNC(CreateKey)( pKeyHandle, samDesired,ObjectAttributes, 0, ClassString, dwOptions, (PULONG)lpdwDisposition );if ( STATUS_OBJECT_NAME_NOT_FOUND != lRes ) {return lRes;}OBJECT_ATTRIBUTES LocalObjectAttributes;RtlCopyMemory( &LocalObjectAttributes, ObjectAttributes, sizeof(OBJECT_ATTRIBUTES));LocalObjectAttributes.ObjectName = &LocalKeyName;ULONG FullNameLength = LocalKeyName.Length / sizeof(WCHAR);HANDLE LocalKeyHandle = NULL;PWCHAR Ptr = NULL;ULONG Disposition = 0;// 通过将\\改成结尾符,逐个去掉最后一个键名,查看什么路径的注册表键存在while ( STATUS_OBJECT_NAME_NOT_FOUND == lRes ) {Ptr = wcsrchr(LocalKeyName.Buffer, '\\');if ( NULL == Ptr || Ptr == LocalKeyName.Buffer ) {lRes = STATUS_UNSUCCESSFUL;break;}// 通过将\\改成结尾符,通过长度去掉键名*Ptr = (WCHAR)0;LocalKeyName.Length = wcslen(LocalKeyName.Buffer) * sizeof(WCHAR);lRes = GETORIFUNC(CreateKey)( &LocalKeyHandle, KEY_CREATE_SUB_KEY,&LocalObjectAttributes, 0, NULL, 0, &Disposition );}CHECKRESULT(lRes);// 通过将结尾符改成\\,重新拼接上键名,逐个创建键ULONG Length = wcslen(LocalKeyName.Buffer);while ( TRUE ) {if ( NULL != LocalKeyHandle ) {GETORIFUNC(Close) (LocalKeyHandle);}// 通过将结尾符改成\\,重新拼接上键名LocalKeyName.Buffer[Length] = L'\\';Length = wcslen (LocalKeyName.Buffer);LocalKeyName.Length = Length * sizeof(WCHAR);if ( Length == FullNameLength ) {// 如果已经拼接回以前的键名了,则执行完后就退出lRes = GETORIFUNC(CreateKey)( pKeyHandle, samDesired,ObjectAttributes, 0, ClassString, dwOptions, (PULONG)lpdwDisposition);break;}// 创建祖宗键lRes = GETORIFUNC(CreateKey)( &LocalKeyHandle, KEY_CREATE_SUB_KEY,&LocalObjectAttributes, 0, NULL, 0, &Disposition);if ( NT_FAILED(lRes) ) {break;}}} while (0);RtlFreeUnicodeString_(&LocalKeyName);return lRes;
}

大致说下这个函数的流程:

  1. 使用NtCreateKey函数调用传入的参数。如果不是返回STATUS_OBJECT_NAME_NOT_FOUND,则说明要创建的路径上的键的父键是存在的,直接返回创建的结果;否则说明父键就不存在,得依赖之后的步骤将父键创建起来。
  2. 声明个变量OBJECT_ATTRIBUTES LocalObjectAttributes;将作为参数传入的ObjectAttributes全部拷贝到LocalObjectAttributes,同时记录下路径的长度FullNameLength。
  3. 将LocalObjectAttributes.LocalKeyName中的记录路径的Buffer字段,从后向前寻找“\”符号,找到一个,就将其改为空,同时再计算LocalObjectAttributes中LocalKeyName的长度。得到修改后的LocalObjectAttributes后,再调用NtCreateKey。以上面的例子为例,就是用NtCreateKey创建\Regsitry\User\3\2。查看返回结果,如果结果还是STATUS_OBJECT_NAME_NOT_FOUND,说明父键还是不存在的,于是要重复3的步骤,一直到NtCreateKey执行成功。如例子中,一直到用NtCreateKey创建\Regsitry\User\3就停止这个循环,因为3键可以创建成功。
  4. 比较LocalObjectAttributes.LocalKeyName的长度和FullNameLength,如果相等,则说明我们应该创建的键都创建完了。如果不等,则我们将LocalObjectAttributes.LocalKeyName的最前一个空改成“\”,得到修改后的LocalObjectAttributes,再调用NtCreateKey。在我们的例子中,就是创建\Regsitry\User\3\2。一直重复4,一直到LocalObjectAttributes.LocalKeyName的长度和FullNameLength相等。

我很欣赏这样的思路,通过改改内存达到目的,效率方面会好很多。

相关文章:

云计算安全解决方案白皮书(一)

云计算安全解决方案白皮书Jack zhai研究云的安全有两三年了,但形成完整的安全思路,还是去年的事,这也是“流安全”思路形成的主要阶段。云计算的安全问题之所以突出,是因为虚拟机的动态迁移,以及多业务系统交织在一起&…

一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现3

这篇我们看一个”容错“”节省“的实例。一下是一个Win32API的声明(转载请指明出处) LONG WINAPI RegEnumKeyEx(__in HKEY hKey,__in DWORD dwIndex,__out LPTSTR lpName,__inout LPDWORD lpcName,__reserved LPDWORD lp…

腾讯Angel升级:加入图算法,支持十亿节点、千亿边规模!中国首个毕业于Linux AI基金会的开源项目...

出品 | AI科技大本营(ID:rgznai100)【导语】Angel 是腾讯的首个AI开源项目,于 2016 年底推出、2017年开源。近日,快速发展的 Angel 完成了从 2.0 版本到 3.0 版本的跨越,从一个单纯的模型训练系统进化成包…

如何在JSP页面中获取当前系统时间转

出自:http://hi.baidu.com/itfuck_/item/803662469cdf7baa61d7b945 1: import java.util.*; int y,m,d,h,mm; Calendar c Calendar.getInstance(); y c.get(Calendar.YEAR); //年 m c.get(Calendar.MONTH) 1; //月 d c.get(Calendar.DAY_OF_MONTH); //日 …

如何用Python实现超级玛丽的界面和状态机?

作者 | marble_xu编辑 | 郭芮来源 | CSDN博客小时候的经典游戏,代码参考了github上的项目Mario-Level-1(https://github.com/justinmeister/Mario-Level-1),使用pygame来实现,从中学习到了横版过关游戏实现中的一些处理…

一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现4

今天为了KPI,搞了一天的PPT,搞得恶心想吐。最后还是回到这儿,这儿才是我的净土,可以写写我的研究。 这儿讲一些Reactos中一些明显的错误。(转载请指明出处) 在Reactos的RegQueryInfoKeyW中有段这样的实现 i…

Netscaler 认证,访问报http 5000 内部错误

在VDI项目中,Netscaler经常与AD不在同一网络,有时在icaprofile中写的SF或WI的FQDN,访问VDI,会报http 5000 内部错误;解决办法如下:1.NS无法解析Storefont或WI的主机名,需要修改icaprofile 中SF或…

解读 | 2019年10篇计算机视觉精选论文(中)

导读:2019 年转眼已经接近尾声,我们看到,这一年计算机视觉(CV)领域又诞生了大量出色的论文,提出了许多新颖的架构和方法,进一步提高了视觉系统的感知和生成能力。因此,我们精选了 20…

PE文件和COFF文件格式分析--概述

刚工作的时候,我听说某某大牛在做病毒分析时,只是用notepad打开病毒文件,就能大致猜到病毒的工作原理。当时我是佩服的很啊,同时我也在心中埋下了一个种子:我也得有这天。随着后来的工作进行,一些任务的和这…

2015第22周六Java反射、泛型、容器简介

Java的反射非常强大,传递class, 可以动态的生成该类、取得这个类的所有信息,包括里面的属性、方法以及构造函数等,甚至可以取得其父类或父接口里面的内容。 obj.getClass().getDeclaredMethods();//取得obj类中自己定义的方法&…

中服公司企业信息化的ERP系统选择

中服公司企业信息化的ERP系统选择一、 中服公司概况 1. 组织概况 中服公司创建于1950年9月,是国家120家企业集团试点单位之一,主要经营各类纺织原料、半成品、服装、针棉毛织品以及其他商品的进出口业务,同时通过合资、联营等方…

PE文件和COFF文件格式分析--MS-DOS 2.0兼容Exe文件段

MS 2.0节是PE文件格式中第一个“节”。其大致结构如下:(转载请指明来源于breaksoftware的csdn博客) 在VC\PlatformSDK\Include\WinNT.h文件中有对MS-DOS 2.0兼容EXE文件头的完整定义 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE h…

时间可以是二维的?基于二维时间图的视频内容片段检测 | AAAI 2020

作者 | 彭厚文、傅建龙来源 | 微软研究院AI头条(ID: MSRAsia)编者按:当时间从一维走向二维,时序信息处理问题中一种全新的建模思路由此产生。根据这种新思路及其产生的二维时间图概念,微软亚洲研究院提出一种新的解决时…

《燃烧的岁月》

温含着优美的文句中,字里行间,透过一层薄薄的纸,牵挂起往事如烟,曾经的努力和成长,透过那以视频同时走过的路,默默无闻,牵挂着的是一句句唯美的文笔,留下情感的诗句文笔,…

PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1

本文将讨论PE文件中非常重要的一部分信息。(转载请指明来源于breakSoftware的CSDN博客) 首先说一下VC中对应的数据结构。“签名、COFF文件头和可选文件头”这三部分信息组合在一起是一个叫IMAGE_NT_HEADERS的结构体。 typedef struct _IMAGE_NT_HEADERS6…

遇到bug心寒了?用Enter键即可解决!

本文图片来自网络做程序员难不难?很难!做个程序员压力大不大?超级大!!测试bug时(图片来自网络)当找到Bug,开始修改的你……(图片来自网络)那怎么办&#xff1…

8月第1周安全回顾 0Day漏洞成企业最大威胁 应重视网络监听

文章同时发表在:[url]http://netsecurity.51cto.com/art/200708/52822.htm[/url]本周(0730至0805)安全方面值得关注的新闻集中在安全管理、安全威胁和安全产品方面。安全管理:0Day漏洞***成为企业信息安全的最大威胁新闻&#xff…

最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)

在讲述这两个算法之前,首先有几个概念需要明白: 二分图: 二分图又称二部图,是图论中的一种特殊模型。设G(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个…

一种在注入进程中使用WTL创建无焦点不在任务栏出现“吸附”窗口的方法和思路

最近一直在做沙箱项目,在项目快接近结尾的时候,我想给在我们沙箱中运行的程序界面打上一个标记——标识其在我们沙箱中运行的。我大致想法是:在被注入程序的顶层窗口上方显示一个“标题性”窗口,顶层窗口外框外显示一个“异形”的…

转:ASP.NET状态保存方法

ASP.NET状态保存分为客户端保存和服务器端保存两种:使用客户端选项存储页信息而不使用服务器资源的这些选项往往具有最低的安全性但具有最快 的服务器性能,因为对服务器资源的要求是适度的。但是,由于必须将信息发送到客户端来进行存储&#…

时至今日,NLP怎么还这么难!

作者 | 刘知远在微博和知乎上关注自然语言处理(NLP)技术的朋友,应该都对#NLP太难了#、#自然语言理解太难了#两个话题标签不陌生,其下汇集了各种不仅难煞计算机、甚至让人也发懵的费解句子或歧义引起的笑话。然而,这些例…

Quartz定时任务学习(四)调度器

org.quartz.Scheduler 类层次 作为一个 Quartz 用户,你要与实现了 org.quartz.Scheduler 接口的类交互。在你调用它的任何 API 之前,你需要知道如何创建一个 Scheduler 的实例。取而代之的是用了某个工厂方法来确保了构造出 Sheduler 实例并正确的得到初…

反汇编算法介绍和应用——线性扫描算法分析

做过逆向的朋友应该会很熟悉IDA和Windbg这类的软件。IDA的强项在于静态反汇编,Windbg的强项在于动态调试。往往将这两款软件结合使用会达到事半功倍的效果。可能经常玩这个的朋友会发现IDA反汇编的代码准确度要高于Windbg,深究其原因,是因为I…

项目计划书的内容

1.引言 1.1计划的目的 1.2项目的范围和目标 1.2.1范围描述 1.2.2主要功能 1.2.3性能 1.2.4管理和技术约束 2.项目估算 2.1使用的历史数据 2.2使用的评估技术 2.3工作量、成本、时间估算 3.风险管理战略 3.1风险识别 3.2有关风险的讨论 3.3风险管理计划 3.3.1风险计划 3.3.2风险…

不用写代码就能学用Pandas,适合新老程序员的神器Bamboolib

作者 | Rahul Agarwal译者 | 陆离编辑 | Jane出品 | AI科技大本营(ID:rgznai100)曾经,你有没有因为学习与使用 Pandas 进行数据检索等操作而感到厌烦过?实现同样的功能,Pandas 给用户提供了很多种方法&…

后海日记(8)

来深圳已经这么长时间了,深圳给我的感觉总体很好,天那么蓝,空气也很清新,总的来说很不错。 努力学习,早日成才。 加油!版权声明:本文为博主原创文章,未经博主允许不得转载。 转载于:…

反汇编算法介绍和应用——递归下降算法分析

上一篇博文我介绍了Windbg使用的线性扫描(linear sweep)反汇编算法。本文我将介绍IDA使用的递归下降(recursive descent)反汇编算法。(转载请指明来源于breaksoftware的csdn博客) 递归(recursiv…

如何快速get到AI工程师面试重点,这12道题必备!

作者 | JP Tech译者 | 刘畅编辑 | Jane出品 | AI科技大本营(ID:rgznai100)【导读】2020 年的三月春招要来了,现在想要 Get 一个算法工程师的实习或全职机会,已经不是一件易事了。如果现在着手复习,茫茫题海…

金邦黑金刚4G内存 VS Vista系统

我的机器配置是 Intel Core 2 4320CPU 金邦黑金刚2G DDR2 800*2 P965P-DS3主板 N 8600GTS 为什么在Vista中 只识别了3.5G 我升级了主版BIOS 主版最高支持8G,哎结果网上一看,才明白。。。现在的系统不是很好的支持4G的内存。…

程序员的量化交易之路(25)--Cointrader之MarketData市场数据实体(12)

转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrade.top/ 前面一节我们说到了远端事件。其中,市场数据就属于远端事件。市场数据有什么?我们通过代码来回答这个问题: package org.cryptocoinpartners.…