Windows 是一个安全的操作系统,并且拥有丰富的访问检查基础设施。其中两个文件访问权限目前感兴趣的是:
FILE_READ_DATA
(1):“对于文件对象,读取相应文件数据的权利。”FILE_EXECUTE
(32):“对于本机代码文件,执行该文件的权利。”
单独权利的优点FILE_EXECUTE
在于:
- 它让用户执行文件
- 无法看文件里有什么
它可让您保密应用程序二进制内容。它可防止文件被复制。
在 Windows 7 之前版本中可以正常运行
它在 Windows NT、Windows 2000、Windows XP 和 Windows Vista 上的运行方式如下:
- 您可以授予所有访问权限(包括
FILE_EXECUTE
) - 但排除
FILE_READ_DATA
:
用户可以“执行”他们无法“读”:
Windows 2000:他们可以执行他们无法读取的文件
Windows XP:他们可以执行他们无法读取的文件
Windows Vista:他们可以执行他们无法读取的文件
直到 Windows 7
一切都运行良好,直到 Windows 7 出现无法执行文件的情况:
查看获取结果的函数的堆栈跟踪ACCESS_DENIED
,它是创建进程本身正在尝试“读”文件:
0 fltmgr.sys FltpPerformPreCallbacks + 0x361 0x82fabdf7 C:\Windows\system32\drivers\fltmgr.sys
1 fltmgr.sys FltpPassThroughInternal + 0x40 0x82faed38 C:\Windows\system32\drivers\fltmgr.sys
2 fltmgr.sys FltpCreateInternal + 0x24 0x82fc2256 C:\Windows\system32\drivers\fltmgr.sys
3 fltmgr.sys FltpCreate + 0x2c9 0x82fc291b C:\Windows\system32\drivers\fltmgr.sys
4 ntkrnlpa.exe IofCallDriver + 0x63 0x8283ff22 C:\Windows\system32\ntkrnlpa.exe
5 ntkrnlpa.exe IopParseDevice + 0xf08 0x82a5ae83 C:\Windows\system32\ntkrnlpa.exe
6 ntkrnlpa.exe ObpLookupObjectName + 0x510 0x82a3a080 C:\Windows\system32\ntkrnlpa.exe
7 ntkrnlpa.exe ObOpenObjectByName + 0x165 0x82a4a72c C:\Windows\system32\ntkrnlpa.exe
8 ntkrnlpa.exe IopCreateFile + 0x6c3 0x82a4100a C:\Windows\system32\ntkrnlpa.exe
9 ntkrnlpa.exe NtOpenFile + 0x2a 0x82a473a2 C:\Windows\system32\ntkrnlpa.exe
10 ntkrnlpa.exe KiSystemServicePostCall 0x82846a3a C:\Windows\system32\ntkrnlpa.exe
11 ntkrnlpa.exe ZwOpenFile + 0x11 0x828449c5 C:\Windows\system32\ntkrnlpa.exe
12 ntkrnlpa.exe KiSystemServicePostCall 0x82846a3a C:\Windows\system32\ntkrnlpa.exe
13 ntdll.dll ZwCreateUserProcess + 0xc 0x7738526c C:\Windows\SYSTEM32\ntdll.dll
14 kernel32.dll CreateProcessInternalW + 0xe81 0x76421133 C:\Windows\system32\kernel32.dll
15 kernel32.dll CreateProcessW + 0x2c 0x763d2079 C:\Windows\system32\kernel32.dll
17 SHELL32.dll CExecuteApplication::_CreateProcess + 0xfc 0x76712b92 C:\Windows\system32\SHELL32.dll
18 SHELL32.dll CExecuteApplication::_TryCreateProcess + 0x2e 0x76705399 C:\Windows\system32\SHELL32.dll
19 SHELL32.dll CExecuteAssociation::_DoCommand + 0x88 0x7671f5e1 C:\Windows\system32\SHELL32.dll
20 SHELL32.dll CExecuteAssociation::_TryApplication + 0x41 0x767049e4 C:\Windows\system32\SHELL32.dll
21 SHELL32.dll CExecuteAssociation::Execute + 0x5f 0x7671f663 C:\Windows\system32\SHELL32.dll
22 SHELL32.dll CRegDataDrivenCommand::_Invoke + 0xe2 0x76720f21 C:\Windows\system32\SHELL32.dll
23 SHELL32.dll CRegDataDrivenCommand::InvokeFromContextMenu + 0x18 0x76720e52 C:\Windows\system32\SHELL32.dll
24 SHELL32.dll CRegistryVerbsContextMenu::_Execute + 0x5a 0x767210a5 C:\Windows\system32\SHELL32.dll
25 SHELL32.dll CRegistryVerbsContextMenu::InvokeCommand + 0xa4 0x76721008 C:\Windows\system32\SHELL32.dll
26 SHELL32.dll HDXA_LetHandlerProcessCommandEx + 0x132 0x7672049c C:\Windows\system32\SHELL32.dll
27 SHELL32.dll CDefFolderMenu::InvokeCommand + 0x1ca 0x76720374 C:\Windows\system32\SHELL32.dll
28 SHELL32.dll SHInvokeCommandOnContextMenu2 + 0x1cd 0x76a716c5 C:\Windows\system32\SHELL32.dll
29 SHELL32.dll s_DoInvokeVerb + 0x9d 0x76a71924 C:\Windows\system32\SHELL32.dll
30 SHLWAPI.dll WrapperThreadProc + 0x1b5 0x75aa43c0 C:\Windows\system32\SHLWAPI.dll
31 kernel32.dll BaseThreadInitThunk + 0xe 0x7641ef3c C:\Windows\system32\kernel32.dll
32 ntdll.dll __RtlUserThreadStart + 0x70 0x773a360c C:\Windows\SYSTEM32\ntdll.dll
33 ntdll.dll _RtlUserThreadStart + 0x1b 0x773a35df C:\Windows\SYSTEM32\ntdll.dll
我认为这一定与创建进程随着 UAC 的发明 - 但我不明白为什么它能在 Windows Vista(UAC 最早发明的地方)上运行。
奖励视频:第 9 频道,Going https://channel9.msdn.com/Shows/Going+Deep/UAC-What-How-Why
如何让它工作?
所以问题是:
- 我如何让用户执行应用程序
- 同时也不授予
FILE_READ_DATA
?
奖金研究
仅嵌入程序集清单失败
仅当可执行文件具有嵌入式程序集清单时,它才会失败。如果清单为空(例如,不依赖任何 dll、没有 dpi 感知、没有应用程序兼容性 - 为空),则无关紧要。(注意:每个正确编写的应用程序都必须有一个程序集清单;它是与 Windows 的 ABI 合同的一部分)
ShellExecute 和 CreateProcess 都失败
直接调用CreateProcess
我自己(而不是更高级别的ShellExecute
抽象)仍然有错误:
0 FLTMGR.SYS FltDecodeParameters + 0x1cfc
1 FLTMGR.SYS FltDecodeParameters + 0x1840
2 FLTMGR.SYS FltQueryInformationFile + 0x963
3 ntoskrnl.exe IofCallDriver + 0x59
4 ntoskrnl.exe KeInitializeEvent + 0x64
5 ntoskrnl.exe SeSetAccessStateGenericMapping + 0x81b
6 ntoskrnl.exe SeUnlockSubjectContext + 0x85f
7 ntoskrnl.exe ObOpenObjectByNameEx + 0x201
8 ntoskrnl.exe NtCreateFile + 0x8b0
9 ntoskrnl.exe IoCreateFileEx + 0x11d
10 ntoskrnl.exe IoCreateFile + 0x52c
11 ntoskrnl.exe setjmpex + 0x7bd8
12 ntdll.dll NtCreateUserProcess + 0x14
13 wow64.dll Wow64IsStackExtentsCheckEnforced + 0x1098
14 wow64.dll Wow64IsStackExtentsCheckEnforced + 0x880
15 wow64.dll Wow64SystemServiceEx + 0x153
16 wow64cpu.dll TurboDispatchJumpAddressEnd + 0xb
17 wow64cpu.dll BTCpuSimulate + 0x9
18 wow64.dll Wow64LdrpInitialize + 0x26a
19 wow64.dll Wow64LdrpInitialize + 0x127
20 ntdll.dll LdrInitShimEngineDynamic + 0x3133
21 ntdll.dll memset + 0x1edf5
22 ntdll.dll LdrInitializeThunk + 0x63
23 ntdll.dll LdrInitializeThunk + 0xe
24 ntdll.dll NtCreateUserProcess + 0xc
25 KernelBase.dll CreateProcessInternalW + 0x19db
26 KernelBase.dll CreateProcessInternalA + 0x272
27 KernelBase.dll CreateProcessA + 0x2c
28 TestFileExecute.exe TestFileExecute.exe + 0xd3b31