| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef SANDBOX_SRC_SERVICE_RESOLVER_H__ | |
| 6 #define SANDBOX_SRC_SERVICE_RESOLVER_H__ | |
| 7 | |
| 8 #include "sandbox/src/nt_internals.h" | |
| 9 #include "sandbox/src/resolver.h" | |
| 10 | |
| 11 namespace sandbox { | |
| 12 | |
| 13 // This is the concrete resolver used to perform service-call type functions | |
| 14 // inside ntdll.dll. | |
| 15 class ServiceResolverThunk : public ResolverThunk { | |
| 16 public: | |
| 17 // The service resolver needs a child process to write to. | |
| 18 ServiceResolverThunk(HANDLE process, bool relaxed) | |
| 19 : process_(process), ntdll_base_(NULL), win2k_(false), | |
| 20 relaxed_(relaxed), relative_jump_(0) {} | |
| 21 virtual ~ServiceResolverThunk() {} | |
| 22 | |
| 23 // Implementation of Resolver::Setup. | |
| 24 virtual NTSTATUS Setup(const void* target_module, | |
| 25 const void* interceptor_module, | |
| 26 const char* target_name, | |
| 27 const char* interceptor_name, | |
| 28 const void* interceptor_entry_point, | |
| 29 void* thunk_storage, | |
| 30 size_t storage_bytes, | |
| 31 size_t* storage_used); | |
| 32 | |
| 33 // Implementation of Resolver::ResolveInterceptor. | |
| 34 virtual NTSTATUS ResolveInterceptor(const void* module, | |
| 35 const char* function_name, | |
| 36 const void** address); | |
| 37 | |
| 38 // Implementation of Resolver::ResolveTarget. | |
| 39 virtual NTSTATUS ResolveTarget(const void* module, | |
| 40 const char* function_name, | |
| 41 void** address); | |
| 42 | |
| 43 // Implementation of Resolver::GetThunkSize. | |
| 44 virtual size_t GetThunkSize() const; | |
| 45 | |
| 46 protected: | |
| 47 // The unit test will use this member to allow local patch on a buffer. | |
| 48 HMODULE ntdll_base_; | |
| 49 | |
| 50 // Handle of the child process. | |
| 51 HANDLE process_; | |
| 52 | |
| 53 protected: | |
| 54 // Keeps track of a Windows 2000 resolver. | |
| 55 bool win2k_; | |
| 56 | |
| 57 private: | |
| 58 // Returns true if the code pointer by target_ corresponds to the expected | |
| 59 // type of function. Saves that code on the first part of the thunk pointed | |
| 60 // by local_thunk (should be directly accessible from the parent). | |
| 61 virtual bool IsFunctionAService(void* local_thunk) const; | |
| 62 | |
| 63 // Performs the actual patch of target_. | |
| 64 // local_thunk must be already fully initialized, and the first part must | |
| 65 // contain the original code. The real type of this buffer is ServiceFullThunk | |
| 66 // (yes, private). remote_thunk (real type ServiceFullThunk), must be | |
| 67 // allocated on the child, and will contain the thunk data, after this call. | |
| 68 // Returns the apropriate status code. | |
| 69 virtual NTSTATUS PerformPatch(void* local_thunk, void* remote_thunk); | |
| 70 | |
| 71 // Provides basically the same functionality as IsFunctionAService but it | |
| 72 // continues even if it does not recognize the function code. remote_thunk | |
| 73 // is the address of our memory on the child. | |
| 74 bool SaveOriginalFunction(void* local_thunk, void* remote_thunk); | |
| 75 | |
| 76 // true if we are allowed to patch already-patched functions. | |
| 77 bool relaxed_; | |
| 78 ULONG relative_jump_; | |
| 79 | |
| 80 DISALLOW_COPY_AND_ASSIGN(ServiceResolverThunk); | |
| 81 }; | |
| 82 | |
| 83 // This is the concrete resolver used to perform service-call type functions | |
| 84 // inside ntdll.dll on WOW64 (32 bit ntdll on 64 bit Vista). | |
| 85 class Wow64ResolverThunk : public ServiceResolverThunk { | |
| 86 public: | |
| 87 // The service resolver needs a child process to write to. | |
| 88 Wow64ResolverThunk(HANDLE process, bool relaxed) | |
| 89 : ServiceResolverThunk(process, relaxed) {} | |
| 90 virtual ~Wow64ResolverThunk() {} | |
| 91 | |
| 92 private: | |
| 93 virtual bool IsFunctionAService(void* local_thunk) const; | |
| 94 | |
| 95 DISALLOW_COPY_AND_ASSIGN(Wow64ResolverThunk); | |
| 96 }; | |
| 97 | |
| 98 // This is the concrete resolver used to perform service-call type functions | |
| 99 // inside ntdll.dll on WOW64 for Windows 8. | |
| 100 class Wow64W8ResolverThunk : public ServiceResolverThunk { | |
| 101 public: | |
| 102 // The service resolver needs a child process to write to. | |
| 103 Wow64W8ResolverThunk(HANDLE process, bool relaxed) | |
| 104 : ServiceResolverThunk(process, relaxed) {} | |
| 105 virtual ~Wow64W8ResolverThunk() {} | |
| 106 | |
| 107 private: | |
| 108 virtual bool IsFunctionAService(void* local_thunk) const; | |
| 109 | |
| 110 DISALLOW_COPY_AND_ASSIGN(Wow64W8ResolverThunk); | |
| 111 }; | |
| 112 | |
| 113 // This is the concrete resolver used to perform service-call type functions | |
| 114 // inside ntdll.dll on Windows 2000 and XP pre SP2. | |
| 115 class Win2kResolverThunk : public ServiceResolverThunk { | |
| 116 public: | |
| 117 // The service resolver needs a child process to write to. | |
| 118 Win2kResolverThunk(HANDLE process, bool relaxed) | |
| 119 : ServiceResolverThunk(process, relaxed) { | |
| 120 win2k_ = true; | |
| 121 } | |
| 122 virtual ~Win2kResolverThunk() {} | |
| 123 | |
| 124 private: | |
| 125 virtual bool IsFunctionAService(void* local_thunk) const; | |
| 126 | |
| 127 DISALLOW_COPY_AND_ASSIGN(Win2kResolverThunk); | |
| 128 }; | |
| 129 | |
| 130 // This is the concrete resolver used to perform service-call type functions | |
| 131 // inside ntdll.dll on Windows 8. | |
| 132 class Win8ResolverThunk : public ServiceResolverThunk { | |
| 133 public: | |
| 134 // The service resolver needs a child process to write to. | |
| 135 Win8ResolverThunk(HANDLE process, bool relaxed) | |
| 136 : ServiceResolverThunk(process, relaxed) {} | |
| 137 virtual ~Win8ResolverThunk() {} | |
| 138 | |
| 139 private: | |
| 140 virtual bool IsFunctionAService(void* local_thunk) const; | |
| 141 | |
| 142 DISALLOW_COPY_AND_ASSIGN(Win8ResolverThunk); | |
| 143 }; | |
| 144 | |
| 145 } // namespace sandbox | |
| 146 | |
| 147 | |
| 148 #endif // SANDBOX_SRC_SERVICE_RESOLVER_H__ | |
| OLD | NEW |