Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(23)

Side by Side Diff: sandbox/win/src/service_resolver_64.cc

Issue 84063004: Restructure sandbox code to reduce dependencies pulled in by intercept code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cpu@ comments Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "sandbox/win/src/service_resolver.h" 5 #include "sandbox/win/src/service_resolver.h"
6 6
7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "sandbox/win/src/sandbox_nt_util.h"
9 #include "sandbox/win/src/win_utils.h" 9 #include "sandbox/win/src/win_utils.h"
10 10
11 namespace { 11 namespace {
12 #pragma pack(push, 1) 12 #pragma pack(push, 1)
13 13
14 const ULONG kMmovR10EcxMovEax = 0xB8D18B4C; 14 const ULONG kMmovR10EcxMovEax = 0xB8D18B4C;
15 const USHORT kSyscall = 0x050F; 15 const USHORT kSyscall = 0x050F;
16 const BYTE kRetNp = 0xC3; 16 const BYTE kRetNp = 0xC3;
17 const ULONG64 kMov1 = 0x54894808244C8948; 17 const ULONG64 kMov1 = 0x54894808244C8948;
18 const ULONG64 kMov2 = 0x4C182444894C1024; 18 const ULONG64 kMov2 = 0x4C182444894C1024;
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 } 137 }
138 138
139 // Save the verified code. 139 // Save the verified code.
140 memcpy(local_thunk, &function_code, sizeof(function_code)); 140 memcpy(local_thunk, &function_code, sizeof(function_code));
141 141
142 return true; 142 return true;
143 } 143 }
144 144
145 NTSTATUS ServiceResolverThunk::PerformPatch(void* local_thunk, 145 NTSTATUS ServiceResolverThunk::PerformPatch(void* local_thunk,
146 void* remote_thunk) { 146 void* remote_thunk) {
147 ServiceFullThunk* full_local_thunk = reinterpret_cast<ServiceFullThunk*>( 147 ServiceFullThunk* full_local_thunk =
148 local_thunk); 148 reinterpret_cast<ServiceFullThunk*>(local_thunk);
149 ServiceFullThunk* full_remote_thunk = reinterpret_cast<ServiceFullThunk*>( 149 ServiceFullThunk* full_remote_thunk =
150 remote_thunk); 150 reinterpret_cast<ServiceFullThunk*>(remote_thunk);
151 151
152 // Patch the original code. 152 // Patch the original code.
153 ServiceEntry local_service; 153 ServiceEntry local_service;
154 DCHECK_GE(GetInternalThunkSize(), sizeof(local_service)); 154 DCHECK_NT(GetInternalThunkSize() >= sizeof(local_service));
155 if (!SetInternalThunk(&local_service, sizeof(local_service), NULL, 155 if (!SetInternalThunk(&local_service, sizeof(local_service), NULL,
156 interceptor_)) 156 interceptor_))
157 return STATUS_UNSUCCESSFUL; 157 return STATUS_UNSUCCESSFUL;
158 158
159 // Copy the local thunk buffer to the child. 159 // Copy the local thunk buffer to the child.
160 SIZE_T actual; 160 SIZE_T actual;
161 if (!::WriteProcessMemory(process_, remote_thunk, local_thunk, 161 if (!::WriteProcessMemory(process_, remote_thunk, local_thunk,
162 sizeof(ServiceFullThunk), &actual)) 162 sizeof(ServiceFullThunk), &actual))
163 return STATUS_UNSUCCESSFUL; 163 return STATUS_UNSUCCESSFUL;
164 164
165 if (sizeof(ServiceFullThunk) != actual) 165 if (sizeof(ServiceFullThunk) != actual)
166 return STATUS_UNSUCCESSFUL; 166 return STATUS_UNSUCCESSFUL;
167 167
168 // And now change the function to intercept, on the child. 168 // And now change the function to intercept, on the child.
169 if (NULL != ntdll_base_) { 169 if (NULL != ntdll_base_) {
170 // Running a unit test. 170 // Running a unit test.
171 if (!::WriteProcessMemory(process_, target_, &local_service, 171 if (!::WriteProcessMemory(process_, target_, &local_service,
172 sizeof(local_service), &actual)) 172 sizeof(local_service), &actual))
173 return STATUS_UNSUCCESSFUL; 173 return STATUS_UNSUCCESSFUL;
174 } else { 174 } else {
175 if (!WriteProtectedChildMemory(process_, target_, &local_service, 175 if (!WriteProtectedChildMemory(process_, target_, &local_service,
176 sizeof(local_service))) 176 sizeof(local_service)))
177 return STATUS_UNSUCCESSFUL; 177 return STATUS_UNSUCCESSFUL;
178 } 178 }
179 179
180 return STATUS_SUCCESS; 180 return STATUS_SUCCESS;
181 } 181 }
182 182
183 bool Wow64ResolverThunk::IsFunctionAService(void* local_thunk) const { 183 bool Wow64ResolverThunk::IsFunctionAService(void* local_thunk) const {
184 NOTREACHED(); 184 NOTREACHED_NT();
185 return false; 185 return false;
186 } 186 }
187 187
188 bool Win2kResolverThunk::IsFunctionAService(void* local_thunk) const { 188 bool Win2kResolverThunk::IsFunctionAService(void* local_thunk) const {
189 NOTREACHED(); 189 NOTREACHED_NT();
190 return false; 190 return false;
191 } 191 }
192 192
193 } // namespace sandbox 193 } // namespace sandbox
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698