Skip to content

Commit

Permalink
Update backend of xnu kernel, and macho_ctx_kit
Browse files Browse the repository at this point in the history
  • Loading branch information
jmpews committed Apr 14, 2023
1 parent 0527af1 commit 0932d69
Show file tree
Hide file tree
Showing 24 changed files with 123 additions and 563 deletions.
45 changes: 11 additions & 34 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand Down Expand Up @@ -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
)
Expand Down Expand Up @@ -314,26 +289,28 @@ 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
)

# ---

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
Expand Down
58 changes: 28 additions & 30 deletions builtin-plugin/SymbolResolver/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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(
.
)

5 changes: 1 addition & 4 deletions builtin-plugin/SymbolResolver/macho/dobby_symbol_resolver.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,9 @@
#include "macho_ctx.h"
#include "shared_cache_ctx.h"

#if defined(BUILDING_KERNEL)
#else

#if !defined(BUILDING_KERNEL)
#include <mach-o/dyld.h>
#include <mach-o/dyld_images.h>

#endif

#undef LOG_TAG
Expand Down
53 changes: 32 additions & 21 deletions builtin-plugin/SymbolResolver/macho/macho_ctx.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down
8 changes: 6 additions & 2 deletions builtin-plugin/SymbolResolver/macho/macho_ctx.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#pragma once

#include <stdint.h>
#include <stdbool.h>
#include <sys/types.h>
#include <mach-o/loader.h>
#include <mach-o/nlist.h>

Expand Down Expand Up @@ -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;

Expand Down
34 changes: 22 additions & 12 deletions cmake/Util.cmake
Original file line number Diff line number Diff line change
@@ -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()
2 changes: 1 addition & 1 deletion cmake/build_environment_check.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ if(MSVC)
endif()


if(BUILDING_SILICON)
if(DOBBY_BUILD_SILICON)
set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_OSX_ARCHITECTURES})
endif()

Expand Down
19 changes: 11 additions & 8 deletions external/logging/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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}
)
)
Loading

0 comments on commit 0932d69

Please sign in to comment.