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 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 #endif | 138 #endif |
139 | 139 |
140 /******************************************************************************* | 140 /******************************************************************************* |
141 * | 141 * |
142 * Interface | 142 * Interface |
143 * | 143 * |
144 *******************************************************************************/ | 144 *******************************************************************************/ |
145 #pragma mark - | 145 #pragma mark - |
146 #pragma mark (Interface) | 146 #pragma mark (Interface) |
147 | 147 |
148 #if defined(__x86_64__) | 148 #if defined(__i386__) || defined(__x86_64__) |
149 mach_error_t makeIslandExecutable(void *address) { | 149 mach_error_t makeIslandExecutable(void *address) { |
150 mach_error_t err = err_none; | 150 mach_error_t err = err_none; |
151 vm_size_t pageSize; | 151 vm_size_t pageSize; |
152 host_page_size( mach_host_self(), &pageSize ); | 152 host_page_size( mach_host_self(), &pageSize ); |
153 uint64_t page = (uint64_t)address & ~(uint64_t)(pageSize-1); | 153 uintptr_t page = (uintptr_t)address & ~(uintptr_t)(pageSize-1); |
154 int e = err_none; | 154 int e = err_none; |
155 e |= mprotect((void *)page, pageSize, PROT_EXEC | PROT_READ | PROT_WRITE); | 155 e |= mprotect((void *)page, pageSize, PROT_EXEC | PROT_READ | PROT_WRITE); |
156 e |= msync((void *)page, pageSize, MS_INVALIDATE ); | 156 e |= msync((void *)page, pageSize, MS_INVALIDATE ); |
157 if (e) { | 157 if (e) { |
158 err = err_cannot_override; | 158 err = err_cannot_override; |
159 } | 159 } |
160 return err; | 160 return err; |
161 } | 161 } |
162 #endif | 162 #endif |
163 | 163 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 // Note that on i386, we do not support someone else changing the code u
nder our feet | 294 // Note that on i386, we do not support someone else changing the code u
nder our feet |
295 if ( !err ) { | 295 if ( !err ) { |
296 if( reentryIsland ) | 296 if( reentryIsland ) |
297 err = setBranchIslandTarget_i386( reentryIsland, | 297 err = setBranchIslandTarget_i386( reentryIsland, |
298
(void*) ((char *)originalFunctionPtr+eatenCount), originalInstructions ); | 298
(void*) ((char *)originalFunctionPtr+eatenCount), originalInstructions ); |
299 if ( !err ) | 299 if ( !err ) |
300 atomic_mov64((uint64_t *)originalFunctionPtr, jumpRelati
veInstruction); | 300 atomic_mov64((uint64_t *)originalFunctionPtr, jumpRelati
veInstruction); |
301 } | 301 } |
302 #endif | 302 #endif |
303 | 303 |
| 304 #if defined(__i386__) || defined(__x86_64__) |
| 305 if ( !err ) |
| 306 err = makeIslandExecutable( escapeIsland ); |
| 307 if ( !err && reentryIsland ) |
| 308 err = makeIslandExecutable( reentryIsland ); |
| 309 #endif |
| 310 |
304 // Clean up on error. | 311 // Clean up on error. |
305 if( err ) { | 312 if( err ) { |
306 if( reentryIsland ) | 313 if( reentryIsland ) |
307 freeBranchIsland( reentryIsland ); | 314 freeBranchIsland( reentryIsland ); |
308 if( escapeIsland ) | 315 if( escapeIsland ) |
309 freeBranchIsland( escapeIsland ); | 316 freeBranchIsland( escapeIsland ); |
310 } | 317 } |
311 | 318 |
312 #if defined(__x86_64__) | |
313 err = makeIslandExecutable(escapeIsland); | |
314 err = makeIslandExecutable(reentryIsland); | |
315 #endif | |
316 | |
317 return err; | 319 return err; |
318 } | 320 } |
319 | 321 |
320 /******************************************************************************* | 322 /******************************************************************************* |
321 * | 323 * |
322 * Implementation | 324 * Implementation |
323 * | 325 * |
324 *******************************************************************************/ | 326 *******************************************************************************/ |
325 #pragma mark - | 327 #pragma mark - |
326 #pragma mark (Implementation) | 328 #pragma mark (Implementation) |
(...skipping 21 matching lines...) Expand all Loading... |
348 | 350 |
349 if( allocateHigh ) { | 351 if( allocateHigh ) { |
350 vm_size_t pageSize; | 352 vm_size_t pageSize; |
351 err = host_page_size( mach_host_self(), &pageSize ); | 353 err = host_page_size( mach_host_self(), &pageSize ); |
352 if( !err ) { | 354 if( !err ) { |
353 assert( sizeof( BranchIsland ) <= pageSize ); | 355 assert( sizeof( BranchIsland ) <= pageSize ); |
354 #if defined(__x86_64__) | 356 #if defined(__x86_64__) |
355 vm_address_t first = (uint64_t)originalFunctionAddress &
~(uint64_t)(((uint64_t)1 << 31) - 1) | ((uint64_t)1 << 31); // start in the mid
dle of the page? | 357 vm_address_t first = (uint64_t)originalFunctionAddress &
~(uint64_t)(((uint64_t)1 << 31) - 1) | ((uint64_t)1 << 31); // start in the mid
dle of the page? |
356 vm_address_t last = 0x0; | 358 vm_address_t last = 0x0; |
357 #else | 359 #else |
358 » » » vm_address_t first = 0xfeffffff; | 360 » » » vm_address_t first = 0xffc00000; |
359 » » » vm_address_t last = 0xfe000000 + pageSize; | 361 » » » vm_address_t last = 0xfffe0000; |
360 #endif | 362 #endif |
361 | 363 |
362 vm_address_t page = first; | 364 vm_address_t page = first; |
363 int allocated = 0; | 365 int allocated = 0; |
364 vm_map_t task_self = mach_task_self(); | 366 vm_map_t task_self = mach_task_self(); |
365 | 367 |
366 while( !err && !allocated && page != last ) { | 368 while( !err && !allocated && page != last ) { |
367 | 369 |
368 err = vm_allocate( task_self, &page, pageSize, 0
); | 370 err = vm_allocate( task_self, &page, pageSize, 0
); |
369 if( err == err_none ) | 371 if( err == err_none ) |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 ); | 675 ); |
674 #elif defined(__x86_64__) | 676 #elif defined(__x86_64__) |
675 void atomic_mov64( | 677 void atomic_mov64( |
676 uint64_t *targetAddress, | 678 uint64_t *targetAddress, |
677 uint64_t value ) | 679 uint64_t value ) |
678 { | 680 { |
679 *targetAddress = value; | 681 *targetAddress = value; |
680 } | 682 } |
681 #endif | 683 #endif |
682 #endif | 684 #endif |
OLD | NEW |