OLD | NEW |
---|---|
1 /******************************************************************************* | 1 /******************************************************************************* |
2 mach_override.c | 2 mach_override.c |
3 Copyright (c) 2003-2009 Jonathan 'Wolf' Rentzsch: <http://rentzs ch.com> | 3 Copyright (c) 2003-2009 Jonathan 'Wolf' Rentzsch: <http://rentzs ch.com> |
4 Some rights reserved: <http://opensource.org/licenses/mit-licens e.php> | 4 Some rights reserved: <http://opensource.org/licenses/mit-licens e.php> |
5 | 5 |
6 ************************************************************************ ***/ | 6 ************************************************************************ ***/ |
7 | 7 |
8 #include "mach_override.h" | 8 #include "mach_override.h" |
9 | 9 |
10 #include <mach-o/dyld.h> | 10 #include <mach-o/dyld.h> |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
149 * | 149 * |
150 *******************************************************************************/ | 150 *******************************************************************************/ |
151 #pragma mark - | 151 #pragma mark - |
152 #pragma mark (Interface) | 152 #pragma mark (Interface) |
153 | 153 |
154 #if defined(__i386__) || defined(__x86_64__) | 154 #if defined(__i386__) || defined(__x86_64__) |
155 mach_error_t makeIslandExecutable(void *address) { | 155 mach_error_t makeIslandExecutable(void *address) { |
156 mach_error_t err = err_none; | 156 mach_error_t err = err_none; |
157 uintptr_t page = (uintptr_t)address & ~(uintptr_t)(kPageSize-1); | 157 uintptr_t page = (uintptr_t)address & ~(uintptr_t)(kPageSize-1); |
158 int e = err_none; | 158 int e = err_none; |
159 e |= mprotect((void *)page, kPageSize, PROT_EXEC | PROT_READ | PROT_WRITE); | 159 e |= mprotect((void *)page, kPageSize, PROT_EXEC | PROT_READ); |
160 e |= msync((void *)page, kPageSize, MS_INVALIDATE ); | 160 e |= msync((void *)page, kPageSize, MS_INVALIDATE ); |
161 if (e) { | 161 if (e) { |
162 err = err_cannot_override; | 162 err = err_cannot_override; |
163 } | 163 } |
164 return err; | 164 return err; |
165 } | 165 } |
166 #endif | 166 #endif |
167 | 167 |
168 mach_error_t | 168 mach_error_t |
169 mach_override_ptr( | 169 mach_override_ptr( |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
328 (void*) ((char *)originalFunctionPtr+eatenCount), originalInstructions ); | 328 (void*) ((char *)originalFunctionPtr+eatenCount), originalInstructions ); |
329 // try making islands executable before planting the jmp | 329 // try making islands executable before planting the jmp |
330 #if defined(__x86_64__) || defined(__i386__) | 330 #if defined(__x86_64__) || defined(__i386__) |
331 if( !err ) | 331 if( !err ) |
332 err = makeIslandExecutable(escapeIsland); | 332 err = makeIslandExecutable(escapeIsland); |
333 if( !err && reentryIsland ) | 333 if( !err && reentryIsland ) |
334 err = makeIslandExecutable(reentryIsland); | 334 err = makeIslandExecutable(reentryIsland); |
335 #endif | 335 #endif |
336 if ( !err ) | 336 if ( !err ) |
337 atomic_mov64((uint64_t *)originalFunctionPtr, jumpRelati veInstruction); | 337 atomic_mov64((uint64_t *)originalFunctionPtr, jumpRelati veInstruction); |
338 | |
339 err = vm_protect( mach_task_self(), | |
340 (vm_address_t) originalFunctionPtr, 8, false, | |
Mark Mentovai
2013/07/30 21:02:27
The indentation here is a mess.
| |
341 (VM_PROT_READ | VM_PROT_EXECUTE) ); | |
338 } | 342 } |
339 #endif | 343 #endif |
340 | 344 |
341 // Clean up on error. | 345 // Clean up on error. |
342 if( err ) { | 346 if( err ) { |
343 if( reentryIsland ) | 347 if( reentryIsland ) |
344 freeBranchIsland( reentryIsland ); | 348 freeBranchIsland( reentryIsland ); |
345 if( escapeIsland ) | 349 if( escapeIsland ) |
346 freeBranchIsland( escapeIsland ); | 350 freeBranchIsland( escapeIsland ); |
347 } | 351 } |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
713 ); | 717 ); |
714 #elif defined(__x86_64__) | 718 #elif defined(__x86_64__) |
715 void atomic_mov64( | 719 void atomic_mov64( |
716 uint64_t *targetAddress, | 720 uint64_t *targetAddress, |
717 uint64_t value ) | 721 uint64_t value ) |
718 { | 722 { |
719 *targetAddress = value; | 723 *targetAddress = value; |
720 } | 724 } |
721 #endif | 725 #endif |
722 #endif | 726 #endif |
OLD | NEW |