diff --git a/subject/CMakeLists.txt b/subject/CMakeLists.txt index 17b8811..97c0a9d 100644 --- a/subject/CMakeLists.txt +++ b/subject/CMakeLists.txt @@ -11,7 +11,7 @@ file(MAKE_DIRECTORY "${SUBJECT_SPSLR_METADIR}") add_library(subject_objs OBJECT ${SUBJECT_SRC}) target_include_directories(subject_objs PRIVATE .) -target_link_libraries(subject_objs PRIVATE spslr_selfpatch) +target_link_libraries(subject_objs PRIVATE spslr_selfpatch dl) add_dependencies(subject_objs spslr_pinpoint) target_compile_options(subject_objs PRIVATE @@ -66,3 +66,73 @@ target_include_directories(subject PRIVATE .) target_link_libraries(subject PRIVATE spslr_selfpatch) add_dependencies(subject spslr_selfpatch) + + +set(MODULE_SRC + module.c +) + +set(MODULE_SPSLR_METADIR "${CMAKE_CURRENT_BINARY_DIR}/spslr_module") +set(MODULE_SPSLR_SRCROOT "${CMAKE_CURRENT_SOURCE_DIR}") + +file(MAKE_DIRECTORY "${MODULE_SPSLR_METADIR}") + +add_library(spslr_module_objs OBJECT ${MODULE_SRC}) +target_include_directories(spslr_module_objs PRIVATE .) +add_dependencies(spslr_module_objs spslr_pinpoint) + +target_compile_options(spslr_module_objs PRIVATE + -O1 + -fPIC + -fplugin=$ + -fplugin-arg-spslr_pinpoint-srcroot=${MODULE_SPSLR_SRCROOT} + -fplugin-arg-spslr_pinpoint-metadir=${MODULE_SPSLR_METADIR} +) + +set(MODULE_SPSLR_FILES "") +foreach(src IN LISTS MODULE_SRC) + get_filename_component(abs_src "${src}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") + file(RELATIVE_PATH rel_src "${MODULE_SPSLR_SRCROOT}" "${abs_src}") + file(TO_CMAKE_PATH "${rel_src}" rel_src) + list(APPEND MODULE_SPSLR_FILES "${MODULE_SPSLR_METADIR}/${rel_src}.spslr") +endforeach() + +set(MODULE_SPSLR_ASM "${CMAKE_CURRENT_BINARY_DIR}/spslr_module_program.S") +set(MODULE_SPSLR_OBJ "${CMAKE_CURRENT_BINARY_DIR}/spslr_module_program.o") + +add_custom_command( + OUTPUT "${MODULE_SPSLR_ASM}" + COMMAND $ + --out=${MODULE_SPSLR_ASM} + ${MODULE_SPSLR_FILES} + DEPENDS + spslr_patchcompile + $ + VERBATIM +) + +add_custom_command( + OUTPUT "${MODULE_SPSLR_OBJ}" + COMMAND ${CMAKE_C_COMPILER} + -fPIC + -c "${MODULE_SPSLR_ASM}" + -o "${MODULE_SPSLR_OBJ}" + DEPENDS "${MODULE_SPSLR_ASM}" + VERBATIM +) + +set_source_files_properties("${MODULE_SPSLR_OBJ}" PROPERTIES + GENERATED TRUE + EXTERNAL_OBJECT TRUE +) + +add_library(spslr_module SHARED + $ + "${MODULE_SPSLR_OBJ}" +) + +target_include_directories(spslr_module PRIVATE .) +set_target_properties(spslr_module PROPERTIES + OUTPUT_NAME "spslr_module" + PREFIX "lib" +) diff --git a/subject/main.c b/subject/main.c index 089665c..81cadcc 100644 --- a/subject/main.c +++ b/subject/main.c @@ -1,5 +1,9 @@ #include +#include +#include +#include + #include "task_struct.h" #include "export.h" @@ -18,6 +22,32 @@ struct task_struct global = { .pid = 42, .comm = "main_global", .arrfun = { EXPORT_SYMBOL(global); +static int do_module_test_access_pid(const char *path, const struct task_struct *t) { + typedef int (*module_test_access_fn)(const struct task_struct *t); + + void *handle = dlopen(path, RTLD_NOW | RTLD_LOCAL); + if (!handle) { + fprintf(stderr, "dlopen failed for %s: %s\n", path, dlerror()); + return -1; + } + + dlerror(); + + module_test_access_fn fn = (module_test_access_fn)dlsym(handle, "module_test_access_pid"); + + const char *err = dlerror(); + if (err) { + fprintf(stderr, "dlsym failed: %s\n", err); + dlclose(handle); + return -1; + } + + int ret = fn(t); + + dlclose(handle); + return ret; +} + static void print_layout() { // TODO -> Make builtin __spslr_initial_offsetof(type, field) that is not patched printf("Current task_struct layout:\n"); @@ -77,6 +107,9 @@ int main(void) arr_test(); + int module_pid = do_module_test_access_pid("./subject/libspslr_module.so", &global); + printf("module_test_access returned %d (should be 42)\n", module_pid); + return 0; } diff --git a/subject/module.c b/subject/module.c new file mode 100644 index 0000000..57ff7e0 --- /dev/null +++ b/subject/module.c @@ -0,0 +1,5 @@ +#include "module.h" + +int module_test_access_pid(const struct task_struct* t) { + return t->pid; +} diff --git a/subject/module.h b/subject/module.h new file mode 100644 index 0000000..035f00a --- /dev/null +++ b/subject/module.h @@ -0,0 +1,3 @@ +#include "task_struct.h" + +int module_test_access_pid(const struct task_struct* t); diff --git a/subject/task_struct.h b/subject/task_struct.h index 8825484..6fea425 100644 --- a/subject/task_struct.h +++ b/subject/task_struct.h @@ -1,3 +1,6 @@ +#ifndef HDR_TASK_STRUCT +#define HDR_TASK_STRUCT + #include #include @@ -81,3 +84,4 @@ struct task_struct { int stuck1, stuck2; }; +#endif