VirtualBox

source: vbox/trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMainA-win.asm@ 54558

Last change on this file since 54558 was 52967, checked in by vboxsync, 10 years ago

SUP: simplified the ntdll hooking / patching so we can avoid the jump table memory as it may end up where system dlls like kernel32 are supposed to be loaded (STATUS_CONFLICTING_ADDRESSES (0xc0000018) process init failure).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.0 KB
Line 
1; $Id: SUPR3HardenedMainA-win.asm 52967 2014-10-06 22:18:51Z vboxsync $
2;; @file
3; VirtualBox Support Library - Hardened main(), Windows assembly bits.
4;
5
6;
7; Copyright (C) 2012-2014 Oracle Corporation
8;
9; This file is part of VirtualBox Open Source Edition (OSE), as
10; available from http://www.virtualbox.org. This file is free software;
11; you can redistribute it and/or modify it under the terms of the GNU
12; General Public License (GPL) as published by the Free Software
13; Foundation, in version 2 as it comes in the "COPYING" file of the
14; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16;
17; The contents of this file may alternatively be used under the terms
18; of the Common Development and Distribution License Version 1.0
19; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20; VirtualBox OSE distribution, in which case the provisions of the
21; CDDL are applicable instead of those of the GPL.
22;
23; You may elect to license modified versions of this file under the
24; terms and conditions of either the GPL or the CDDL or both.
25;
26
27;*******************************************************************************
28;* Header Files *
29;*******************************************************************************
30%define RT_ASM_WITH_SEH64
31%include "iprt/asmdefs.mac"
32
33
34; External code.
35extern NAME(supR3HardenedEarlyProcessInit)
36
37
38BEGINCODE
39
40
41;;
42; Alternative code for LdrInitializeThunk that performs the early process startup
43; for the Stub and VM processes.
44;
45; This does not concern itself with any arguments on stack or in registers that
46; may be passed to the LdrIntializeThunk routine as we just save and restore
47; them all before we restart the restored LdrInitializeThunk routine.
48;
49; @sa supR3HardenedEarlyProcessInit
50;
51BEGINPROC supR3HardenedEarlyProcessInitThunk
52 ;
53 ; Prologue.
54 ;
55
56 ; Reserve space for the "return" address.
57 push 0
58
59 ; Create a stack frame, saving xBP.
60 push xBP
61 SEH64_PUSH_xBP
62 mov xBP, xSP
63 SEH64_SET_FRAME_xBP 0 ; probably wrong...
64
65 ; Save all volatile registers.
66 push xAX
67 push xCX
68 push xDX
69%ifdef RT_ARCH_AMD64
70 push r8
71 push r9
72 push r10
73 push r11
74%endif
75
76 ; Reserve spill space and align the stack.
77 sub xSP, 20h
78 and xSP, ~0fh
79 SEH64_END_PROLOGUE
80
81 ;
82 ; Call the C/C++ code that does the actual work. This returns the
83 ; resume address in xAX, which we put in the "return" stack position.
84 ;
85 call NAME(supR3HardenedEarlyProcessInit)
86 mov [xBP + xCB], xAX
87
88 ;
89 ; Restore volatile registers.
90 ;
91 mov xAX, [xBP - xCB*1]
92 mov xCX, [xBP - xCB*2]
93 mov xDX, [xBP - xCB*3]
94%ifdef RT_ARCH_AMD64
95 mov r8, [xBP - xCB*4]
96 mov r9, [xBP - xCB*5]
97 mov r10, [xBP - xCB*6]
98 mov r11, [xBP - xCB*7]
99%endif
100 ;
101 ; Use the leave instruction to restore xBP and set up xSP to point at
102 ; the resume address. Then use the 'ret' instruction to resume process
103 ; initializaton.
104 ;
105 leave
106 ret
107ENDPROC supR3HardenedEarlyProcessInitThunk
108
109
110
111;;
112; Composes a standard call name.
113%ifdef RT_ARCH_X86
114 %define SUPHNTIMP_STDCALL_NAME(a,b) _ %+ a %+ @ %+ b
115%else
116 %define SUPHNTIMP_STDCALL_NAME(a,b) NAME(a)
117%endif
118
119;; Concats two litterals.
120%define SUPHNTIMP_CONCAT(a,b) a %+ b
121
122
123;;
124; Import data and code for an API call.
125;
126; @param 1 The plain API name.
127; @param 2 The parameter frame size on x86. Multiple of dword.
128; @param 3 Non-zero expression if system call.
129; @param 4 Non-zero expression if early available call
130;
131%define SUPHNTIMP_SYSCALL 1
132%macro SupHardNtImport 4
133 ;
134 ; The data.
135 ;
136BEGINDATA
137global __imp_ %+ SUPHNTIMP_STDCALL_NAME(%1,%2) ; The import name used via dllimport.
138__imp_ %+ SUPHNTIMP_STDCALL_NAME(%1,%2):
139GLOBALNAME g_pfn %+ %1 ; The name we like to refer to.
140 RTCCPTR_DEF 0
141%if %3
142GLOBALNAME g_uApiNo %+ %1
143 RTCCPTR_DEF 0
144%endif
145
146 ;
147 ; The code: First a call stub.
148 ;
149BEGINCODE
150global SUPHNTIMP_STDCALL_NAME(%1, %2)
151SUPHNTIMP_STDCALL_NAME(%1, %2):
152 jmp RTCCPTR_PRE [NAME(g_pfn %+ %1) xWrtRIP]
153
154%if %3
155 ;
156 ; Make system calls.
157 ;
158 %ifdef RT_ARCH_AMD64
159BEGINPROC %1 %+ _SyscallType1
160 SEH64_END_PROLOGUE
161 mov eax, [NAME(g_uApiNo %+ %1) xWrtRIP]
162 mov r10, rcx
163 syscall
164 ret
165ENDPROC %1 %+ _SyscallType1
166 %else
167BEGINPROC %1 %+ _SyscallType1
168 mov edx, 07ffe0300h ; SharedUserData!SystemCallStub
169 mov eax, [NAME(g_uApiNo %+ %1) xWrtRIP]
170 call dword [edx]
171 ret %2
172ENDPROC %1 %+ _SyscallType1
173BEGINPROC %1 %+ _SyscallType2
174 push .return
175 mov edx, esp
176 mov eax, [NAME(g_uApiNo %+ %1) xWrtRIP]
177 sysenter
178 add esp, 4
179.return:
180 ret %2
181ENDPROC %1 %+ _SyscallType2
182 %endif
183%endif
184
185%if %4 == 0
186global NAME(SUPHNTIMP_CONCAT(%1,_Early))
187NAME(SUPHNTIMP_CONCAT(%1,_Early)):
188 int3
189 %ifdef RT_ARCH_AMD64
190 ret
191 %else
192 ret %2
193 %endif
194%endif
195%endmacro
196
197%define SUPHARNT_COMMENT(a_Comment)
198%define SUPHARNT_IMPORT_SYSCALL(a_Name, a_cbParamsX86) SupHardNtImport a_Name, a_cbParamsX86, SUPHNTIMP_SYSCALL, 1
199%define SUPHARNT_IMPORT_STDCALL(a_Name, a_cbParamsX86) SupHardNtImport a_Name, a_cbParamsX86, 0, 0
200%define SUPHARNT_IMPORT_STDCALL_EARLY(a_Name, a_cbParamsX86) SupHardNtImport a_Name, a_cbParamsX86, 0, 1
201%define SUPHARNT_IMPORT_STDCALL_EARLY_OPTIONAL(a_Name, a_cbParamsX86) SUPHARNT_IMPORT_STDCALL_EARLY(a_Name, a_cbParamsX86)
202%include "import-template-ntdll.h"
203%include "import-template-kernel32.h"
204
205
206;
207; For simplified LdrLoadDll patching we define a special writable, readable and
208; exectuable section of 4KB where we can put jump back code.
209;
210section .rwxpg bss execute read write align=4096
211GLOBALNAME g_abSupHardReadWriteExecPage
212 resb 4096
213
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette