- 系统底层
【免费下载链接】NSudo
[Deprecated, work in progress alternative: https://github.com/M2Team/NanaRun] Series of System Administration Tools
本文围绕 NSudo 项目主仓库 Website/zh-hant/Readme.md(以及对应的简体中文版 Website/zh-hans/Readme.md)展开,全面解析这一系统管理工具包的核心能力:NSudo Launcher 如何以 TrustedInstaller、System、当前用户等多种访问令牌创建进程,以及 NSudo 恶魔模式如何通过 API Hook 绕过文件和注册表访问检查。阅读本文后,你不仅能在 GUI 与命令行两种场景下熟练使用 NSudo,还能结合 NSudoAPI.cpp 与 NSudoLauncherCUI.cpp 的源码理解其底层实现,并掌握通过 C API 与 .NET 互操作将 NSudo 能力集成进自己程序的方案。
项目定位与背景
NSudo 是一套面向 Windows 的系统管理工具包。根据 Website/zh-hant/Readme.md 的说明,它基于 raymai97 的 SuperCMD 发展而来,其典型应用场景包括:以 SYSTEM 或 TrustedInstaller 权限启动命令提示符、PowerShell,修改受保护的系统文件与注册表,以及运行需要最高权限的维护工具。
项目仓库中实际包含两个核心子系统:
- NSudo Launcher:以指定访问令牌、特权、完整性级别、进程优先级、窗口模式创建进程的启动器,包含图形界面(NSudoG/NSudoLG)与命令行(NSudoL/NSudoLC)两种前端;
- NSudo 恶魔模式(NSudo Devil Mode):通过 Microsoft Detours 对 Windows 用户模式系统调用进行 Inline Hook,使开发者无需修改自身实现即可无视文件和注册表的权限访问判断。
项目技术事实
从仓库配置文件可以确认以下技术事实:
- 以 MIT 许可证发行(见 License.md);
- 提供 x86(Win32)、x86-64(x64)、ARM64 三种架构的二进制(见 NSudoSDK.vcxproj 中同时导入 Win32/x64/ARM64 三套平台属性,以及 NSudoInstance.cs 中按进程架构选择
Win32\NSudoAPI.dll、x64\NSudoAPI.dll、ARM64\NSudoAPI.dll的默认加载逻辑); - 支持 Windows NT 6.0(Windows Vista)及之后版本;
- 使用初雨团队的 VC-LTL 和仓库内置的 libkcrt 以减小二进制体积;
- 使用 C++17,但大部分情况下只使用核心语言特性;
- 构建工程统一通过 Directory.Build.props 和 BuildAllTargets.proj 组织。
使用了 NSudo 的第三方项目
原文档列出了以下使用 NSudo 的第三方项目(作为既有事实引用):
- MSMG ToolKit
- Sledgehammer(WUMT Wrapper Script)
- Dism++
系统要求与快速上手
系统要求
| 项目 | 要求 |
|---|---|
| 支持的 Windows 版本 | Windows NT 6.0(Windows Vista)及之后版本 |
| 支持的处理器架构 | x86(32 位)、x86-64(AMD64)、ARM64 |
快速入门
原文档给出的快速入门方式为:打开对应【CPU 架构】的目录,双击NSudo.exe按提示操作。例如在 Intel 或 AMD 设备上使用 64 位 NSudo,需要先进入x64目录,然后双击NSudoG.exe(GUI 版本)。
仓库中还提供了自动选择架构的启动脚本 Source/Native/Scripts/NSudo.bat,其逻辑是根据%PROCESSOR_ARCHITECTURE%环境变量选择Win32、x64或ARM64目录中的NSudoLG.exe并启动:
@echo off set ArchDir=Win32 if %PROCESSOR_ARCHITECTURE%==AMD64 set ArchDir=x64 if %PROCESSOR_ARCHITECTURE%==ARM64 set ArchDir=ARM64 start "" "%~dp0%ArchDir%\NSudoLG.exe" exit多语言支持
NSudo Launcher 支持简体中文、繁体中文、英语、法语、德语、意大利语、西班牙语共七种语言。语言资源以Translations.json(GUI)和Translations.toml(插件)形式组织,仓库中 Source/Native/NSudoLauncher/Resources/zh-Hant/Translations.json 即为繁体中文界面文案,其LanguageID字段标记为zh-Hant。从 NSudoLauncherCUI.cpp 的main函数可以看出,CUI 版本会根据线程 UI 语言(GetThreadUILanguage)在英文、西班牙文、法文、意大利文、简体/繁体中文、德文、俄文之间自动切换,遇到不支持的语种则回退为英文。
NSudo Launcher 核心特性
原文档将 NSudo Launcher 的能力总结为以下几组,本文逐项结合源码展开。
六种用户(令牌)模式
NSudo Launcher 可以以指定的访问令牌运行程序。对应枚举类型定义于 NSudoAPI.h:
typedef enum class _NSUDO_USER_MODE_TYPE { DEFAULT, TRUSTED_INSTALLER, SYSTEM, CURRENT_USER, CURRENT_PROCESS, CURRENT_PROCESS_DROP_RIGHT, CURRENT_USER_ELEVATED, // Since NSudo 8.1.0 } NSUDO_USER_MODE_TYPE, *PNSUDO_USER_MODE_TYPE;各模式的权限语义(依据原文档,并可与 NSudoAPI.cpp 的令牌获取分支一一对应):
| 模式 | 命令行选项 | 令牌来源(实现方式) | 权限语义 |
|---|---|---|---|
| TrustedInstaller | -U:T | 通过OpenServiceProcessToken(L"TrustedInstaller", ...)获取 TrustedInstaller 服务进程令牌 | 以 TrustedInstaller 访问令牌运行 |
| System | -U:S | 通过CreateSystemToken创建 SYSTEM 访问令牌 | 以 System 访问令牌运行 |
| 当前用户 | -U:C | 通过CreateSessionToken(SessionID, ...)获取当前会话令牌 | 以当前用户的访问令牌运行;若 UAC 未被禁用,该模式权限与标准用户等价 |
| 当前用户(提权) | -U:E | 先获取当前会话令牌,再通过GetTokenInformation(..., TokenLinkedToken, ...)取得链接的高权限令牌并复制为主令牌 | 权限与提升后的用户等价 |
| 当前进程 | -U:P | 通过OpenProcessToken(GetCurrentProcess(), ...)获取当前进程令牌 | 权限与提升后的用户等价 |
| 当前进程(降权) | -U:D | 通过CreateLUAToken(hCurrentProcessToken, ...)创建 LUA(受限用户账户)令牌 | 权限与标准用户等价,且该实现与 Internet Explorer 浏览器中 iertutil.dll 的对应实现一致 |
注意:命令行公开的选项只有T/S/C/E/P/D六个,DEFAULT仅作为内部默认值存在(见 NSudoLauncherCUI.cpp 的参数解析分支)。
特权设置
- 启用全部特权(
-P:E):对应NSUDO_PRIVILEGES_MODE_TYPE::ENABLE_ALL_PRIVILEGES,实现中通过AdjustTokenAllPrivileges(hToken, SE_PRIVILEGE_ENABLED)将令牌内所有特权全部置为启用状态; - 禁用所有特权(
-P:D):对应DISABLE_ALL_PRIVILEGES,通过AdjustTokenAllPrivileges(hToken, 0)禁用所有特权。
若不带-P参数,则保持令牌原有特权状态(见 NSudoAPI.cpp)。
完整性级别(Mandatory Label)
支持指定以下完整性级别(命令行选项对应 NSudoLauncherCUI.cpp):
| 命令行选项 | 含义 | 对应的 Windows RID 常量 |
|---|---|---|
-M:S | 系统 | SECURITY_MANDATORY_SYSTEM_RID |
-M:H | 高 | SECURITY_MANDATORY_HIGH_RID |
-M:M | 中 | SECURITY_MANDATORY_MEDIUM_RID |
-M:L | 低 | SECURITY_MANDATORY_LOW_RID |
完整性级别的设置由 NSudoAPI.cpp 中的SetTokenMandatoryLabel(hToken, MandatoryLabelRid)完成。底层枚举NSUDO_MANDATORY_LABEL_TYPE还额外定义了UNTRUSTED、MEDIUM_PLUS、PROTECTED_PROCESS等未在命令行公开的值(见 NSudoAPI.h)。
进程优先级
支持低、低于正常、正常、高于正常、高、实时六个优先级等级,命令行选项与 Windows 优先级类常量的对应关系(见 NSudoAPI.cpp):
| 命令行选项 | 含义 | Windows 常量 |
|---|---|---|
-Priority:Idle | 低 | IDLE_PRIORITY_CLASS |
-Priority:BelowNormal | 低于正常 | BELOW_NORMAL_PRIORITY_CLASS |
-Priority:Normal | 正常 | NORMAL_PRIORITY_CLASS |
-Priority:AboveNormal | 高于正常 | ABOVE_NORMAL_PRIORITY_CLASS |
-Priority:High | 高 | HIGH_PRIORITY_CLASS |
-Priority:RealTime | 实时 | REALTIME_PRIORITY_CLASS |
优先级是在进程以CREATE_SUSPENDED状态创建后、恢复主线程前,通过SetPriorityClass(ProcessInfo.hProcess, ProcessPriority)设定的(见 NSudoAPI.cpp)。
窗口模式
支持显示窗口、隐藏窗口、最大化、最小化四种模式,对应NSUDO_SHOW_WINDOW_MODE_TYPE枚举(见 NSudoAPI.h),最终映射为SW_SHOWDEFAULT、SW_SHOW、SW_HIDE、SW_MAXIMIZE、SW_MINIMIZE,并通过STARTUPINFOW.wShowWindow传入(见 NSudoAPI.cpp 与 L639-L644)。
其他运行控制能力
- 进程创建后等待其运行结束(
-Wait):等待间隔由WaitInterval参数控制,命令行传入INFINITE;底层通过WaitForSingleObjectEx(ProcessInfo.hProcess, WaitInterval, FALSE)实现(见 NSudoAPI.cpp); - 以指定当前目录运行程序(
-CurrentDirectory:[目录路径]):若省略则默认使用 NSudo Launcher 自身所在目录; - 在当前控制台窗口下运行程序(
-UseCurrentConsole):若不指定,进程将在新的控制台窗口运行;底层通过创建标志CREATE_NEW_CONSOLE控制(见 NSudoAPI.cpp); - 快捷方式列表:可以通过编辑
NSudo.json定制常用命令(详见下文); - 支持多种命令行风格:
-、/、--三种前缀与:、=两种分隔符均可混用。
工程化与体验细节
原文档还强调了三项与实现相关的特性:
- 完整的高 DPI 支持:与 Windows 外壳(conhost.exe)的实现一致。Windows 10 Build 10240 及之后版本具有完整的 Per-Monitor DPI-Aware 支持,Windows Vista 至 Windows 8.1 之间具有完整的 System DPI-Aware 支持;
- 完整的无障碍访问支持:可以在 Windows 讲述人(Narrator)下顺畅使用 NSudo Launcher;
- 高性能:实现不需要创建 Windows 服务和 Windows 服务进程。
命令行参数详解
命令行版 NSudo Launcher 的完整帮助文本位于仓库的 Source/Native/NSudoLauncher/Resources/zh-Hans/CommandLineHelp.txt。完整参数清单如下:
| 参数 | 说明 |
|---|---|
-U:[选项] | 以指定用户选项创建进程,选项为T(TrustedInstaller)、S(System)、C(当前用户)、E(当前用户提权)、P(当前进程)、D(当前进程降权)。这是必须包含的参数 |
-P:[选项] | 特权选项,E启用全部特权,D禁用所有特权;不带-P则使用默认特权 |
-M:[选项] | 完整性选项,S系统、H高、M中、L低;不带-M则使用默认完整性 |
-Priority:[选项] | 进程优先级,Idle/BelowNormal/Normal/AboveNormal/High/RealTime |
-ShowWindowMode:[选项] | 窗口模式,Show/Hide/Maximize/Minimize |
-Wait | 等待创建的进程结束后再退出 |
-CurrentDirectory:[目录路径] | 设置进程当前目录 |
-UseCurrentConsole | 使用当前控制台窗口创建进程 |
-Version | 显示版本信息 |
-?/-H/-Help | 显示帮助内容 |
三条重要的参数书写规则(来自帮助文本,并在 NSudoLauncherCUI.cpp 中通过Mile::SpiltCommandLineEx传入的分隔符集合{ "-", "/", "--" }与{ "=", ":" }得到源码级印证):
- 所有 NSudo Launcher 命令行参数不区分大小写;
- 可以使用
/或--代替-,使用=代替:,例如/U:T与-U=T等价; - 为了保证最佳体验,NSudoLC 不支持上下文菜单。
典型命令行示例
以 TrustedInstaller 权限、启用所有特权、完整性默认运行命令提示符:
NSudoL -U:T -P:E cmd若再指定高完整性级别并等待进程结束:
NSudoL -U:T -P:E -M:H -Wait cmd以 SYSTEM 令牌、隐藏窗口方式启动 PowerShell:
NSudoL -U:S -ShowWindowMode:Hide powershell命令行的解析流程
从 NSudoLauncherCUI.cpp 可以看到,CUI 前端的主流程为:
SpiltCommandLineEx将命令行按分隔符拆分为「选项-参数」映射与未解析的命令行(L775-L781);- 未解析的命令行先经
CNSudoShortCutAdapter::Translate做快捷方式名称翻译(L783-L785); NSudoCommandLineParser逐个识别U/P/M/Priority/ShowWindowMode/Wait/CurrentDirectory/UseCurrentConsole选项并做类型转换(L527-L672),最后调用NSudoCreateProcess完成实际进程创建(L679-L691);- 根据返回的
NSUDO_MESSAGE枚举(SUCCESS、INVALID_COMMAND_PARAMETER、CREATE_PROCESS_FAILED等,L152-L161)决定输出结果或显示帮助/版本信息。
通过 NSudo.json 定制快捷方式列表
NSudo Launcher 支持「快捷方式列表」:GUI 界面的命令下拉框与命令行入口都可以使用预定义的常用任务名。该列表通过编辑可执行文件同目录下的NSudo.json定制,仓库默认内容位于 Source/Native/NSudoLauncher/Resources/NSudo.json:
{ "ShortCutList_V2": { "命令提示符": "cmd", "PowerShell": "powershell", "PowerShell ISE": "powershell_ise", "Hosts编辑": "notepad %windir%\\System32\\Drivers\\etc\\hosts" } }读取逻辑由 NSudoLauncherCUI.cpp 中的CNSudoShortCutAdapter::Read实现:程序在初始化时读取自身目录下的NSudo.json(AppPath + L"\\NSudo.json",见 L445-L446),使用仓库自带的轻量 JSON 解析器 jsmn 解析ShortCutList_V2对象,将「显示名称 → 实际命令行」的映射装入ShortCutList;之后用户在命令行输入快捷方式名称时,Translate方法会将其替换为对应的实际命令(L389-L396)。
底层原理:NSudoCreateProcess 的完整调用链
NSudo Launcher 的创建进程能力全部集中在共享库的NSudoCreateProcess函数中。其 C/C++ 函数原型定义于 NSudoAPI.h:
EXTERN_C HRESULT WINAPI NSudoCreateProcess( _In_ NSUDO_USER_MODE_TYPE UserModeType, _In_ NSUDO_PRIVILEGES_MODE_TYPE PrivilegesModeType, _In_ NSUDO_MANDATORY_LABEL_TYPE MandatoryLabelType, _In_ NSUDO_PROCESS_PRIORITY_CLASS_TYPE ProcessPriorityClassType, _In_ NSUDO_SHOW_WINDOW_MODE_TYPE ShowWindowModeType, _In_ DWORD WaitInterval, _In_ BOOL CreateNewConsole, _In_ LPCWSTR CommandLine, _In_opt_ LPCWSTR CurrentDirectory);从 NSudoAPI.cpp 的实现可以看出完整流程:
- 启用调试特权:打开当前进程令牌并复制出模拟令牌,在模拟令牌上启用
SeDebugPrivilege,再SetThreadToken切换到该上下文(L249-L328)。这一步是后续获取 SYSTEM / TrustedInstaller 等服务令牌的前提; - 准备 SYSTEM 上下文:获取活动会话 ID(
GetActiveSessionID,L330-L340),创建 SYSTEM 令牌并启用其全部特权(L342-L401); - 按用户模式获取原始令牌:
TRUSTED_INSTALLER打开TrustedInstaller服务进程令牌、SYSTEM重新创建系统令牌、CURRENT_USER获取会话令牌、CURRENT_PROCESS打开当前进程令牌、CURRENT_PROCESS_DROP_RIGHT用CreateLUAToken生成 LUA 令牌、CURRENT_USER_ELEVATED通过TokenLinkedToken取出提升后的链接令牌(L403-L537); - 复制为主令牌并设置会话 ID:将原始令牌以
TokenPrimary类型复制,并用SetTokenInformation(hToken, TokenSessionId, ...)写入活动会话 ID(L539-L573); - 调整特权与完整性:根据
PrivilegesModeType启用或禁用全部特权(L575-L611),根据MandatoryLabelType通过SetTokenMandatoryLabel设置完整性标签(L613-L627); - 创建进程:构造
CREATE_SUSPENDED | CREATE_UNICODE_ENVIRONMENT创建标志(必要时追加CREATE_NEW_CONSOLE),通过CreateEnvironmentBlock为目标令牌生成用户环境变量,再调用CreateProcessAsUserW以目标令牌创建进程(L629-L667); - 设定优先级并等待:
SetPriorityClass设定优先级类,ResumeThread恢复主线程,最后按WaitInterval等待进程结束(L670-L678)。
整个函数在运行期间通过NSudoWriteLog记录每一步的输入参数与失败原因,失败路径均以 HRESULT 返回;成功时返回S_OK(L83-L103、L697-L701)。日志接口NSudoReadLog/NSudoWriteLog同样定义于 NSudoAPI.h 并在 NSudoAPI.cpp 中以带锁的全局字符串实现。
参数约束
CommandLine字符串最大长度为 32K(32768)字符,其中模块名部分被限制为MAX_PATH(260)字符;CurrentDirectory需要使用完整路径,也支持 UNC 路径;若为nullptr,新进程将沿用调用进程的当前驱动器和目录;WaitInterval以毫秒为单位。
为开发者提供 C API 与 .NET Core 互操作
NSudo 为开发者提供 C APIs 和 .NET Core 互操作支持,这是把 NSudo 的令牌管理能力嵌入自己程序的标准途径。
C/C++ 静态库接入
共享库本体编译为静态库(见 NSudoSDK.vcxproj 的MileProjectType=StaticLibrary),头文件为 NSudoAPI.h,其中定义了四组核心枚举:
// 特权模式 typedef enum class _NSUDO_PRIVILEGES_MODE_TYPE { DEFAULT, ENABLE_ALL_PRIVILEGES, DISABLE_ALL_PRIVILEGES } NSUDO_PRIVILEGES_MODE_TYPE, *PNSUDO_PRIVILEGES_MODE_TYPE; // 完整性标签 typedef enum class _NSUDO_MANDATORY_LABEL_TYPE { UNTRUSTED, LOW, MEDIUM, MEDIUM_PLUS, HIGH, SYSTEM, PROTECTED_PROCESS, } NSUDO_MANDATORY_LABEL_TYPE, *PNSUDO_MANDATORY_LABEL_TYPE; // 进程优先级 typedef enum class _NSUDO_PROCESS_PRIORITY_CLASS_TYPE { IDLE, BELOW_NORMAL, NORMAL, ABOVE_NORMAL, HIGH, REALTIME, } NSUDO_PROCESS_PRIORITY_CLASS_TYPE, *PNSUDO_PROCESS_PRIORITY_CLASS_TYPE; // 窗口模式 typedef enum class _NSUDO_SHOW_WINDOW_MODE_TYPE { DEFAULT, SHOW, HIDE, MAXIMIZE, MINIMIZE, } NSUDO_SHOW_WINDOW_MODE_TYPE, *PNSUDO_SHOW_WINDOW_MODE_TYPE;C/C++ 调用方式可参考 Website/zh-hant/docs/SharedLibrary.md 中给出的原型与参数语义说明。
.NET 互操作
M2.NSudo是位于 Source/MSIL/M2.NSudo/ 的 .NET 类库项目,核心类为NSudoInstance(NSudoInstance.cs)。其工作方式为:
- 构造函数按当前进程架构(
RuntimeInformation.ProcessArchitecture)从Win32\NSudoAPI.dll、x64\NSudoAPI.dll或ARM64\NSudoAPI.dll中LoadLibrary加载共享库(L122-L166),也可通过BinaryPaths参数自定义各架构 DLL 路径; - 通过
GetProcAddress+Marshal.GetDelegateForFunctionPointer将NSudoReadLog、NSudoWriteLog、NSudoCreateProcess三个导出函数绑定为托管委托(L19-L113); - 公开
ReadLog()、WriteLog(Sender, Content)与CreateProcess(...)三个托管方法,其中CreateProcess在 HRESULT 非 0 时抛出ExternalException(L286-L318)。
对应的 .NET 枚举定义在 Source/MSIL/M2.NSudo/NSUDO_USER_MODE_TYPE.cs、NSUDO_PRIVILEGES_MODE_TYPE.cs、NSUDO_MANDATORY_LABEL_TYPE.cs、NSUDO_PROCESS_PRIORITY_CLASS_TYPE.cs 与 NSUDO_SHOW_WINDOW_MODE_TYPE.cs。仓库中的演示程序 Source/MSIL/M2.NSudo.Demo/Program.cs 提供了可运行的参考示例,一个典型的调用如下:
NSudoInstance instance = new NSudoInstance(); instance.CreateProcess( NSUDO_USER_MODE_TYPE.TRUSTED_INSTALLER, NSUDO_PRIVILEGES_MODE_TYPE.ENABLE_ALL_PRIVILEGES, NSUDO_MANDATORY_LABEL_TYPE.SYSTEM, NSUDO_PROCESS_PRIORITY_CLASS_TYPE.NORMAL, NSUDO_SHOW_WINDOW_MODE_TYPE.DEFAULT, 0, // WaitInterval(毫秒) true, // CreateNewConsole "cmd", null); // CurrentDirectoryNSudo 恶魔模式:无需修改代码即获得高级文件/注册表访问能力
NSudo 恶魔模式是面向开发者的「对于希望无视管理员权限的进程下的文件和注册表访问判断的开发者而言最优雅的解决方案」。它的完整说明文档位于 Website/zh-hant/docs/DevilMode.md,实现位于 Source/Native/NSudoDevilMode/NSudoDevilMode.cpp。
原理
恶魔模式使用开源的 Microsoft Detours 库对 Windows 用户模式系统调用层(即 ntdll.dll 导出的前缀为Nt或Zw的 API)进行 Inline Hook:当进程内发生文件或注册表句柄创建/打开调用时,Hook 会自动传入能够绕过访问检查的选项,使得以管理员身份运行的进程基本无需修改自身实现即可充分利用其特权。
它挂钩的 Windows NT 内核系统调用列表(源自 DevilMode.md 的表格,并与 NSudoDevilMode.cpp 中FunctionType枚举及挂钩数组对应):
| 名称 | 起源 |
|---|---|
| NtCreateKey | Dism++ 春哥附体 |
| NtCreateKeyTransacted | NSudo 恶魔模式 |
| NtOpenKey | Dism++ 春哥附体,并增强了效果 |
| NtOpenKeyTransacted | NSudo 恶魔模式 |
| NtOpenKeyEx | Dism++ 春哥附体 |
| NtOpenKeyTransactedEx | NSudo 恶魔模式 |
| NtCreateFile | Dism++ 春哥附体 |
| NtOpenFile | Dism++ 春哥附体 |
使用方式
启用恶魔模式只需将它的 DLL 加载进以管理员身份运行的进程地址空间:调用LoadLibrary加载 NSudo 恶魔模式的动态链接库即可启用,调用FreeLibrary释放其 HMODULE 句柄即可禁用。与原本需要 SYSTEM 和 TrustedInstaller 权限相比,以管理员权限运行即可。若能将其远程注入到管理员或更高权限的进程(例如 7-Zip)中,也能为该进程赋予无视文件和注册表权限的能力。
DevilMode.md 还提供了一个 C# 测试用例:遍历C:\System Volume Information目录,启用恶魔模式时可正常列出内容,FreeLibrary禁用后会抛出「文件夹拒绝访问」异常。
技术内幕
从其原理说明与实现可以看到几个关键点:
- 前提是特权:启用
SeBackupPrivilege和SeRestorePrivilege是必要条件,并且创建文件或注册表句柄时须传入对应选项才生效; - 智能传入:只有当前进程令牌上下文能够启用这两个特权时,Hook 才会传入对应选项(否则直接传入会返回错误,这也是 Windows 自身实现不传入的原因);
- 最小权限原则:初始化时先创建一份当前进程令牌的模拟令牌副本并在副本上开启这两个特权;Hook 中先备份当前线程上下文的令牌,替换为模拟令牌副本(模拟令牌上下文),调用原 API 后再恢复原令牌(对应源码中的
NSudoDevilModeEnterPrivilegedContext/NSudoDevilModeLeavePrivilegedContext,见 NSudoDevilMode.cpp)。
结语
NSudo 是一个把「以谁的身份运行进程」这一 Windows 安全主题工程化的系统管理工具包:NSudo Launcher 通过统一封装令牌获取、特权调整、完整性标签、优先级与窗口模式等底层操作,向用户和开发者同时提供了 GUI、命令行、C API 与 .NET 互操作四类入口;NSudo 恶魔模式则用 Inline Hook 的方式为开发者提供了一种「不改代码即可绕过文件和注册表访问判断」的补充方案。如果想深入了解参数语义,可继续阅读 CommandLineHelp.txt 与 NSudoAPI.h;想追踪完整实现,可从 NSudoAPI.cpp 的NSudoCreateProcess入手逐段阅读。
- 系统底层
【免费下载链接】NSudo
[Deprecated, work in progress alternative: https://github.com/M2Team/NanaRun] Series of System Administration Tools
相关推荐
NSudo 使用指南:以 TrustedInstaller 与 System 权限运行程序的命令行详解
NSudo 使用指南:以 TrustedInstaller 与 System 权限运行程序的命令行详解 本篇技术指南围绕 NSudo 系列系统管理工具中的 NS
系统底层NSudo 用户手册深度解析:在 Windows 下以 TrustedInstaller、System 等令牌运行程序的完整实践
NSudo 用户手册深度解析:在 Windows 下以 TrustedInstaller、System 等令牌运行程序的完整实践 本文基于 NSudo 官方用户
系统底层NSudo:在 TrustedInstaller、System 与降权令牌下启动进程的技术指南——命令行参考、NSudo.json 配置、C API 与 .NET 绑定全解析
NSudo:在 TrustedInstaller、System 与降权令牌下启动进程的技术指南——命令行参考、NSudo.json 配置、C API 与 .NE
系统底层
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考