标题: MSDN系列(51)--regedit的冷门知识 创建: 2023-10-18 10:35 更新: 2023-10-20 17:24 链接: https://scz.617.cn/windows/202310181035.txt -------------------------------------------------------------------------- 目录: ☆ regjump ☆ regedit命令行参数 ☆ RunAsInvoker 1) __COMPAT_LAYER环境变量 2) AppCompatFlags\Layers 3) ACT ☆ C:\Windows\SysWOW64\regedit.exe 1) subst 2) mklink 3) UNC路径 4) namespace ☆ 参考资源 -------------------------------------------------------------------------- ☆ regjump sysinternals有个regjump,可以命令行指定注册表路径,效果是打开regedit、跳转 到指定路径,比如: regjump "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" 过去regedit的GUI无法输入路径、一步直达,regjump有意义。后来regedit的GUI可 以输入路径,不需要regjump。 regjump不认"__COMPAT_LAYER=RunAsInvoker",普通权限无法执行,必须从管理员级 cmd中执行,这是缺点。 ☆ regedit命令行参数 用IDA反汇编regedit.exe,在Imports中找GetCommandLineW,查看其交叉引用,定位 处理命令行参数的函数。该函数对命令行参数的识别写得相当隐晦,没耐心逆向时, 放狗,有现成解释。 -------------------------------------------------------------------------- regedit /e out.reg export HKLM plus HKCU regedit /e out.reg "RegPath" regedit /e out.reg "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT" export part of Registry 此处不能用HKLM简写 regedit /a out.reg "RegPath" export part of Registry in ANSI mode this is undocumented and will skip any unicode keys/values regedit in.reg import a reg file regedit /s in.reg silent import regedit /m open multiple instances of regedit 最实用,开regedit多实例,研究注册表时经常有此需求 regedit /regserver 将regedit注册成.reg扩展名的处理程序 regedit /unregserver 前述操作的反操作 -------------------------------------------------------------------------- 这些命令行参数曾经应该文档化过,但我简单找了找,没找到官方文档。 用Resource Hacker查看regedit.exe,内嵌了一个inf文件 -------------------------------------------------------------------------- [Version] Signature="$CHICAGO$" [RegExe] AddReg=AddRegRegedit RequiredEngine=SETUPAPI,%ERR_NOSETUPAPI% [UnregExe] DelReg=DelRegRegedit RequiredEngine=SETUPAPI,%ERR_NOSETUPAPI% [AddRegRegedit] HKCR,".reg",,,"regfile" HKCR,"regedit",,,"%DESC_RegFile%" HKCR,"regedit\shell\open\command",,,"regedit.exe %1" HKCR,"regfile",,,"%DESC_RegFile%" HKCR,"regfile","FriendlyTypeName",,"@regedit.exe,-309" ; IDS_FILETYPE HKCR,"regfile\DefaultIcon",,,"regedit.exe,1" HKCR,"regfile\shell\open",,,"Mer&ge" HKCR,"regfile\shell\open","MUIVerb",,"@regedit.exe,-310" ; IDS_MERGE HKCR,"regfile\shell\open\command",,,"regedit.exe ""%1""" [DelRegRegedit] HKCR,".reg" HKCR,"regedit" HKCR,"regfile" [Strings] DESC_RegFile = "Registration Entries" ERR_NOSETUPAPI = "Can not register REGEDIT.EXE because SETUPAPI.DLL is missing." -------------------------------------------------------------------------- /regserver调用advpack.dll!RegInstallW,传递inf文件的RegExe节;/unregserver 传递UnregExe节。 ☆ RunAsInvoker 假设当前cmd非管理员级,在其中执行regedit时会弹UAC提示框。但有时并不需要管 理员权限,比如访问HKCU。可以不弹UAC框而启动regedit,得到普通权限的regedit, 无法写HKLM,但可以读一部分。 1) __COMPAT_LAYER环境变量 执行regedit时,不触发UAC弹框,但也不提升权限: set __COMPAT_LAYER=RunAsInvoker regedit.exe 或 cmd /c "set __COMPAT_LAYER=RunAsInvoker && start /b regedit" 可用任务管理器查看指定进程是否经UAC提权: Task Manager->Details->Select columns->Elevated (特权) 访列为Yes,表示提升至管理员级权限,反之为普通权限。 2) AppCompatFlags\Layers 在LTSB版Win10中测试,其他版本可能有变化,领会精神即可。 复制 C:\Windows\regedit.exe C:\Windows\en-US\regedit.exe.mui 到 C:\temp\regedit.exe C:\temp\en-US\regedit.exe.mui 以普通用户执行: reg.exe add "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "C:\temp\regedit.exe" /t REG_SZ /d "RunAsInvoker" /f reg.exe query "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "C:\temp\regedit.exe" reg.exe delete "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "C:\temp\regedit.exe" /f 以普通用户执行: C:\temp\regedit.exe 无UAC弹框。 在LTSB版Win10中,前述办法只对HKCU有效,HKLM无效。 在LTSB版Win10中,前述办法对"C:\Windows\regedit.exe"无效,始终有UAC弹框,与 owner是否为TrustedInstaller无关。 3) ACT 打开ACT,右键点击"New Database"->Create New->Application Fix -------------------------------------------------------------------------- Name of the program to be fixed regedit (任意) Name of the vendor for this program Microsoft (任意) Program file location C:\temp\regedit.exe (目标PE) -------------------------------------------------------------------------- Next->Additional compatibility modes->勾选RunAsInvoker 一路Next,直至 Matching Infomation Select matching files to be used for program identification. For each file you can select matching attributes. 先"Unselect All",再手工点选特征项,据此能特征化目标PE即可,比如我只选了 -------------------------------------------------------------------------- FILE_DESCRIPTION="Registry Editor" ORIGINAL_FILENAME="REGEDIT.EXE" INTERNAL_NAME="REGEDIT" -------------------------------------------------------------------------- 靠上面这些特征识别目标PE,不靠"Program file location"的绝对路径。 点击Finish,File->Save (Ctrl-S)->regedit_no_uac->regedit_no_uac.sdb,最后 这两名字任意,建议自带描述。 右键选中regedit_no_uac->Install,这一步也可用sdbinst完成,本质一回事。 以普通用户执行: C:\temp\regedit.exe 无UAC弹框。 在LTSB版Win10中,前述办法对"C:\Windows\regedit.exe"无效,始终有UAC弹框,与 owner是否为TrustedInstaller无关。这点与"AppCompatFlags\Layers"情形完全一致, 应该是高版本Windows针对Shim机制的安全限制之一,据说过去Win7无此限制。 ☆ C:\Windows\SysWOW64\regedit.exe subinacl.exe是32位PE,在64位cmd中执行: subinacl.exe /file C:\Windows\regedit.exe /setowner="DESKTOP-TEST\scz" subinacl.exe /file C:\Windows\regedit.exe /setowner="NT SERVICE\TrustedInstaller" 用Process Monitor监控,发现实际处理: C:\Windows\SysWOW64\regedit.exe regedit不在System32下,直接在Windows下,无法用"%windir%\sysnative\"技巧。 有啥办法让32位PE访问64位"C:\Windows\regedit.exe",不考虑修改源码之类的。此 问题与设置owner无关。 参[4],几个类似的问题,但没有答案。这个问题是不是无解?我是想问,有没有类 似sysnative的技巧,应该是没有,但有一些其他技巧可用。 1) subst 小钻风对此问题的解决方案: subst T: C:\Windows subinacl.exe /file T:\regedit.exe /setowner="DESKTOP-TEST\scz" subinacl.exe /file T:\regedit.exe /setowner="NT SERVICE\TrustedInstaller" dir /q C:\Windows\regedit.exe dir /q C:\Windows\SysWOW64\regedit.exe subst T: /d 原理是,不要出现"C:\Windows\regedit.exe"全路径名。 2) mklink 小钻风这个办法我知道,mklink也可以。 用"directory symbolic link"可达预期效果: mklink /D C:\temp\Windows_link C:\Windows subinacl.exe /file C:\temp\Windows_link\regedit.exe /setowner="DESKTOP-TEST\scz" subinacl.exe /file C:\temp\Windows_link\regedit.exe /setowner="NT SERVICE\TrustedInstaller" dir /q C:\temp\Windows_link\regedit.exe dir /q C:\Windows\regedit.exe dir /q C:\Windows\SysWOW64\regedit.exe rmdir C:\temp\Windows_link 3) UNC路径 云海建议试试UNC路径,他这个办法之前我没想过,确实可行,要求Server服务启动 中。 subinacl.exe /file \\localhost\C$\Windows\regedit.exe /setowner="DESKTOP-TEST\scz" subinacl.exe /file \\localhost\C$\Windows\regedit.exe /setowner="NT SERVICE\TrustedInstaller" dir /q C:\Windows\regedit.exe dir /q C:\Windows\SysWOW64\regedit.exe 4) namespace 针对UNC路径要求Server服务启动的限制,云海建议用更高级的方案消除前述限制: \\.\GlobalRoot\GLOBAL??\C:\Windows\regedit.exe \\.\GlobalRoot\GLOBAL??\Global\C:\Windows\regedit.exe \\.\GlobalRoot\??\C:\Windows\regedit.exe \\?\GlobalRoot\??\C:\Windows\regedit.exe \\.\GlobalRoot\DosDevices\C:\Windows\regedit.exe \\?\GlobalRoot\DosDevices\C:\Windows\regedit.exe \\.\Global\C:\Windows\regedit.exe \\?\Global\C:\Windows\regedit.exe 这是利用namespace机制绕过文件系统重定向,参[5]。不考虑Console与RDP的区别, 不考虑多个登录会话的情形,上述几种写法均可,推荐最后一种写法。 subinacl.exe /file \\?\Global\C:\Windows\regedit.exe /setowner="DESKTOP-TEST\scz" subinacl.exe /file \\?\Global\C:\Windows\regedit.exe /setowner="NT SERVICE\TrustedInstaller" dir /q C:\Windows\regedit.exe dir /q C:\Windows\SysWOW64\regedit.exe 注意,"\\?\C:\Windows\regedit.exe"这种不行,会触发重定向。 ☆ 参考资源 [1] https://ss64.com/nt/regedit.html (介绍regedit部分命令行参数) [2] Regedit.exe and a possible race condition - [2018-04-01] https://www.hexacorn.com/blog/2018/04/01/regedit-exe-and-a-possible-race-condition/ (提到regedit两个命令行参数,regserver、unregserver) [3] Regedit Command Line Options Syntax https://techsupt.winbatch.com/webcgi/webbatch.exe?techsupt/nftechsupt.web+WinBatch/Registry+RegEdit~Command~Line~Options~Syntax.txt Regedit Command Line Switches https://www.eolsoft.com/freeware/registry_jumper/regedit_switches.htm (部分命令行参数只适用于Win98的regedit) [4] Open 64 bit regedit from 32 bit application - [2012-09-02] https://stackoverflow.com/questions/12233396/open-64-bit-regedit-from-32-bit-application How to run x64 bit version of registry from cmd.exe located under c:\windows\sysWow64 - [2014-05-06] https://serverfault.com/questions/593522/how-to-run-x64-bit-version-of-registry-from-cmd-exe-located-under-c-windows-sys [5] CreateFileA function https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea File Streams (Local File Systems) https://docs.microsoft.com/en-us/windows/win32/fileio/file-streams Naming Files, Paths, and Namespaces https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file Path prefixes \??\ and \\?\ - Eryk Sun [2017-09-03] https://stackoverflow.com/questions/23041983/path-prefixes-and