OLD | NEW |
---|---|
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 // This file contains unit tests for ServiceResolverThunk. | 5 // This file contains unit tests for ServiceResolverThunk. |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/win/windows_version.h" | 9 #include "base/win/windows_version.h" |
10 #include "sandbox/win/src/resolver.h" | 10 #include "sandbox/win/src/resolver.h" |
(...skipping 26 matching lines...) Expand all Loading... | |
37 const void* interceptor_entry_point, | 37 const void* interceptor_entry_point, |
38 void* thunk_storage, | 38 void* thunk_storage, |
39 size_t storage_bytes) { | 39 size_t storage_bytes) { |
40 NTSTATUS ret = STATUS_SUCCESS; | 40 NTSTATUS ret = STATUS_SUCCESS; |
41 ret = ResolverThunk::Init(target_module, interceptor_module, target_name, | 41 ret = ResolverThunk::Init(target_module, interceptor_module, target_name, |
42 interceptor_name, interceptor_entry_point, | 42 interceptor_name, interceptor_entry_point, |
43 thunk_storage, storage_bytes); | 43 thunk_storage, storage_bytes); |
44 EXPECT_EQ(STATUS_SUCCESS, ret); | 44 EXPECT_EQ(STATUS_SUCCESS, ret); |
45 | 45 |
46 target_ = fake_target_; | 46 target_ = fake_target_; |
47 ntdll_base_ = ::GetModuleHandle(L"ntdll.dll"); | 47 |
48 return ret; | 48 return ret; |
49 }; | 49 }; |
50 | 50 |
51 private: | 51 private: |
52 // Holds the address of the fake target. | 52 // Holds the address of the fake target. |
53 void* fake_target_; | 53 void* fake_target_; |
54 | 54 |
55 DISALLOW_COPY_AND_ASSIGN(ResolverThunkTest); | 55 DISALLOW_COPY_AND_ASSIGN(ResolverThunkTest); |
56 }; | 56 }; |
57 | 57 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
101 memcpy(service, target, sizeof(service)); | 101 memcpy(service, target, sizeof(service)); |
102 | 102 |
103 static_cast<WinXpResolverTest*>(resolver)->set_target(service); | 103 static_cast<WinXpResolverTest*>(resolver)->set_target(service); |
104 | 104 |
105 // Any pointer will do as an interception_entry_point | 105 // Any pointer will do as an interception_entry_point |
106 void* function_entry = resolver; | 106 void* function_entry = resolver; |
107 size_t thunk_size = resolver->GetThunkSize(); | 107 size_t thunk_size = resolver->GetThunkSize(); |
108 scoped_ptr<char[]> thunk(new char[thunk_size]); | 108 scoped_ptr<char[]> thunk(new char[thunk_size]); |
109 size_t used; | 109 size_t used; |
110 | 110 |
111 resolver->AllowLocalPatches(); | |
112 | |
111 NTSTATUS ret = resolver->Setup(ntdll_base, NULL, function, NULL, | 113 NTSTATUS ret = resolver->Setup(ntdll_base, NULL, function, NULL, |
112 function_entry, thunk.get(), thunk_size, | 114 function_entry, thunk.get(), thunk_size, |
113 &used); | 115 &used); |
114 if (NT_SUCCESS(ret)) { | 116 if (NT_SUCCESS(ret)) { |
115 EXPECT_EQ(thunk_size, used); | 117 EXPECT_EQ(thunk_size, used); |
116 EXPECT_NE(0, memcmp(service, target, sizeof(service))); | 118 EXPECT_NE(0, memcmp(service, target, sizeof(service))); |
117 EXPECT_NE(kJump32, service[0]); | 119 EXPECT_NE(kJump32, service[0]); |
118 | 120 |
119 if (relaxed) { | 121 if (relaxed) { |
120 // It's already patched, let's patch again, and simulate a direct patch. | 122 // It's already patched, let's patch again, and simulate a direct patch. |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
217 EXPECT_EQ(STATUS_SUCCESS, ret) << "NtCreateMutant, last error: " << | 219 EXPECT_EQ(STATUS_SUCCESS, ret) << "NtCreateMutant, last error: " << |
218 ::GetLastError(); | 220 ::GetLastError(); |
219 | 221 |
220 ret = PatchNtdllWithResolver("NtMapViewOfSection", true, resolver); | 222 ret = PatchNtdllWithResolver("NtMapViewOfSection", true, resolver); |
221 EXPECT_EQ(STATUS_SUCCESS, ret) << "NtMapViewOfSection, last error: " << | 223 EXPECT_EQ(STATUS_SUCCESS, ret) << "NtMapViewOfSection, last error: " << |
222 ::GetLastError(); | 224 ::GetLastError(); |
223 delete resolver; | 225 delete resolver; |
224 #endif | 226 #endif |
225 } | 227 } |
226 | 228 |
229 TEST(ServiceResolverTest, LocalPatchesAllowed) { | |
230 sandbox::ServiceResolverThunk* resolver = GetTestResolver(true); | |
231 | |
232 HMODULE ntdll_base = ::GetModuleHandle(L"ntdll.dll"); | |
233 ASSERT_TRUE(NULL != ntdll_base); | |
234 | |
235 const char kFunctionName[] = "NtClose"; | |
236 | |
237 void* target = ::GetProcAddress(ntdll_base, kFunctionName); | |
238 ASSERT_TRUE(NULL != target); | |
239 | |
240 BYTE service[50]; | |
241 memcpy(service, target, sizeof(service)); | |
242 static_cast<WinXpResolverTest*>(resolver)->set_target(service); | |
243 | |
244 // Any pointer will do as an interception_entry_point | |
245 void* function_entry = resolver; | |
246 size_t thunk_size = resolver->GetThunkSize(); | |
247 scoped_ptr<char[]> thunk(new char[thunk_size]); | |
248 size_t used; | |
249 | |
250 NTSTATUS ret = STATUS_UNSUCCESSFUL; | |
251 | |
252 // First try patching without having allowed local patches. | |
253 ret = resolver->Setup(ntdll_base, NULL, kFunctionName, NULL, | |
254 function_entry, thunk.get(), thunk_size, | |
255 &used); | |
256 EXPECT_FALSE(NT_SUCCESS(ret)); | |
257 | |
258 // Now allow local patches and check that things work. | |
259 resolver->AllowLocalPatches(); | |
260 ret = resolver->Setup(ntdll_base, NULL, kFunctionName, NULL, | |
261 function_entry, thunk.get(), thunk_size, | |
262 &used); | |
cpu_(ooo_6.6-7.5)
2013/11/29 18:30:07
indenting
robertshield
2013/11/29 19:29:08
Done.
| |
263 EXPECT_EQ(STATUS_SUCCESS, ret); | |
264 } | |
265 | |
227 } // namespace | 266 } // namespace |
OLD | NEW |