diff options
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | subhook.c | 2 | ||||
-rw-r--r-- | subhook.h | 5 | ||||
-rw-r--r-- | subhook_macos.c | 75 | ||||
-rw-r--r-- | subhook_unix.c | 20 | ||||
-rw-r--r-- | tests/test.c | 2 | ||||
-rw-r--r-- | tests/test.cpp | 2 |
7 files changed, 24 insertions, 84 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index afc4c11..84999c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,8 +37,6 @@ set(SUBHOOK_HEADERS subhook.h) set(SUBHOOK_SOURCES subhook.c subhook_private.h subhook_x86.c) if(WIN32) list(APPEND SUBHOOK_SOURCES subhook_windows.c) -elseif(APPLE) - list(APPEND SUBHOOK_SOURCES subhook_macos.c) elseif(UNIX) list(APPEND SUBHOOK_SOURCES subhook_unix.c) endif() @@ -68,8 +68,6 @@ SUBHOOK_EXPORT void SUBHOOK_API subhook_set_disasm_handler( #include "subhook_windows.c" #elif defined SUBHOOK_UNIX #include "subhook_unix.c" -#elif defined SUBHOOK_APPLE - #include "subhook_macos.c" #endif #if defined SUBHOOK_X86 || defined SUBHOOK_X86_64 @@ -46,6 +46,7 @@ #define SUBHOOK_UNIX #elif defined __APPLE__ #define SUBHOOK_APPLE + #define SUBHOOK_UNIX #else #error Unsupported operating system #endif @@ -67,7 +68,7 @@ #if defined SUBHOOK_X86 #if defined SUBHOOK_WINDOWS #define SUBHOOK_API __cdecl - #elif defined SUBHOOK_UNIX || defined SUBHOOK_APPLE + #elif defined SUBHOOK_UNIX #define SUBHOOK_API __attribute__((cdecl)) #endif #else @@ -82,7 +83,7 @@ #else #define SUBHOOK_EXPORT SUBHOOK_EXTERN __declspec(dllimport) #endif - #elif defined SUBHOOK_UNIX || defined SUBHOOK_APPLE + #elif defined SUBHOOK_UNIX #if defined SUBHOOK_IMPLEMENTATION #define SUBHOOK_EXPORT SUBHOOK_EXTERN __attribute__((visibility("default"))) #else diff --git a/subhook_macos.c b/subhook_macos.c deleted file mode 100644 index 866edf5..0000000 --- a/subhook_macos.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2012-2018 Zeex - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <stddef.h> -#include <unistd.h> -#include <sys/mman.h> -#include <mach/mach.h> - -#define SUBHOOK_CODE_PROTECT_FLAGS (PROT_READ | PROT_WRITE | PROT_EXEC) - -int subhook_unprotect(void *address, size_t size) { - long pagesize; - - pagesize = sysconf(_SC_PAGESIZE); - address = (void *)((long)address & ~(pagesize - 1)); - int error = mprotect(address, size, SUBHOOK_CODE_PROTECT_FLAGS); - - if (-1 == error) - { - // If mprotect fails, try to use VM_PROT_COPY with vm_protect - kern_return_t kret = vm_protect(mach_task_self(), (unsigned long)address, size, 0, SUBHOOK_CODE_PROTECT_FLAGS | VM_PROT_COPY); - if (kret != KERN_SUCCESS) - { - error = -1; - } - error = 0; - } - - return error; -} - -void *subhook_alloc_code(size_t size) { - void *address; - - address = mmap(NULL, - size, - SUBHOOK_CODE_PROTECT_FLAGS, - #if defined MAP_32BIT && !defined __APPLE__ - MAP_32BIT | - #endif - MAP_PRIVATE | MAP_ANONYMOUS, - -1, - 0); - return address == MAP_FAILED ? NULL : address; -} - -int subhook_free_code(void *address, size_t size) { - if (address == NULL) { - return 0; - } - return munmap(address, size); -} diff --git a/subhook_unix.c b/subhook_unix.c index 6a5410b..4d9c03a 100644 --- a/subhook_unix.c +++ b/subhook_unix.c @@ -27,6 +27,11 @@ #include <stddef.h> #include <unistd.h> #include <sys/mman.h> +#include "subhook.h" +#ifdef SUBHOOK_APPLE +#include <mach/mach.h> +#endif + #define SUBHOOK_CODE_PROTECT_FLAGS (PROT_READ | PROT_WRITE | PROT_EXEC) @@ -36,7 +41,20 @@ int subhook_unprotect(void *address, size_t size) { pagesize = sysconf(_SC_PAGESIZE); address = (void *)((long)address & ~(pagesize - 1)); - return mprotect(address, size, SUBHOOK_CODE_PROTECT_FLAGS); + int error = mprotect(address, size, SUBHOOK_CODE_PROTECT_FLAGS); +#ifdef SUBHOOK_APPLE + if (-1 == error) + { + /* If mprotect fails, try to use VM_PROT_COPY with vm_protect. */ + kern_return_t kret = vm_protect(mach_task_self(), (unsigned long)address, size, 0, SUBHOOK_CODE_PROTECT_FLAGS | VM_PROT_COPY); + if (kret != KERN_SUCCESS) + { + error = -1; + } + error = 0; + } +#endif + return error; } void *subhook_alloc_code(size_t size) { diff --git a/tests/test.c b/tests/test.c index 5526653..d8b39fd 100644 --- a/tests/test.c +++ b/tests/test.c @@ -8,7 +8,7 @@ typedef void (*foo_func_t)(void); #ifdef SUBHOOK_X86 #if defined SUBHOOK_WINDOWS #define FOO_CALL __cdecl - #elif defined SUBHOOK_UNIX || defined SUBHOOK_APPLE + #elif defined SUBHOOK_UNIX #define FOO_CALL __attribute__((cdecl)) #endif #endif diff --git a/tests/test.cpp b/tests/test.cpp index 30b7ca4..7ba167a 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -7,7 +7,7 @@ typedef void (*foo_func_t)(); #ifdef SUBHOOK_X86 #if defined SUBHOOK_WINDOWS #define FOO_CALL __cdecl - #elif defined SUBHOOK_UNIX || defined SUBHOOK_APPLE + #elif defined SUBHOOK_UNIX #define FOO_CALL __attribute__((cdecl)) #endif #endif |