From 0932d69c320e786672361ab53825ba8f4245e9d3 Mon Sep 17 00:00:00 2001 From: "jmpews(AKA.zz)" Date: Fri, 14 Apr 2023 15:02:06 +0800 Subject: [PATCH] Update backend of xnu kernel, and macho_ctx_kit --- CMakeLists.txt | 45 ++---- builtin-plugin/SymbolResolver/CMakeLists.txt | 58 ++++---- .../macho/dobby_symbol_resolver.cc | 5 +- .../SymbolResolver/macho/macho_ctx.cc | 53 ++++--- .../SymbolResolver/macho/macho_ctx.h | 8 +- cmake/Util.cmake | 34 +++-- cmake/build_environment_check.cmake | 2 +- external/logging/CMakeLists.txt | 19 +-- external/logging/kernel_logging.cc | 28 ---- external/logging/logging/logging.h | 6 +- external/logging/logging_kern.cc | 0 .../ExecMemory/code-patch-tool-darwin.cc | 57 -------- .../Darwin/ProcessRuntimeUtility.cc | 133 ------------------ .../PlatformUtil/ProcessRuntimeUtility.h | 25 ---- .../UnifiedInterface/exec_mem_placeholder.asm | 10 -- .../UnifiedInterface/platform-darwin.cc | 106 -------------- .../KernelMode/UnifiedInterface/platform.h | 26 ---- .../UnifiedInterface/platform-posix.cc | 2 +- .../UnifiedInterface/platform-windows.cc | 2 +- .../platform.h | 3 +- .../PlatformUtil/ProcessRuntimeUtility.h | 2 +- source/dobby/dobby_internal.h | 2 +- source/dobby/kernel_mode_header.h | 55 +------- source/dobby/platform_features.h | 5 +- 24 files changed, 123 insertions(+), 563 deletions(-) delete mode 100644 external/logging/kernel_logging.cc create mode 100644 external/logging/logging_kern.cc delete mode 100644 source/Backend/KernelMode/PlatformUtil/ProcessRuntimeUtility.h delete mode 100644 source/Backend/KernelMode/UnifiedInterface/exec_mem_placeholder.asm delete mode 100644 source/Backend/KernelMode/UnifiedInterface/platform.h rename source/{Backend/UserMode/UnifiedInterface => PlatformUnifiedInterface}/platform.h (97%) rename source/{Backend/UserMode => }/PlatformUtil/ProcessRuntimeUtility.h (92%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e6cbd4a..6907a147 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,11 +90,7 @@ include_directories( ./builtin-plugin ) -if (SYSTEM.Darwin AND DOBBY_BUILD_KERNEL_MODE) - include_directories( - source/Backend/KernelMode - ) -else () +if (SYSTEM.Darwin AND (NOT DOBBY_BUILD_KERNEL_MODE)) include_directories( source/Backend/UserMode ) @@ -177,53 +173,32 @@ set(dobby.SOURCE_FILE_LIST ${dobby.SOURCE_FILE_LIST} source/InterceptEntry.cpp ) -if (SYSTEM.Darwin AND DOBBY_BUILD_KERNEL_MODE) - set(dobby.SOURCE_FILE_LIST ${dobby.SOURCE_FILE_LIST} - # platform util - source/Backend/KernelMode/PlatformUtil/Darwin/ProcessRuntimeUtility.cc - - # kernel mode - platform interface - source/Backend/KernelMode/UnifiedInterface/platform-darwin.cc - source/Backend/KernelMode/UnifiedInterface/exec_mem_placeholder.asm - # kernel mode - executable memory - source/Backend/KernelMode/ExecMemory/code-patch-tool-darwin.cc - source/Backend/KernelMode/ExecMemory/clear-cache-tool-all.c - ) -elseif (SYSTEM.Darwin) +if (SYSTEM.Darwin AND NOT DOBBY_BUILD_KERNEL_MODE) set(dobby.SOURCE_FILE_LIST ${dobby.SOURCE_FILE_LIST} - # platform util source/Backend/UserMode/PlatformUtil/Darwin/ProcessRuntimeUtility.cc - # user mode - platform interface source/Backend/UserMode/UnifiedInterface/platform-posix.cc - # user mode - executable memory source/Backend/UserMode/ExecMemory/code-patch-tool-darwin.cc source/Backend/UserMode/ExecMemory/clear-cache-tool-all.c ) elseif (SYSTEM.Linux OR SYSTEM.Android) set(dobby.SOURCE_FILE_LIST ${dobby.SOURCE_FILE_LIST} - # platform util source/Backend/UserMode/PlatformUtil/Linux/ProcessRuntimeUtility.cc - # user mode - platform interface source/Backend/UserMode/UnifiedInterface/platform-posix.cc - # user mode - executable memory source/Backend/UserMode/ExecMemory/code-patch-tool-posix.cc source/Backend/UserMode/ExecMemory/clear-cache-tool-all.c ) elseif (SYSTEM.Windows) set(dobby.SOURCE_FILE_LIST ${dobby.SOURCE_FILE_LIST} - # platform util source/Backend/UserMode/PlatformUtil/Windows/ProcessRuntimeUtility.cc - # user mode - platform interface source/Backend/UserMode/UnifiedInterface/platform-windows.cc - # user mode - executable memory source/Backend/UserMode/ExecMemory/code-patch-tool-windows.cc source/Backend/UserMode/ExecMemory/clear-cache-tool-all.c ) @@ -314,14 +289,20 @@ message(STATUS "[Dobby] ${DOBBY_BUILD_VERSION}") # --- -add_library(dobby SHARED +set(SOURCE_FILE_LIST ${dobby.HEADER_FILE_LIST} ${dobby.SOURCE_FILE_LIST} ${logging.SOURCE_FILE_LIST} - ${misc_helper.SOURCE_FILE_LIST} ${dobby.plugin.SOURCE_FILE_LIST} ) +get_absolute_path_list(SOURCE_FILE_LIST SOURCE_FILE_LIST_) +set(SOURCE_FILE_LIST ${SOURCE_FILE_LIST_}) + +add_library(dobby SHARED + ${SOURCE_FILE_LIST} + ) + target_include_directories(dobby PUBLIC include ) @@ -329,11 +310,7 @@ target_include_directories(dobby PUBLIC # --- add_library(dobby_static STATIC - ${dobby.HEADER_FILE_LIST} - ${dobby.SOURCE_FILE_LIST} - ${logging.SOURCE_FILE_LIST} - ${misc_helper.SOURCE_FILE_LIST} - ${dobby.plugin.SOURCE_FILE_LIST} + ${SOURCE_FILE_LIST} ) target_include_directories(dobby_static PUBLIC diff --git a/builtin-plugin/SymbolResolver/CMakeLists.txt b/builtin-plugin/SymbolResolver/CMakeLists.txt index 7dba9e90..65285920 100644 --- a/builtin-plugin/SymbolResolver/CMakeLists.txt +++ b/builtin-plugin/SymbolResolver/CMakeLists.txt @@ -1,57 +1,55 @@ set(SOURCE_FILE_LIST) +include_directories( + . +) + if (NOT DEFINED DOBBY_DIR) message(FATAL_ERROR "DOBBY_DIR must be set!") endif () -if (SYSTEM.Darwin AND (NOT DOBBY_BUILD_KERNEL_MODE)) - set(SOURCE_FILE_LIST ${SOURCE_FILE_LIST} +if (SYSTEM.Darwin) + add_library(macho_ctx_kit + ${CMAKE_CURRENT_SOURCE_DIR}/macho/macho_ctx.h ${CMAKE_CURRENT_SOURCE_DIR}/macho/macho_ctx.cc - ${CMAKE_CURRENT_SOURCE_DIR}/macho/shared_cache_ctx.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/macho/dobby_symbol_resolver.cc - ${CMAKE_CURRENT_SOURCE_DIR}/macho/macho_file_symbol_resolver.cpp + ) - ${DOBBY_DIR}/source/Backend/UserMode/PlatformUtil/Darwin/ProcessRuntimeUtility.cc + add_library(shared_cache_ctx_kit + ${CMAKE_CURRENT_SOURCE_DIR}/macho/shared_cache_ctx.h + ${CMAKE_CURRENT_SOURCE_DIR}/macho/shared_cache_ctx.cpp ) -endif () -if (SYSTEM.Darwin AND DOBBY_BUILD_KERNEL_MODE) - set(SOURCE_FILE_LIST ${SOURCE_FILE_LIST} - ${CMAKE_CURRENT_SOURCE_DIR}/macho/dobby_symbol_resolver.cc - ${DOBBY_DIR}/source/Backend/KernelMode/PlatformUtil/Darwin/ProcessRuntimeUtility.cc + set(SOURCE_FILE_LIST ${SOURCE_FILE_LIST} + macho/macho_ctx.cc + macho/dobby_symbol_resolver.cc ) -endif () -if (SYSTEM.Linux OR SYSTEM.Android) + + if (NOT DOBBY_BUILD_KERNEL_MODE) + set(SOURCE_FILE_LIST ${SOURCE_FILE_LIST} + macho/macho_file_symbol_resolver.cpp + macho/shared_cache_ctx.cpp + ${DOBBY_DIR}/source/Backend/UserMode/PlatformUtil/Darwin/ProcessRuntimeUtility.cc + ) + endif () +elseif (SYSTEM.Linux OR SYSTEM.Android) set(SOURCE_FILE_LIST ${SOURCE_FILE_LIST} - ${CMAKE_CURRENT_SOURCE_DIR}/elf/dobby_symbol_resolver.cc + elf/dobby_symbol_resolver.cc ${DOBBY_DIR}/source/Backend/UserMode/PlatformUtil/Linux/ProcessRuntimeUtility.cc ) -endif () -if (SYSTEM.Windows) +elseif (SYSTEM.Windows) set(SOURCE_FILE_LIST ${SOURCE_FILE_LIST} - ${CMAKE_CURRENT_SOURCE_DIR}/pe/dobby_symbol_resolver.cc + pe/dobby_symbol_resolver.cc ${DOBBY_DIR}/source/Backend/UserMode/PlatformUtil/Windows/ProcessRuntimeUtility.cc ) endif () -add_library(macho_ctx_kit - ${CMAKE_CURRENT_SOURCE_DIR}/macho/macho_ctx.h - ${CMAKE_CURRENT_SOURCE_DIR}/macho/macho_ctx.cc - ) - -add_library(shared_cache_ctx_kit - ${CMAKE_CURRENT_SOURCE_DIR}/macho/shared_cache_ctx.h - ${CMAKE_CURRENT_SOURCE_DIR}/macho/shared_cache_ctx.cpp - ) +get_absolute_path_list(SOURCE_FILE_LIST SOURCE_FILE_LIST_) +set(SOURCE_FILE_LIST ${SOURCE_FILE_LIST_}) add_library(dobby_symbol_resolver ${SOURCE_FILE_LIST} ) -include_directories( - . -) - diff --git a/builtin-plugin/SymbolResolver/macho/dobby_symbol_resolver.cc b/builtin-plugin/SymbolResolver/macho/dobby_symbol_resolver.cc index a983709f..bd5c9933 100644 --- a/builtin-plugin/SymbolResolver/macho/dobby_symbol_resolver.cc +++ b/builtin-plugin/SymbolResolver/macho/dobby_symbol_resolver.cc @@ -12,12 +12,9 @@ #include "macho_ctx.h" #include "shared_cache_ctx.h" -#if defined(BUILDING_KERNEL) -#else - +#if !defined(BUILDING_KERNEL) #include #include - #endif #undef LOG_TAG diff --git a/builtin-plugin/SymbolResolver/macho/macho_ctx.cc b/builtin-plugin/SymbolResolver/macho/macho_ctx.cc index 3833278e..92188ead 100644 --- a/builtin-plugin/SymbolResolver/macho/macho_ctx.cc +++ b/builtin-plugin/SymbolResolver/macho/macho_ctx.cc @@ -8,6 +8,29 @@ #define ASSERT(x) +uintptr_t macho_iterate_symbol_table(char *symbol_name_pattern, nlist_t *symtab, uint32_t symtab_count, char *strtab) { + for (uint32_t i = 0; i < symtab_count; i++) { + if (symtab[i].n_value) { + uint32_t strtab_offset = symtab[i].n_un.n_strx; + char *symbol_name = strtab + strtab_offset; +#if 0 + printf("> %s", symbol_name); +#endif + if (strcmp(symbol_name_pattern, symbol_name) == 0) { + return symtab[i].n_value; + } + if (symbol_name[0] == '_') { + if (strcmp(symbol_name_pattern, &symbol_name[1]) == 0) { + return symtab[i].n_value; + } + } + } + } + return 0; +} + +// --- + void macho_ctx_t::init(mach_header_t *header, bool is_runtime_mode) { memset(this, 0, sizeof(macho_ctx_t)); @@ -62,6 +85,15 @@ void macho_ctx_t::init(mach_header_t *header, bool is_runtime_mode) { linkedit_base = (uintptr_t)slide + linkedit_segment_vmaddr - linkedit_segment->fileoff; } + vm_region_start = segments[0]->vmaddr; + // skip __LINKEDIT + if (strcmp(segments[0]->segname, "__LINKEDIT") == 0) { + vm_region_start = segments[1]->vmaddr; + } + vm_region_end = segments[segments_count - 1]->vmaddr + segments[segments_count - 1]->vmsize; + vmaddr = vm_region_start; + vmsize = vm_region_end - vm_region_start; + this->text_seg = text_segment; this->text_exec_seg = text_exec_segment; this->data_seg = data_segment; @@ -82,27 +114,6 @@ void macho_ctx_t::init(mach_header_t *header, bool is_runtime_mode) { this->indirect_symtab = (uint32_t *)(this->linkedit_base + this->dysymtab_cmd->indirectsymoff); } -uintptr_t macho_iterate_symbol_table(char *symbol_name_pattern, nlist_t *symtab, uint32_t symtab_count, char *strtab) { - for (uint32_t i = 0; i < symtab_count; i++) { - if (symtab[i].n_value) { - uint32_t strtab_offset = symtab[i].n_un.n_strx; - char *symbol_name = strtab + strtab_offset; -#if 0 - printf("> %s", symbol_name); -#endif - if (strcmp(symbol_name_pattern, symbol_name) == 0) { - return symtab[i].n_value; - } - if (symbol_name[0] == '_') { - if (strcmp(symbol_name_pattern, &symbol_name[1]) == 0) { - return symtab[i].n_value; - } - } - } - } - return 0; -} - uintptr_t macho_ctx_t::iterate_symbol_table(const char *symbol_name_pattern) { nlist_t *symtab = this->symtab; uint32_t symtab_count = this->symtab_cmd->nsyms; diff --git a/builtin-plugin/SymbolResolver/macho/macho_ctx.h b/builtin-plugin/SymbolResolver/macho/macho_ctx.h index 73331cc5..82f41cd9 100644 --- a/builtin-plugin/SymbolResolver/macho/macho_ctx.h +++ b/builtin-plugin/SymbolResolver/macho/macho_ctx.h @@ -1,7 +1,6 @@ #pragma once -#include -#include +#include #include #include @@ -34,6 +33,11 @@ struct macho_ctx_t { mach_header_t *header; + uintptr_t vmaddr; + size_t vmsize; + uintptr_t vm_region_start; + uintptr_t vm_region_end; + uintptr_t slide; uintptr_t linkedit_base; diff --git a/cmake/Util.cmake b/cmake/Util.cmake index 6a722a20..fba658ef 100644 --- a/cmake/Util.cmake +++ b/cmake/Util.cmake @@ -1,19 +1,29 @@ # Check files list exist function(check_files_exist CHECK_FILES) - foreach(file ${CHECK_FILES}) - if(NOT EXISTS "${file}") - message(FATAL_ERROR "${file} NOT EXISTS!") - endif() - endforeach() + foreach (file ${CHECK_FILES}) + if (NOT EXISTS "${file}") + message(FATAL_ERROR "${file} NOT EXISTS!") + endif () + endforeach () endfunction(check_files_exist CHECK_FILES) # Search suffix files function(search_suffix_files suffix INPUT_VARIABLE OUTPUT_VARIABLE) - set(ResultFiles ) - foreach(filePath ${${INPUT_VARIABLE}}) - # message(STATUS "[*] searching *.${suffix} from ${filePath}") - file(GLOB files ${filePath}/*.${suffix}) - set(ResultFiles ${ResultFiles} ${files}) - endforeach() - set(${OUTPUT_VARIABLE} ${ResultFiles} PARENT_SCOPE) + set(ResultFiles) + foreach (filePath ${${INPUT_VARIABLE}}) + # message(STATUS "[*] searching *.${suffix} from ${filePath}") + file(GLOB files ${filePath}/*.${suffix}) + set(ResultFiles ${ResultFiles} ${files}) + endforeach () + set(${OUTPUT_VARIABLE} ${ResultFiles} PARENT_SCOPE) endfunction() + + +function(get_absolute_path_list input_list output_list) + set(absolute_list) + foreach (file ${${input_list}}) + get_filename_component(absolute_file ${file} ABSOLUTE) + list(APPEND absolute_list ${absolute_file}) + endforeach () + set(${output_list} ${absolute_list} PARENT_SCOPE) +endfunction() \ No newline at end of file diff --git a/cmake/build_environment_check.cmake b/cmake/build_environment_check.cmake index 9e7a67f1..790309b4 100644 --- a/cmake/build_environment_check.cmake +++ b/cmake/build_environment_check.cmake @@ -26,7 +26,7 @@ if(MSVC) endif() -if(BUILDING_SILICON) +if(DOBBY_BUILD_SILICON) set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_OSX_ARCHITECTURES}) endif() diff --git a/external/logging/CMakeLists.txt b/external/logging/CMakeLists.txt index a11dfa97..aa1a0b72 100644 --- a/external/logging/CMakeLists.txt +++ b/external/logging/CMakeLists.txt @@ -1,15 +1,18 @@ include_directories(.) -if(NOT DOBBY_BUILD_KERNEL_MODE) - set(SOURCE_FILE_LIST - ${CMAKE_CURRENT_SOURCE_DIR}/logging.cc +set(SOURCE_FILE_LIST + logging.cc ) -else() + +if (DOBBY_BUILD_KERNEL_MODE) set(SOURCE_FILE_LIST - ${CMAKE_CURRENT_SOURCE_DIR}/kernel_logging.cc + logging_kern.cc ) -endif() +endif () + +get_absolute_path_list(SOURCE_FILE_LIST SOURCE_FILE_LIST_) +set(SOURCE_FILE_LIST ${SOURCE_FILE_LIST_}) + add_library(logging ${SOURCE_FILE_LIST} - ${SOURCE_HEADER_LIST} -) \ No newline at end of file + ) \ No newline at end of file diff --git a/external/logging/kernel_logging.cc b/external/logging/kernel_logging.cc deleted file mode 100644 index 996f9f92..00000000 --- a/external/logging/kernel_logging.cc +++ /dev/null @@ -1,28 +0,0 @@ -#include "logging/logging.h" - -#include -#include "utility_macro.h" - -#if defined(BUILDING_KERNEL) -#define abort() -#else -#include -#endif - -static int _log_level = 1; -PUBLIC void log_set_level(int level) { - _log_level = level; -} - -PUBLIC int log_internal_impl(int level, const char *fmt, ...) { - if (level < _log_level) - return 0; - - va_list ap; - va_start(ap, fmt); - - vprintf(fmt, ap); - - va_end(ap); - return 0; -} diff --git a/external/logging/logging/logging.h b/external/logging/logging/logging.h index 99ec360a..d53b7ac2 100644 --- a/external/logging/logging/logging.h +++ b/external/logging/logging/logging.h @@ -23,6 +23,8 @@ typedef enum { class Logger { public: + LogLevel log_level_; + const char *log_tag_; const char *log_file_; @@ -32,10 +34,7 @@ class Logger { FILE *log_file_stream_; #endif - LogLevel log_level_; - bool enable_time_tag_; - bool enable_syslog_; static Logger *g_logger; @@ -197,7 +196,6 @@ void logger_log_impl(void *logger, LogLevel level, const char *fmt, ...); #define FATAL_LOG(fmt, ...) \ do { \ LOG(LOG_LEVEL_FATAL, "[!] [%s:%d:%s]" fmt, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \ - abort(); \ } while (0) #define UNIMPLEMENTED() FATAL_LOG("%s\n", "unimplemented code!!!") diff --git a/external/logging/logging_kern.cc b/external/logging/logging_kern.cc new file mode 100644 index 00000000..e69de29b diff --git a/source/Backend/KernelMode/ExecMemory/code-patch-tool-darwin.cc b/source/Backend/KernelMode/ExecMemory/code-patch-tool-darwin.cc index 636c413c..e69de29b 100644 --- a/source/Backend/KernelMode/ExecMemory/code-patch-tool-darwin.cc +++ b/source/Backend/KernelMode/ExecMemory/code-patch-tool-darwin.cc @@ -1,57 +0,0 @@ -#include "dobby/dobby_internal.h" - -#include "PlatformUnifiedInterface/ExecMemory/ClearCacheTool.h" - -#include -#include -#include -#include - -#undef max -#undef min -#include - -#define DobbySymbolResolverAuth(o_var, name) \ - do { \ - static void *func_ptr = nullptr; \ - if (func_ptr == nullptr) { \ - func_ptr = DobbySymbolResolver(nullptr, name); \ - if (func_ptr) { \ - func_ptr = ptrauth_strip((void *)func_ptr, ptrauth_key_asia); \ - func_ptr = ptrauth_sign_unauthenticated(func_ptr, ptrauth_key_asia, 0); \ - } \ - } \ - o_var = (typeof(o_var))func_ptr; \ - } while (0); - -#define KERN_RETURN_ERROR(kr, failure) \ - do { \ - if (kr != KERN_SUCCESS) { \ - ERROR_LOG("mach error: %d", kr); \ - return failure; \ - } \ - } while (0); - -PUBLIC int DobbyCodePatch(void *address, uint8_t *buffer, uint32_t buffer_size) { - if (address == nullptr || buffer == nullptr || buffer_size == 0) { - ERROR_LOG("invalid argument"); - return kMemoryOperationError; - } - - kern_return_t kr; - - { - paddr_t dst_paddr = pmap_kit_kvtophys(kernel_pmap, (vaddr_t)address); - paddr_t src_paddr = pmap_kit_kvtophys(kernel_pmap, (vaddr_t)buffer); - pmap_kit_bcopy_phys((addr_t)buffer, dst_paddr, buffer_size, cppvPsnk); - DEBUG_LOG("bcopy_phys: src: %p, dst: %p", src_paddr, dst_paddr); - - pmap_kit_kva_to_pte(kernel_pmap, (vaddr_t)address); - pmap_kit_set_perm(kernel_pmap, (vaddr_t)address, (vaddr_t)address + PAGE_SIZE, VM_PROT_READ | VM_PROT_EXECUTE); - - if (memcmp(address, buffer, buffer_size)) - return kMemoryOperationError; - } - - return 0; -} diff --git a/source/Backend/KernelMode/PlatformUtil/Darwin/ProcessRuntimeUtility.cc b/source/Backend/KernelMode/PlatformUtil/Darwin/ProcessRuntimeUtility.cc index 3635c7b6..e69de29b 100644 --- a/source/Backend/KernelMode/PlatformUtil/Darwin/ProcessRuntimeUtility.cc +++ b/source/Backend/KernelMode/PlatformUtil/Darwin/ProcessRuntimeUtility.cc @@ -1,133 +0,0 @@ -#include "PlatformUtil/ProcessRuntimeUtility.h" - -#include - -typedef struct _loaded_kext_summary { - char name[KMOD_MAX_NAME]; - uuid_t uuid; - uint64_t address; - uint64_t size; - uint64_t version; - uint32_t loadTag; - uint32_t flags; - uint64_t reference_list; - uint64_t text_exec_address; - size_t text_exec_size; -} OSKextLoadedKextSummary; -typedef struct _loaded_kext_summary_header { - uint32_t version; - uint32_t entry_size; - uint32_t numSummaries; - uint32_t reserved; /* explicit alignment for gdb */ - OSKextLoadedKextSummary summaries[0]; -} OSKextLoadedKextSummaryHeader; - -#undef min -#undef max -#include -#include - -#include -#if defined(__LP64__) -typedef struct mach_header_64 mach_header_t; -typedef struct segment_command_64 segment_command_t; -typedef struct section_64 section_t; -typedef struct nlist_64 nlist_t; -#define LC_SEGMENT_ARCH_DEPENDENT LC_SEGMENT_64 -#else -typedef struct mach_header mach_header_t; -typedef struct segment_command segment_command_t; -typedef struct section section_t; -typedef struct nlist nlist_t; -#define LC_SEGMENT_ARCH_DEPENDENT LC_SEGMENT -#endif - -// Generate the name for an offset. -#define KERN_PARAM_OFFSET(type_, member_) __##type_##__##member_##__offset_ -#define KERN_STRUCT_OFFSET KERN_PARAM_OFFSET - -struct vm_map_links { - struct vm_map_entry *prev; - struct vm_map_entry *next; - vm_map_offset_t start; - vm_map_offset_t end; -}; - -struct vm_map_header { - struct vm_map_links links; - uint8_t placeholder_[]; -}; - -static inline vm_map_offset_t vme_start(vm_map_entry_t entry) { - uint KERN_STRUCT_OFFSET(vm_map_entry, links) = 0; - return ((vm_map_header *)((addr_t)entry + KERN_STRUCT_OFFSET(vm_map_entry, links)))->links.start; -} -static inline vm_map_entry_t vm_map_to_entry(vm_map_t map) { - return nullptr; -} -static inline vm_map_entry_t vm_map_first_entry(vm_map_t map) { - uint KERN_STRUCT_OFFSET(vm_map, hdr) = 4; - return ((vm_map_header *)((addr_t)map + KERN_STRUCT_OFFSET(vm_map, hdr)))->links.next; -} - -// --- - -static tinystl::vector regions; -const tinystl::vector &ProcessRuntimeUtility::GetProcessMemoryLayout() { - return regions; -} - -// --- - -#include - -extern "C" void *kernel_info_load_base(); -; - -tinystl::vector modules; -const tinystl::vector *ProcessRuntimeUtility::GetProcessModuleMap() { - modules.clear(); - - // brute force kernel base ? so rude :) - static void *kernel_base = nullptr; - static OSKextLoadedKextSummaryHeader *_gLoadedKextSummaries = nullptr; - if (kernel_base == nullptr) { - kernel_base = kernel_info_load_base(); - if (kernel_base == nullptr) { - ERROR_LOG("kernel base not found"); - return &modules; - } - DEBUG_LOG("kernel base at: %p", kernel_base); - - extern void *DobbyMachOSymbolResolver(void *header_, const char *symbol_name); - OSKextLoadedKextSummaryHeader **_gLoadedKextSummariesPtr; - _gLoadedKextSummariesPtr = - (typeof(_gLoadedKextSummariesPtr))DobbyMachOSymbolResolver(kernel_base, "_gLoadedKextSummaries"); - if (_gLoadedKextSummariesPtr == nullptr) { - ERROR_LOG("failed resolve gLoadedKextSummaries symbol"); - return &modules; - } - _gLoadedKextSummaries = *_gLoadedKextSummariesPtr; - DEBUG_LOG("gLoadedKextSummaries at: %p", _gLoadedKextSummaries); - } - - // only kernel - RuntimeModule module = {0}; - strncpy(module.path, "kernel", sizeof(module.path) - 1); - module.load_address = (void *)kernel_base; - modules.push_back(module); - - // kext - for (int i = 0; i < _gLoadedKextSummaries->numSummaries; ++i) { - strncpy(module.path, _gLoadedKextSummaries->summaries[i].name, sizeof(module.path) - 1); - module.load_address = (void *)_gLoadedKextSummaries->summaries[i].address; - modules.push_back(module); - } - - return &modules; -} - -RuntimeModule ProcessRuntimeUtility::GetProcessModule(const char *name) { - const tinystl::vector *modules = GetProcessModuleMap(); - return RuntimeModule{0}; -} diff --git a/source/Backend/KernelMode/PlatformUtil/ProcessRuntimeUtility.h b/source/Backend/KernelMode/PlatformUtil/ProcessRuntimeUtility.h deleted file mode 100644 index af2df8ef..00000000 --- a/source/Backend/KernelMode/PlatformUtil/ProcessRuntimeUtility.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "PlatformUnifiedInterface/MemoryAllocator.h" - -#include "UnifiedInterface/platform.h" - -typedef struct _RuntimeModule { - char path[1024]; - void *load_address; -} RuntimeModule; - -struct MemRegion : MemRange { - MemoryPermission permission; - MemRegion(addr_t addr, size_t size, MemoryPermission perm) : MemRange(addr, size), permission(perm) { - } -}; - -class ProcessRuntimeUtility { -public: - static const tinystl::vector &GetProcessMemoryLayout(); - - static const tinystl::vector *GetProcessModuleMap(); - - static RuntimeModule GetProcessModule(const char *name); -}; \ No newline at end of file diff --git a/source/Backend/KernelMode/UnifiedInterface/exec_mem_placeholder.asm b/source/Backend/KernelMode/UnifiedInterface/exec_mem_placeholder.asm deleted file mode 100644 index 137da1e6..00000000 --- a/source/Backend/KernelMode/UnifiedInterface/exec_mem_placeholder.asm +++ /dev/null @@ -1,10 +0,0 @@ -#include - -#define PAGE_SHIFT 14 -.align PAGE_SHIFT - - .globl EXT(kernel_executable_memory_placeholder) -EXT(kernel_executable_memory_placeholder): -.rept 0x4000/4 -.long 0x41414141 -.endr \ No newline at end of file diff --git a/source/Backend/KernelMode/UnifiedInterface/platform-darwin.cc b/source/Backend/KernelMode/UnifiedInterface/platform-darwin.cc index f0c217d7..e69de29b 100644 --- a/source/Backend/KernelMode/UnifiedInterface/platform-darwin.cc +++ b/source/Backend/KernelMode/UnifiedInterface/platform-darwin.cc @@ -1,106 +0,0 @@ -#include "UnifiedInterface/platform.h" - -#include -#include -#include -#include - -// ================================================================ -// base :: OSMemory - -static int GetProtectionFromMemoryPermission(MemoryPermission access) { - switch (access) { - case MemoryPermission::kNoAccess: - return PROT_NONE; - case MemoryPermission::kRead: - return PROT_READ; - case MemoryPermission::kReadWrite: - return PROT_READ | PROT_WRITE; - case MemoryPermission::kReadWriteExecute: - return PROT_READ | PROT_WRITE | PROT_EXEC; - case MemoryPermission::kReadExecute: - return PROT_READ | PROT_EXEC; - } - UNREACHABLE(); -} - -int OSMemory::PageSize() { - return static_cast(0x4000); -} - -void *OSMemory::Allocate(size_t size, MemoryPermission access) { - return OSMemory::Allocate(size, access, nullptr); -} - -extern "C" void *kernel_executable_memory_placeholder; -void *OSMemory::Allocate(size_t size, MemoryPermission access, void *fixed_address) { - int prot = GetProtectionFromMemoryPermission(access); - - void *addr = nullptr; - int flags = VM_FLAGS_ANYWHERE; - if (fixed_address != nullptr) { - flags = VM_FLAGS_FIXED; - addr = fixed_address; - } - - // fixme: wire at pmap - if (prot & PROT_EXEC || prot == PROT_NONE) { - addr = &kernel_executable_memory_placeholder; - } else { - kern_return_t ret = mach_vm_allocate(kernel_map, (mach_vm_address_t *)&addr, size, flags); - if (ret != KERN_SUCCESS) { - panic("mach_vm_allocate"); - return nullptr; - } - ret = vm_map_wire(kernel_map, (mach_vm_address_t)addr, (mach_vm_address_t)addr + size, PROT_NONE, false); - if (ret != KERN_SUCCESS) { - panic("vm_map_wire"); - return nullptr; - } - - // make fault before at rw prot - bzero(addr, size); - { memcpy(addr, "AAAAAAAA", 8); } - - if (access == kNoAccess) { - access = kReadExecute; - } - if (!OSMemory::SetPermission((void *)addr, size, access)) { - OSMemory::Free(addr, size); - return nullptr; - } - - { - if (memcmp(addr, "AAAAAAAA", 8) != 0) { - return nullptr; - } - } - } - - return addr; -} - -bool OSMemory::Free(void *address, size_t size) { - DCHECK_EQ(0, reinterpret_cast(address) % PageSize()); - DCHECK_EQ(0, size % PageSize()); - - auto ret = mach_vm_deallocate(kernel_map, (mach_vm_address_t)address, size); - return ret == KERN_SUCCESS; -} - -bool OSMemory::Release(void *address, size_t size) { - DCHECK_EQ(0, reinterpret_cast(address) % PageSize()); - DCHECK_EQ(0, size % PageSize()); - - auto ret = mach_vm_deallocate(kernel_map, (mach_vm_address_t)address, size); - return ret == KERN_SUCCESS; -} - -bool OSMemory::SetPermission(void *address, size_t size, MemoryPermission access) { - DCHECK_EQ(0, reinterpret_cast(address) % PageSize()); - DCHECK_EQ(0, size % PageSize()); - - int prot = GetProtectionFromMemoryPermission(access); - auto ret = mach_vm_protect(kernel_map, (mach_vm_address_t)address, size, false, prot); - return ret == KERN_SUCCESS; -} diff --git a/source/Backend/KernelMode/UnifiedInterface/platform.h b/source/Backend/KernelMode/UnifiedInterface/platform.h deleted file mode 100644 index 5d8a879f..00000000 --- a/source/Backend/KernelMode/UnifiedInterface/platform.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef PLATFORM_INTERFACE_COMMON_PLATFORM_H -#define PLATFORM_INTERFACE_COMMON_PLATFORM_H - -#include "dobby/common.h" - -// ================================================================ -// base :: OSMemory - -enum MemoryPermission { kNoAccess, kRead, kReadWrite, kReadWriteExecute, kReadExecute }; - -class OSMemory { -public: - static int PageSize(); - - static void *Allocate(size_t size, MemoryPermission access); - - static void *Allocate(size_t size, MemoryPermission access, void *fixed_address); - - static bool Free(void *address, size_t size); - - static bool Release(void *address, size_t size); - - static bool SetPermission(void *address, size_t size, MemoryPermission access); -}; - -#endif diff --git a/source/Backend/UserMode/UnifiedInterface/platform-posix.cc b/source/Backend/UserMode/UnifiedInterface/platform-posix.cc index f7928e50..5894ae82 100644 --- a/source/Backend/UserMode/UnifiedInterface/platform-posix.cc +++ b/source/Backend/UserMode/UnifiedInterface/platform-posix.cc @@ -24,7 +24,7 @@ #include "logging/logging.h" #include "logging/check_logging.h" -#include "UnifiedInterface/platform.h" +#include "PlatformUnifiedInterface/platform.h" #if defined(__APPLE__) #include diff --git a/source/Backend/UserMode/UnifiedInterface/platform-windows.cc b/source/Backend/UserMode/UnifiedInterface/platform-windows.cc index fd361082..30af5b84 100644 --- a/source/Backend/UserMode/UnifiedInterface/platform-windows.cc +++ b/source/Backend/UserMode/UnifiedInterface/platform-windows.cc @@ -4,7 +4,7 @@ #include "logging/logging.h" #include "logging/check_logging.h" -#include "UnifiedInterface/platform.h" +#include "PlatformUnifiedInterface/platform.h" int GetProtectionFromMemoryPermission(MemoryPermission access) { if (kReadWriteExecute == access) diff --git a/source/Backend/UserMode/UnifiedInterface/platform.h b/source/PlatformUnifiedInterface/platform.h similarity index 97% rename from source/Backend/UserMode/UnifiedInterface/platform.h rename to source/PlatformUnifiedInterface/platform.h index 62bfe8f4..77a05ff9 100644 --- a/source/Backend/UserMode/UnifiedInterface/platform.h +++ b/source/PlatformUnifiedInterface/platform.h @@ -1,7 +1,6 @@ #pragma once -#include -#include +#include "dobby/common.h" namespace base { diff --git a/source/Backend/UserMode/PlatformUtil/ProcessRuntimeUtility.h b/source/PlatformUtil/ProcessRuntimeUtility.h similarity index 92% rename from source/Backend/UserMode/PlatformUtil/ProcessRuntimeUtility.h rename to source/PlatformUtil/ProcessRuntimeUtility.h index f861d7a1..7f85a462 100644 --- a/source/Backend/UserMode/PlatformUtil/ProcessRuntimeUtility.h +++ b/source/PlatformUtil/ProcessRuntimeUtility.h @@ -2,7 +2,7 @@ #include "PlatformUnifiedInterface/MemoryAllocator.h" -#include "UnifiedInterface/platform.h" +#include "PlatformUnifiedInterface/platform.h" typedef struct _RuntimeModule { char path[1024]; diff --git a/source/dobby/dobby_internal.h b/source/dobby/dobby_internal.h index 26e9912b..121d6509 100644 --- a/source/dobby/dobby_internal.h +++ b/source/dobby/dobby_internal.h @@ -2,7 +2,7 @@ #include "dobby/common.h" -#include "UnifiedInterface/platform.h" +#include "PlatformUnifiedInterface/platform.h" #include "PlatformUnifiedInterface/MemoryAllocator.h" #include "PlatformUnifiedInterface/ExecMemory/CodePatchTool.h" diff --git a/source/dobby/kernel_mode_header.h b/source/dobby/kernel_mode_header.h index 66d7a1a3..f962e3e6 100644 --- a/source/dobby/kernel_mode_header.h +++ b/source/dobby/kernel_mode_header.h @@ -2,56 +2,5 @@ #include #include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void *vm_map_entry_t; -extern vm_map_t kernel_map; - -typedef void *pmap_paddr_t; -struct pmap; -typedef struct pmap *pmap_t; -extern pmap_t kernel_pmap; - -extern task_t kernel_task; - -#ifdef __cplusplus -} -#endif - -// ----- pmap ----- - -typedef void *pmap_paddr_t; -struct pmap; -typedef struct pmap *pmap_t; - -typedef uint64_t vaddr_t; -typedef uint64_t paddr_t; - -struct pmap; -typedef struct pmap *pmap_t; - -#ifdef __cplusplus -extern "C" { -#endif - -extern pmap_t kernel_pmap; - -void pmap_kit_init(); - -paddr_t pmap_kit_kvtophys(pmap_t pmap, vaddr_t va); - -int pmap_kit_set_perm(pmap_t pmap, vaddr_t start, vaddr_t end, unsigned int prot); - -#define cppvPsnk 1 -#define cppvPsrc 2 -void pmap_kit_bcopy_phys(paddr_t src, paddr_t dst, size_t size, int flags); - -typedef uint64_t pt_entry_t; -pt_entry_t pmap_kit_kva_to_pte(pmap_t pmap, vaddr_t va); - -#ifdef __cplusplus -} -#endif \ No newline at end of file +#include +#include diff --git a/source/dobby/platform_features.h b/source/dobby/platform_features.h index 94d8abe3..fb9076ad 100644 --- a/source/dobby/platform_features.h +++ b/source/dobby/platform_features.h @@ -42,10 +42,9 @@ #define abs(a) ((a) < 0 ? -(a) : (a)) #endif #else +#endif + #ifdef __cplusplus -// #include "TINYSTL/vector.h" -// #include "TINYSTL/unordered_map.h" #include "TINYSTL/vector.h" #include "TINYSTL/unordered_map.h" -#endif #endif \ No newline at end of file