首页
社区
课程
招聘
[原创]NSudo 恶魔模式 - 一个面向希望无视文件和注册表访问检查的开发者的解决方案
发表于: 2020-1-21 23:18 24396

[原创]NSudo 恶魔模式 - 一个面向希望无视文件和注册表访问检查的开发者的解决方案

2020-1-21 23:18
24396

由于在吾爱论坛发布了同样的帖子,并没有得到什么回复,更别提有价值的回复。向朋友吐槽后,他们建议我在看雪论坛发这个帖子。

昨天注册了看雪论坛的账号后,貌似要获取 1k 雪币购买了邀请码才能升级为正式会员,自己为此头痛了一会儿,但由于运气足够好,五次幸运大转盘,一下子赚了 3k 雪币,购买了邀请码。

当然,由于新账号 24 小时不能发帖的限制,让我硬生生地等待了 24 个小时……

NSudo 恶魔模式 (NSudo Devil Mode) 是为想无视文件和注册表操作权限检查的开发者量身定做的一个用起来还算优雅的解决方案。

其原理是使用开源的 Microsoft Detours 库对 Windows NT 内核的文件和注册表相关的系统调用进行 Inline Hook 以传入选项让开发者基本不用修改自己的实现也能充分的利用管理员权限所提供的特权,这也使得开发者只需要把 NSudo 恶魔模式的动态链接库加载入自己的以管理员身份运行的应用进程的地址空间内即可启用 NSudo 恶魔模式。

由于 NSudo 恶魔模式可以在大部分情况下替代类似 NSudo 的工具,于是 NSudo 未来的功能会变得更加专业向。毕竟作为 NSudo 的作者的我可不希望 NSudo 就这么轻易地被替代掉。

当然,由于 NSudo 恶魔模式属于 Dism++ 春哥附体的后续版本 (毕竟我也是 Dism++ 的其中一位开发者,这么说还是有依据的),于是未来 Dism++ 的春哥附体的实现会被替换成 NSudo 恶魔模式以帮助我更好的重构 Dism++ 的实现。当然,NSudo 也会支持以恶魔模式运行应用。

正如上文所说,NSudo 恶魔模式属于 Dism++ 春哥附体的后续版本,而且你也能在本文中了解 NSudo 恶魔模式和 Dism++ 春哥附体的区别。

命名为 NSudo 恶魔模式的灵感来源是《入间同学入魔了》的被蛋爷改造过的拥有四个档位的入间手中的“恶食戒指”。

最开始听到 MSMG Toolkit 的作者希望我能提供 NSudo 的 SDK 方便他进行二次开发的时候,我试着做了基于 COM 接口的 NSudo Shared Library 即 NSudoAPI,但是由于 NSudoAPI 暴露的细节太多,如果不是对 Windows 安全特性足够了解的开发者是很难驾驭的。于是我觉得得换个方向,于是就做了 NSudo 恶魔模式。

调用 LoadLibrary 加载 NSudo 恶魔模式的动态链接库以启用 NSudo 恶魔模式,调用 FreeLibrary 释放 NSudo 恶魔模式的动态链接库的 HMODULE 句柄即可禁用 NSudo 恶魔模式。

当然,你的应用需要在管理员权限下运行,相对于原本要求 SYSTEM 和 TrustedInstaller 权限的情况下其实好了不少。

注:如果你有本事把 NSudo 恶魔模式远程注入到以管理员或者更高权限的进程内(譬如 7-Zip),也能为该进程赋能(无视文件和注册表的权限)。

下面提供一个使用 C# 编写的测试用例。(遍历 C:\System Volume Information 目录的内容,当启用 NSudo 恶魔模式的情况下可以正常显示,禁用后会抛出文件夹拒绝访问的异常。)


未启用 NSudo 恶魔模式


已启用 NSudo 恶魔模式

system.file.rename("C:/Windows/notepad.exe", "C:/Windows/ice1000.exe")


未启用 NSudo 恶魔模式


已启用 NSudo 恶魔模式(由于朋友的项目是开源的,于是我直接在项目里面调用了下 LoadLibrary)


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-3-21 17:03 被Mouri_Naruto编辑 ,原因: NSudo 8.0 已经发布,遂更新链接
收藏
免费 5
支持
分享
最新回复 (20)
雪    币: 6124
活跃值: (4666)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
支持一下毛利
2020-1-21 23:32
0
雪    币: 7
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
毛利棒棒哒,NSudo是神器
最后于 2020-1-21 23:33 被星之陨编辑 ,原因:
2020-1-21 23:33
0
雪    币: 185
活跃值: (70)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
毛利大佬厉害
2020-1-21 23:48
0
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
5
支持一个
2020-1-22 00:18
0
雪    币: 4491
活跃值: (2484)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
支持一下毛利
2020-1-22 08:07
0
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
7
支持。之前刚好想删一个注册表项,用admin权限删不了。得用system权限。最后还是用的explorer命令行调用bat文件才删了的
2020-1-23 10:30
0
雪    币: 4737
活跃值: (4684)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习学习啦
2020-1-26 22:35
0
雪    币: 2882
活跃值: (1279)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yjd
9
正需要这个,有个注册表修复win8.1不能改名的问题。搜了很多国内外都没找到注册表相关,RO又没有单独这方面,或者类似xuetr的单独功能。有机会试试
2020-1-27 05:54
0
雪    币: 407
活跃值: (1816)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
关键是SeBackupPrivilege这个?
2020-1-28 20:59
0
雪    币: 2015
活跃值: (232)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
Thead 关键是SeBackupPrivilege这个?
启用 SeBackupPrivilege 和 SeRestorePrivilege 是前提条件,但是你也需要在创建文件或注册表句柄的时候传入对应的选项,否则是不生效的。

