| Index: sandbox/win/src/target_process.cc
|
| diff --git a/sandbox/win/src/target_process.cc b/sandbox/win/src/target_process.cc
|
| index 7fddffb4c41d0672a7539562ab41a93cd14ec6a4..72e2780c8c3fff520c93704b4ca4b3c66e1a4283 100644
|
| --- a/sandbox/win/src/target_process.cc
|
| +++ b/sandbox/win/src/target_process.cc
|
| @@ -12,7 +12,6 @@
|
|
|
| #include "base/macros.h"
|
| #include "base/memory/free_deleter.h"
|
| -#include "base/win/pe_image.h"
|
| #include "base/win/startup_information.h"
|
| #include "base/win/windows_version.h"
|
| #include "sandbox/win/src/crosscall_client.h"
|
| @@ -50,26 +49,6 @@ SANDBOX_INTERCEPT HANDLE g_shared_section;
|
| SANDBOX_INTERCEPT size_t g_shared_IPC_size;
|
| SANDBOX_INTERCEPT size_t g_shared_policy_size;
|
|
|
| -// Returns the address of the main exe module in memory taking in account
|
| -// address space layout randomization.
|
| -void* GetBaseAddress(const wchar_t* exe_name, void* entry_point) {
|
| - HMODULE exe = ::LoadLibrary(exe_name);
|
| - if (NULL == exe)
|
| - return exe;
|
| -
|
| - base::win::PEImage pe(exe);
|
| - if (!pe.VerifyMagic()) {
|
| - ::FreeLibrary(exe);
|
| - return exe;
|
| - }
|
| - PIMAGE_NT_HEADERS nt_header = pe.GetNTHeaders();
|
| - char* base = reinterpret_cast<char*>(entry_point) -
|
| - nt_header->OptionalHeader.AddressOfEntryPoint;
|
| -
|
| - ::FreeLibrary(exe);
|
| - return base;
|
| -}
|
| -
|
| TargetProcess::TargetProcess(base::win::ScopedHandle initial_token,
|
| base::win::ScopedHandle lockdown_token,
|
| HANDLE job,
|
| @@ -180,31 +159,20 @@ ResultCode TargetProcess::Create(
|
| initial_token_.Close();
|
| }
|
|
|
| - CONTEXT context;
|
| - context.ContextFlags = CONTEXT_ALL;
|
| - if (!::GetThreadContext(process_info.thread_handle(), &context)) {
|
| - *win_error = ::GetLastError();
|
| - ::TerminateProcess(process_info.process_handle(), 0);
|
| - return SBOX_ERROR_GET_THREAD_CONTEXT;
|
| - }
|
| -
|
| -#if defined(_WIN64)
|
| - void* entry_point = reinterpret_cast<void*>(context.Rcx);
|
| -#else
|
| -#pragma warning(push)
|
| -#pragma warning(disable: 4312)
|
| - // This cast generates a warning because it is 32 bit specific.
|
| - void* entry_point = reinterpret_cast<void*>(context.Eax);
|
| -#pragma warning(pop)
|
| -#endif // _WIN64
|
| -
|
| if (!target_info->DuplicateFrom(process_info)) {
|
| *win_error = ::GetLastError(); // This may or may not be correct.
|
| ::TerminateProcess(process_info.process_handle(), 0);
|
| return SBOX_ERROR_DUPLICATE_TARGET_INFO;
|
| }
|
|
|
| - base_address_ = GetBaseAddress(exe_path, entry_point);
|
| + base_address_ = GetProcessBaseAddress(process_info.process_handle());
|
| + DCHECK(base_address_);
|
| + if (!base_address_) {
|
| + *win_error = ::GetLastError();
|
| + ::TerminateProcess(process_info.process_handle(), 0);
|
| + return SBOX_ERROR_CANNOT_FIND_BASE_ADDRESS;
|
| + }
|
| +
|
| sandbox_process_info_.Set(process_info.Take());
|
| return SBOX_ALL_OK;
|
| }
|
|
|