From 475185c3eee561b732038f67eeea782668333bef Mon Sep 17 00:00:00 2001 From: osm0sis Date: Mon, 15 Jan 2024 23:05:18 -0400 Subject: [PATCH] Switch hooking method to Dobby - Android 14 QPR2 (currently in Beta and due for Stable in March) breaks ShadowHook libc hooking needed for property spoofing - there are currently no signs of life over at ShadowHook to resolve this despite my reporting it to them over a month ago Co-authored-by: Nicholas Bissell Co-authored-by: chiteroman <98092901+chiteroman@users.noreply.github.com> --- .gitmodules | 9 +++------ .idea/vcs.xml | 4 ++-- app/build.gradle.kts | 33 +++++++++++++++++++++++++++------ app/src/main/cpp/Android.mk | 33 --------------------------------- app/src/main/cpp/Application.mk | 3 --- app/src/main/cpp/CMakeLists.txt | 10 +++++----- app/src/main/cpp/Dobby | 1 + app/src/main/cpp/libcxx | 1 - app/src/main/cpp/main.cpp | 15 +++++++-------- app/src/main/cpp/shadowhook | 1 - build.gradle.kts | 2 +- 11 files changed, 46 insertions(+), 66 deletions(-) delete mode 100644 app/src/main/cpp/Android.mk delete mode 100644 app/src/main/cpp/Application.mk create mode 160000 app/src/main/cpp/Dobby delete mode 160000 app/src/main/cpp/libcxx delete mode 160000 app/src/main/cpp/shadowhook diff --git a/.gitmodules b/.gitmodules index b19bd06..7523432 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "libcxx"] - path = app/src/main/cpp/libcxx - url = https://github.com/topjohnwu/libcxx.git -[submodule "shadowhook"] - path = app/src/main/cpp/shadowhook - url = https://github.com/bytedance/android-inline-hook +[submodule "Dobby"] + path = app/src/main/cpp/Dobby + url = https://github.com/jmpews/Dobby diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 25dfc0f..8011b03 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,6 +2,6 @@ - + - \ No newline at end of file + diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 06b33ce..e3572f5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -8,6 +8,17 @@ android { ndkVersion = "26.1.10909125" buildToolsVersion = "34.0.0" + buildFeatures { + prefab = true + } + + packaging { + jniLibs { + excludes += "**/liblog.so" + excludes += "**/libdobby.so" + } + } + defaultConfig { applicationId = "es.chiteroman.playintegrityfix" minSdk = 26 @@ -16,10 +27,15 @@ android { versionName = "1.0" externalNativeBuild { - ndk { - jobs = Runtime.getRuntime().availableProcessors() - abiFilters += "armeabi-v7a" - abiFilters += "arm64-v8a" + cmake { + arguments += "-DANDROID_STL=none" + arguments += "-DCMAKE_BUILD_TYPE=Release" + + cppFlags += "-std=c++20" + cppFlags += "-fno-exceptions" + cppFlags += "-fno-rtti" + cppFlags += "-fvisibility=hidden" + cppFlags += "-fvisibility-inlines-hidden" } } } @@ -38,12 +54,17 @@ android { } externalNativeBuild { - ndkBuild { - path = file("src/main/cpp/Android.mk") + cmake { + path = file("src/main/cpp/CMakeLists.txt") + version = "3.22.1" } } } +dependencies { + implementation("dev.rikka.ndk.thirdparty:cxx:1.2.0") +} + tasks.register("copyFiles") { doLast { val moduleFolder = project.rootDir.resolve("module") diff --git a/app/src/main/cpp/Android.mk b/app/src/main/cpp/Android.mk deleted file mode 100644 index 08042e0..0000000 --- a/app/src/main/cpp/Android.mk +++ /dev/null @@ -1,33 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := zygisk -LOCAL_SRC_FILES := main.cpp -LOCAL_C_INCLUDES := $(LOCAL_PATH) - -LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/shadowhook/shadowhook/src/main/cpp/*.c) -LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/shadowhook/shadowhook/src/main/cpp/common/*.c) -LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/shadowhook/shadowhook/src/main/cpp/third_party/xdl/*.c) - -LOCAL_C_INCLUDES += $(LOCAL_PATH)/shadowhook/shadowhook/src/main/cpp -LOCAL_C_INCLUDES += $(LOCAL_PATH)/shadowhook/shadowhook/src/main/cpp/common -LOCAL_C_INCLUDES += $(LOCAL_PATH)/shadowhook/shadowhook/src/main/cpp/include -LOCAL_C_INCLUDES += $(LOCAL_PATH)/shadowhook/shadowhook/src/main/cpp/third_party/bsd -LOCAL_C_INCLUDES += $(LOCAL_PATH)/shadowhook/shadowhook/src/main/cpp/third_party/lss -LOCAL_C_INCLUDES += $(LOCAL_PATH)/shadowhook/shadowhook/src/main/cpp/third_party/xdl - -ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) - LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/shadowhook/shadowhook/src/main/cpp/arch/arm/*.c) - LOCAL_C_INCLUDES += $(LOCAL_PATH)/shadowhook/shadowhook/src/main/cpp/arch/arm -endif - -ifeq ($(TARGET_ARCH_ABI),arm64-v8a) - LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/shadowhook/shadowhook/src/main/cpp/arch/arm64/*.c) - LOCAL_C_INCLUDES += $(LOCAL_PATH)/shadowhook/shadowhook/src/main/cpp/arch/arm64 -endif - -LOCAL_STATIC_LIBRARIES := libcxx -LOCAL_LDLIBS := -llog -include $(BUILD_SHARED_LIBRARY) - -include $(LOCAL_PATH)/libcxx/Android.mk diff --git a/app/src/main/cpp/Application.mk b/app/src/main/cpp/Application.mk deleted file mode 100644 index 51fecb7..0000000 --- a/app/src/main/cpp/Application.mk +++ /dev/null @@ -1,3 +0,0 @@ -APP_STL := none -APP_CFLAGS := -Oz -fno-exceptions -fno-rtti -fvisibility=hidden -fvisibility-inlines-hidden -APP_CPPFLAGS := -std=c++20 diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index bd0e7e6..27d6f6b 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -2,14 +2,14 @@ cmake_minimum_required(VERSION 3.22.1) project(zygisk) -include_directories(${CMAKE_SOURCE_DIR}/libcxx/include) +find_package(cxx REQUIRED CONFIG) -link_libraries(${CMAKE_SOURCE_DIR}/libcxx/${CMAKE_ANDROID_ARCH_ABI}.a) +link_libraries(cxx::cxx) add_library(${CMAKE_PROJECT_NAME} SHARED ${CMAKE_SOURCE_DIR}/main.cpp) +add_subdirectory(Dobby) + SET_OPTION(Plugin.Android.BionicLinkerUtil ON) -target_compile_features(${CMAKE_PROJECT_NAME} PRIVATE c_std_23 cxx_std_23) - -target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE log) +target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE log dobby_static) diff --git a/app/src/main/cpp/Dobby b/app/src/main/cpp/Dobby new file mode 160000 index 0000000..b0176de --- /dev/null +++ b/app/src/main/cpp/Dobby @@ -0,0 +1 @@ +Subproject commit b0176de574104726bb68dff3b77ee666300fc338 diff --git a/app/src/main/cpp/libcxx b/app/src/main/cpp/libcxx deleted file mode 160000 index 12c8f4e..0000000 --- a/app/src/main/cpp/libcxx +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 12c8f4e93f196a700137e983dcceeac43cf807f2 diff --git a/app/src/main/cpp/main.cpp b/app/src/main/cpp/main.cpp index 2d03402..81dc536 100644 --- a/app/src/main/cpp/main.cpp +++ b/app/src/main/cpp/main.cpp @@ -3,7 +3,7 @@ #include #include "zygisk.hpp" -#include "shadowhook.h" +#include "dobby.h" #include "json.hpp" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "PIF/Native", __VA_ARGS__) @@ -67,18 +67,17 @@ static void my_system_property_read_callback(const prop_info *pi, T_Callback cal } static void doHook() { - shadowhook_init(SHADOWHOOK_MODE_UNIQUE, false); - void *handle = shadowhook_hook_sym_name( - "libc.so", - "__system_property_read_callback", - reinterpret_cast(my_system_property_read_callback), - reinterpret_cast(&o_system_property_read_callback) - ); + void *handle = DobbySymbolResolver(nullptr, "__system_property_read_callback"); if (handle == nullptr) { LOGD("Couldn't find '__system_property_read_callback' handle"); return; } LOGD("Found '__system_property_read_callback' handle at %p", handle); + DobbyHook( + handle, + reinterpret_cast(my_system_property_read_callback), + reinterpret_cast(&o_system_property_read_callback) + ); } class PlayIntegrityFix : public zygisk::ModuleBase { diff --git a/app/src/main/cpp/shadowhook b/app/src/main/cpp/shadowhook deleted file mode 160000 index b2537df..0000000 --- a/app/src/main/cpp/shadowhook +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b2537df077b9fa25aaa4c7b82cf4c64aac148da9 diff --git a/build.gradle.kts b/build.gradle.kts index 68bcdaf..410a94a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,3 @@ plugins { - id("com.android.application") version "8.2.0" apply false + id("com.android.application") version "8.2.1" apply false }