MSDN系列(51)regedit的冷门知识

admin 2024年2月17日13:54:26评论7 views字数 5394阅读17分58秒阅读模式
创建: 2023-10-18 10:35
更新: 2023-10-20 17:24
https://scz.617.cn/windows/202310181035.txt

目录:

☆ regjump
☆ regedit命令行参数
☆ RunAsInvoker
    1) __COMPAT_LAYER环境变量
    2) AppCompatFlagsLayers
    3) ACT
☆ C:WindowsSysWOW64regedit.exe
    1) subst
    2) mklink
    3) UNC路径
    4) namespace
☆ 参考资源

☆ regjump

sysinternals有个regjump,可以命令行指定注册表路径,效果是打开regedit、跳转到指定路径,比如:

regjump "HKCUSOFTWAREMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers"

过去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_MACHINESOFTWAREMicrosoftWindows 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,"regeditshellopencommand",,,"regedit.exe %1"
HKCR,"regfile",,,"%DESC_RegFile%"
HKCR,"regfile","FriendlyTypeName",,"@regedit.exe,-309" ; IDS_FILETYPE
HKCR,"regfileDefaultIcon",,,"regedit.exe,1"
HKCR,"regfileshellopen",,,"Mer&ge"
HKCR,"regfileshellopen","MUIVerb",,"@regedit.exe,-310" ; IDS_MERGE
HKCR,"regfileshellopencommand",,,"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) AppCompatFlagsLayers

在LTSB版Win10中测试,其他版本可能有变化,领会精神即可。

复制

C:Windowsregedit.exe
C:Windowsen-USregedit.exe.mui

C:tempregedit.exe
C:tempen-USregedit.exe.mui

以普通用户执行:

reg.exe add "HKCUSOFTWAREMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers" /v "C:tempregedit.exe" /t REG_SZ /d "RunAsInvoker" /f
reg.exe query "HKCUSOFTWAREMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers" /v "C:tempregedit.exe"
reg.exe delete "HKCUSOFTWAREMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers" /v "C:tempregedit.exe" /f

以普通用户执行:

C:tempregedit.exe

无UAC弹框。

在LTSB版Win10中,前述办法只对HKCU有效,HKLM无效。

在LTSB版Win10中,前述办法对"C:Windowsregedit.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:tempregedit.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:tempregedit.exe

无UAC弹框。

在LTSB版Win10中,前述办法对"C:Windowsregedit.exe"无效,始终有UAC弹框,与owner是否为TrustedInstaller无关。这点与"AppCompatFlagsLayers"情形完全一致,应该是高版本Windows针对Shim机制的安全限制之一,据说过去Win7无此限制。

☆ C:WindowsSysWOW64regedit.exe

subinacl.exe是32位PE,在64位cmd中执行:

subinacl.exe /file C:Windowsregedit.exe /setowner="DESKTOP-TESTscz"

用Process Monitor监控,发现实际处理:

C:WindowsSysWOW64regedit.exe

regedit不在System32下,直接在Windows下,无法用"%windir%sysnative"技巧。有啥办法让32位PE访问64位"C:Windowsregedit.exe",不考虑修改源码之类的。此问题与设置owner无关。

参[4],几个类似的问题,但没有答案。这个问题是不是无解?我是想问,有没有类似sysnative的技巧,应该是没有,但有一些其他技巧可用。

1) subst

小钻风对此问题的解决方案:

subst T: C:Windows
subinacl.exe /file T:regedit.exe /setowner="DESKTOP-TESTscz"

原理是,不要出现"C:Windowsregedit.exe"全路径名。

2) mklink

小钻风这个办法我知道,mklink也可以。

用"directory symbolic link"可达预期效果:

mklink /D C:tempWindows_link C:Windows
subinacl.exe /file C:tempWindows_linkregedit.exe /setowner="DESKTOP-TESTscz"

3) UNC路径

云海建议试试UNC路径,他这个办法之前我没想过,确实可行,要求Server服务启动中。

subinacl.exe /file \localhostC$Windowsregedit.exe /setowner="DESKTOP-TESTscz"

4) namespace

针对UNC路径要求Server服务启动的限制,云海建议用更高级的方案消除前述限制:

\.GlobalRootGLOBAL??C:Windowsregedit.exe
\.GlobalRootGLOBAL??GlobalC:Windowsregedit.exe
\.GlobalRoot??C:Windowsregedit.exe
\?GlobalRoot??C:Windowsregedit.exe
\.GlobalRootDosDevicesC:Windowsregedit.exe
\?GlobalRootDosDevicesC:Windowsregedit.exe
\.GlobalC:Windowsregedit.exe
\?GlobalC:Windowsregedit.exe

这是利用namespace机制绕过文件系统重定向,参[5]。不考虑Console与RDP的区别,不考虑多个登录会话的情形,上述几种写法均可,推荐最后一种写法。

subinacl.exe /file \?GlobalC:Windowsregedit.exe /setowner="DESKTOP-TESTscz"

注意,"\?C:Windowsregedit.exe"这种不行,会触发重定向。

☆ 参考资源

(见TXT)

原文始发于微信公众号(青衣十三楼飞花堂):MSDN系列(51)--regedit的冷门知识

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月17日13:54:26
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   MSDN系列(51)regedit的冷门知识http://cn-sec.com/archives/2132182.html

发表评论

匿名网友 填写信息