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

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

Issue 1225183003: CreateThread interception, to use CreateRemoteThread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: tweaks from review Created 5 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
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/process_thread_dispatcher.h" 5 #include "sandbox/win/src/process_thread_dispatcher.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "sandbox/win/src/crosscall_client.h" 9 #include "sandbox/win/src/crosscall_client.h"
10 #include "sandbox/win/src/interception.h" 10 #include "sandbox/win/src/interception.h"
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 {IPC_NTOPENPROCESSTOKENEX_TAG, {VOIDPTR_TYPE, UINT32_TYPE, UINT32_TYPE}}, 115 {IPC_NTOPENPROCESSTOKENEX_TAG, {VOIDPTR_TYPE, UINT32_TYPE, UINT32_TYPE}},
116 reinterpret_cast<CallbackGeneric>( 116 reinterpret_cast<CallbackGeneric>(
117 &ThreadProcessDispatcher::NtOpenProcessTokenEx)}; 117 &ThreadProcessDispatcher::NtOpenProcessTokenEx)};
118 118
119 static const IPCCall create_params = { 119 static const IPCCall create_params = {
120 {IPC_CREATEPROCESSW_TAG, 120 {IPC_CREATEPROCESSW_TAG,
121 {WCHAR_TYPE, WCHAR_TYPE, WCHAR_TYPE, INOUTPTR_TYPE}}, 121 {WCHAR_TYPE, WCHAR_TYPE, WCHAR_TYPE, INOUTPTR_TYPE}},
122 reinterpret_cast<CallbackGeneric>( 122 reinterpret_cast<CallbackGeneric>(
123 &ThreadProcessDispatcher::CreateProcessW)}; 123 &ThreadProcessDispatcher::CreateProcessW)};
124 124
125 // NOTE(liamjm): 2nd param is size_t: Using VOIDPTR_TYPE as they are
126 // the same size on windows.
127 assert(sizeof(size_t) == sizeof(void*));
Will Harris 2015/12/03 23:58:14 this should be static_assert - see https://groups.
liamjm (20p) 2016/02/01 23:36:39 Done.
128 static const IPCCall create_thread_params = {
129 {IPC_CREATETHREAD_TAG,
130 {VOIDPTR_TYPE, VOIDPTR_TYPE, VOIDPTR_TYPE, VOIDPTR_TYPE, UINT32_TYPE}},
131 reinterpret_cast<CallbackGeneric>(
132 &ThreadProcessDispatcher::CreateThread)};
133
125 ipc_calls_.push_back(open_thread); 134 ipc_calls_.push_back(open_thread);
126 ipc_calls_.push_back(open_process); 135 ipc_calls_.push_back(open_process);
127 ipc_calls_.push_back(process_token); 136 ipc_calls_.push_back(process_token);
128 ipc_calls_.push_back(process_tokenex); 137 ipc_calls_.push_back(process_tokenex);
129 ipc_calls_.push_back(create_params); 138 ipc_calls_.push_back(create_params);
139 ipc_calls_.push_back(create_thread_params);
130 } 140 }
131 141
132 bool ThreadProcessDispatcher::SetupService(InterceptionManager* manager, 142 bool ThreadProcessDispatcher::SetupService(InterceptionManager* manager,
133 int service) { 143 int service) {
134 switch (service) { 144 switch (service) {
135 case IPC_NTOPENTHREAD_TAG: 145 case IPC_NTOPENTHREAD_TAG:
136 case IPC_NTOPENPROCESS_TAG: 146 case IPC_NTOPENPROCESS_TAG:
137 case IPC_NTOPENPROCESSTOKEN_TAG: 147 case IPC_NTOPENPROCESSTOKEN_TAG:
138 case IPC_NTOPENPROCESSTOKENEX_TAG: 148 case IPC_NTOPENPROCESSTOKENEX_TAG:
139 // There is no explicit policy for these services. 149 // There is no explicit policy for these services.
140 NOTREACHED(); 150 NOTREACHED();
141 return false; 151 return false;
142 152
143 case IPC_CREATEPROCESSW_TAG: 153 case IPC_CREATEPROCESSW_TAG:
144 return INTERCEPT_EAT(manager, kKerneldllName, CreateProcessW, 154 return INTERCEPT_EAT(manager, kKerneldllName, CreateProcessW,
145 CREATE_PROCESSW_ID, 44) && 155 CREATE_PROCESSW_ID, 44) &&
146 INTERCEPT_EAT(manager, L"kernel32.dll", CreateProcessA, 156 INTERCEPT_EAT(manager, L"kernel32.dll", CreateProcessA,
147 CREATE_PROCESSA_ID, 44); 157 CREATE_PROCESSA_ID, 44);
148 158
159 case IPC_CREATETHREAD_TAG:
160 return INTERCEPT_EAT(manager, kKerneldllName, CreateThread,
161 CREATE_THREAD_ID, 28);
162
149 default: 163 default:
150 return false; 164 return false;
151 } 165 }
152 } 166 }
153 167
154 bool ThreadProcessDispatcher::NtOpenThread(IPCInfo* ipc, 168 bool ThreadProcessDispatcher::NtOpenThread(IPCInfo* ipc,
155 uint32 desired_access, 169 uint32 desired_access,
156 uint32 thread_id) { 170 uint32 thread_id) {
157 HANDLE handle; 171 HANDLE handle;
158 NTSTATUS ret = ProcessPolicy::OpenThreadAction(*ipc->client_info, 172 NTSTATUS ret = ProcessPolicy::OpenThreadAction(*ipc->client_info,
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 // Here we force the app_name to be the one we used for the policy lookup. 249 // Here we force the app_name to be the one we used for the policy lookup.
236 // If our logic was wrong, at least we wont allow create a random process. 250 // If our logic was wrong, at least we wont allow create a random process.
237 DWORD ret = ProcessPolicy::CreateProcessWAction(eval, *ipc->client_info, 251 DWORD ret = ProcessPolicy::CreateProcessWAction(eval, *ipc->client_info,
238 exe_name, *cmd_line, 252 exe_name, *cmd_line,
239 proc_info); 253 proc_info);
240 254
241 ipc->return_info.win32_result = ret; 255 ipc->return_info.win32_result = ret;
242 return true; 256 return true;
243 } 257 }
244 258
259 bool ThreadProcessDispatcher::CreateThread(
260 IPCInfo* ipc,
261 LPSECURITY_ATTRIBUTES thread_attributes,
262 SIZE_T stack_size,
263 LPTHREAD_START_ROUTINE start_address,
264 PVOID parameter,
265 DWORD creation_flags) {
266 if (!start_address) {
267 return false;
268 }
269
270 HANDLE handle;
271 DWORD ret = ProcessPolicy::CreateThreadAction(
272 GIVE_ALLACCESS, *ipc->client_info, thread_attributes, stack_size,
273 start_address, parameter, creation_flags, NULL, &handle);
274
275 ipc->return_info.nt_status = ret;
276 ipc->return_info.handle = handle;
277 return true;
278 }
279
245 } // namespace sandbox 280 } // namespace sandbox
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698