• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2006-2010 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 #include "sandbox/win/src/resolver.h"
6 
7 #include "sandbox/win/src/sandbox_nt_util.h"
8 
9 namespace {
10 
11 const BYTE kPushRax = 0x50;
12 const USHORT kMovRax = 0xB848;
13 const ULONG kMovRspRax = 0x24048948;
14 const BYTE kRetNp = 0xC3;
15 
16 #pragma pack(push, 1)
17 struct InternalThunk {
18   // This struct contains roughly the following code:
19   // 00 50                    push  rax
20   // 01 48b8f0debc9a78563412  mov   rax,123456789ABCDEF0h
21   // 0b 48890424              mov   qword ptr [rsp],rax
22   // 0f c3                    ret
23   //
24   // The code modifies rax, but that should not be an issue for the common
25   // calling conventions.
26 
InternalThunk__anon26de77960111::InternalThunk27   InternalThunk() {
28     push_rax = kPushRax;
29     mov_rax = kMovRax;
30     interceptor_function = 0;
31     mov_rsp_rax = kMovRspRax;
32     ret = kRetNp;
33   };
34   BYTE push_rax;        // = 50
35   USHORT mov_rax;       // = 48 B8
36   ULONG_PTR interceptor_function;
37   ULONG mov_rsp_rax;    // = 48 89 04 24
38   BYTE ret;             // = C3
39 };
40 #pragma pack(pop)
41 
42 } // namespace.
43 
44 namespace sandbox {
45 
GetInternalThunkSize() const46 size_t ResolverThunk::GetInternalThunkSize() const {
47   return sizeof(InternalThunk);
48 }
49 
SetInternalThunk(void * storage,size_t storage_bytes,const void * original_function,const void * interceptor)50 bool ResolverThunk::SetInternalThunk(void* storage, size_t storage_bytes,
51                                      const void* original_function,
52                                      const void* interceptor) {
53   if (storage_bytes < sizeof(InternalThunk))
54     return false;
55 
56   InternalThunk* thunk = new(storage, NT_PLACE) InternalThunk;
57   thunk->interceptor_function = reinterpret_cast<ULONG_PTR>(interceptor);
58 
59   return true;
60 }
61 
ResolveTarget(const void * module,const char * function_name,void ** address)62 NTSTATUS ResolverThunk::ResolveTarget(const void* module,
63                                       const char* function_name,
64                                       void** address) {
65   // We don't support sidestep & co.
66   return STATUS_NOT_IMPLEMENTED;
67 }
68 
69 }  // namespace sandbox
70