直到 Windows 7

直到 Windows 7

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               

额外阅读

相关内容