阅读: 2
一、 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],几个类似的问题,但没有答案。这个问题是不是无解?
参考资源
[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