首先说明一点,那就是 Windows 内核当发现调用者上下文为 SYSTEM 令牌的时候,据 Microsoft 文档描述是为了提升 Windows 的性能会自动忽略掉大部分访问检查,毕竟很多 Windows 系统关键组件运行在 SYSTEM 令牌上下文下面,对于 Windows 用户模式而言,SYSTEM 令牌是至高无上的,所以访问检查没必要做,做了也提升不了安全性反而降低效率。所以这也是为什么除了 SYSTEM 令牌上下文外的其他令牌都需要启用相关特权 + 创建文件和注册表句柄的 API 传入对应选项才能忽略掉相关访问检查。

我用一个最简单的例子来说明减少不需要的内核级访问检查的好处,那就是在 Windows AppContainer 下运行的代码,由于会多出一个额外的内核级访问检查(用 IDA 分析 ntoskrnl.exe,然后用 F5 查看相关函数可以发现,其实就是多出了一个分支和寥寥数行实现),大概会比在 AppContainer 外运行会损失 15% 的性能 (这也可以说明越底层的实现越需要重视性能问题)。Windows AppContainer 是 Windows 8 开始提供的用户模式沙盒,主要用在商店应用和浏览器的沙盒上面。

Windows 的大部分内部使用了创建文件和注册表句柄的 API 并没有传入对应的选项,于是就出现了普通管理员下即使开启了这两个特权有些目录照样还是无法进行增删查改。而 NSudo 恶魔模式通过 Inline Hook 对 Windows 用户模式的系统调用层进行挂钩以智能传入相关选项,这也是 NSudo 恶魔模式能在非 SYSTEM 的但拥有这两个特权的令牌上下文下绕过文件和注册表访问判断的缘由。

Windows 用户模式系统调用层指的是 ntdll.dll 导出的前缀为 Nt 或 Zw 的 API,Windows 用户模式下的 API 最终全会调用这部分以通过软中断陷阱门或者系统调用指令进入内核模式完成最终操作。

智能,指的是只有当前进程令牌上下文能够启用  SeBackupPrivilege 和 SeRestorePrivilege 的时候,才会传入对应选项。毕竟如果这两个特权没有开启的话,传入了相关选项是会返回错误的,这也是为什么 Windows 相关实现并没有传入的原因。

当然 NSudo 恶魔模式为了对调用者更加透明和符合最小权限原则,在初始化的时候首先会创建一份当前进程令牌的模拟令牌副本,然后对该副本开启这两个特权。在 Hook 中,会先备份当前线程上下文的令牌,接着替换成模拟令牌副本(或者用 Microsoft 文档的称法是模拟令牌上下文),传入相关选项调用原 API 后再恢复为原来线程上下文的令牌。(实现细节请参考在 NSudo 代码仓库的 NSudo 恶魔模式的源代码)

我说的有些啰嗦,请见谅,希望对你有帮助。

毛利
最后于 2020-1-28 23:23 被Mouri_Naruto编辑 ,原因:
2020-1-28 23:07
0
雪    币: 573
活跃值: (222)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
莫非是 初雨群的毛利君? 
感谢分享 真是硬核技术贴啊
最后于 2020-1-29 01:54 被supersoar编辑 ,原因:
2020-1-29 01:51
0
雪    币: 2157
活跃值: (12639)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
13
可以,感谢
2020-1-29 10:03
0
雪    币: 2015
活跃值: (232)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
supersoar 莫非是 初雨群的毛利君? 感谢分享 真是硬核技术贴啊
我的确是初雨开源项目交流群的毛利,也正是群里朋友的建议,于是我在看雪发了帖子
2020-1-29 16:22
0
雪    币: 54
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
感谢分享感谢分享
2020-1-30 17:37
0
雪    币: 34
活跃值: (142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
学长太强了!!!!(又一条没有营养的评论
2020-1-30 18:34
1
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
mark 感谢分享
2020-2-7 18:05
0
雪    币: 299
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
支持毛利,虽迟但到
2021-11-4 11:00
0
雪    币: 96
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
mark
2022-1-3 20:17
0
雪    币: 23
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
毛利毛利
2022-6-29 16:46
0
游客
登录 | 注册 方可回帖
返回
//