diff --git a/core/src/main/cpp/main/Android.mk b/core/src/main/cpp/main/Android.mk index 19c2e984..bf47e448 100644 --- a/core/src/main/cpp/main/Android.mk +++ b/core/src/main/cpp/main/Android.mk @@ -5,9 +5,9 @@ endef include $(CLEAR_VARS) LOCAL_MODULE := lspd -LOCAL_C_INCLUDES := $(LOCAL_PATH)/include $(LOCAL_PATH)/src $(LOCAL_PATH)/../shared/ +LOCAL_C_INCLUDES := $(LOCAL_PATH)/include $(LOCAL_PATH)/src FILE_LIST := $(filter %.cpp, $(call walk, $(LOCAL_PATH)/src)) -LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) api/config.cpp ../shared/Obfuscation.cpp +LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) api/config.cpp LOCAL_STATIC_LIBRARIES := cxx riru yahfa dobby dex_builder ifeq ($(API), riru) LOCAL_SRC_FILES += api/riru_main.cpp diff --git a/core/src/main/cpp/main/src/context.cpp b/core/src/main/cpp/main/src/context.cpp index 4d40542f..a78cdfee 100644 --- a/core/src/main/cpp/main/src/context.cpp +++ b/core/src/main/cpp/main/src/context.cpp @@ -30,10 +30,6 @@ #include "jni/native_api.h" #include "service.h" #include "symbol_cache.h" -#include "slicer/reader.h" -#include "slicer/writer.h" -#include "slicer/dex_utf8.h" -#include "Obfuscation.h" #include #include diff --git a/core/src/main/cpp/shared/Obfuscation.cpp b/core/src/main/cpp/shared/Obfuscation.cpp deleted file mode 100644 index 25ba2319..00000000 --- a/core/src/main/cpp/shared/Obfuscation.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// -// Created by Kotori0 on 2021/12/2. -// - -#include -#include -#include -#include "slicer/reader.h" -#include "slicer/writer.h" -#include "Obfuscation.h" - -class WA: public dex::Writer::Allocator { - std::unordered_map allocated_; -public: - void* Allocate(size_t size) override { - auto *mem = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - allocated_[mem] = size; - return mem; - } - void Free(void* ptr) override { - munmap(ptr, allocated_[ptr]); - allocated_.erase(ptr); - } -}; - -ustring Obfuscation::obfuscateDex(void *dex, size_t size) { - const char* new_sig = "Lac/ksmm/notioss/lspdaa"; - dex::Reader reader{reinterpret_cast(dex), size}; - - reader.CreateFullIr(); - auto ir = reader.GetIr(); - for (auto &i: ir->strings) { - const char *s = i->c_str(); - char* p = const_cast(strstr(s, "Lde/robv/android/xposed")); - if (p) { - memcpy(p, new_sig, strlen(new_sig)); - } - } - dex::Writer writer(ir); - - size_t new_size; - WA allocator; - auto *p_dex = writer.CreateImage(&allocator, &new_size); - ustring new_dex(p_dex, new_size); - allocator.Free(p_dex); - return new_dex; -} \ No newline at end of file diff --git a/core/src/main/cpp/shared/Obfuscation.h b/core/src/main/cpp/shared/Obfuscation.h deleted file mode 100644 index 12e692e4..00000000 --- a/core/src/main/cpp/shared/Obfuscation.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// Created by Kotori0 on 2021/12/2. -// - -#ifndef LSPOSED_OBFUSCATION_H -#define LSPOSED_OBFUSCATION_H -#include "slicer/writer.h" - -using ustring = std::basic_string; - -class Obfuscation { -public: - static ustring obfuscateDex(void* dex, size_t size); -}; - - -#endif //LSPOSED_OBFUSCATION_H \ No newline at end of file diff --git a/daemon/src/main/cpp/Android.mk b/daemon/src/main/cpp/Android.mk index 04b676e3..ddfc9e4b 100644 --- a/daemon/src/main/cpp/Android.mk +++ b/daemon/src/main/cpp/Android.mk @@ -2,8 +2,8 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := daemon -LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../core/src/main/cpp/shared/ $(LOCAL_PATH)../../../../core/src/main/cpp/main/include/ -LOCAL_SRC_FILES := logcat.cpp obfuscation.cpp ../../../../core/src/main/cpp/shared/Obfuscation.cpp ../../../../core/src/main/cpp/main/api/config.cpp +LOCAL_C_INCLUDES := $(LOCAL_PATH)../../../../core/src/main/cpp/main/include/ +LOCAL_SRC_FILES := logcat.cpp obfuscation.cpp ../../../../core/src/main/cpp/main/api/config.cpp LOCAL_STATIC_LIBRARIES := cxx dex_builder LOCAL_ALLOW_UNDEFINED_SYMBOLS := true LOCAL_LDLIBS := -llog -landroid diff --git a/daemon/src/main/cpp/obfuscation.cpp b/daemon/src/main/cpp/obfuscation.cpp index b09fa067..a6f1088d 100644 --- a/daemon/src/main/cpp/obfuscation.cpp +++ b/daemon/src/main/cpp/obfuscation.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -11,10 +12,47 @@ #include #include "slicer/reader.h" #include "slicer/writer.h" -#include "Obfuscation.h" // TODO: BAD #include "../../../../core/src/main/cpp/main/include/config.h" +class WA: public dex::Writer::Allocator { + std::unordered_map allocated_; +public: + void* Allocate(size_t size) override { + auto *mem = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + allocated_[mem] = size; + return mem; + } + void Free(void* ptr) override { + munmap(ptr, allocated_[ptr]); + allocated_.erase(ptr); + } +}; + +using ustring = std::basic_string; +ustring obfuscateDex(void *dex, size_t size) { + const char* new_sig = "Lac/ksmm/notioss/lspdaa"; + dex::Reader reader{reinterpret_cast(dex), size}; + + reader.CreateFullIr(); + auto ir = reader.GetIr(); + for (auto &i: ir->strings) { + const char *s = i->c_str(); + char* p = const_cast(strstr(s, "Lde/robv/android/xposed")); + if (p) { + memcpy(p, new_sig, strlen(new_sig)); + } + } + dex::Writer writer(ir); + + size_t new_size; + WA allocator; + auto *p_dex = writer.CreateImage(&allocator, &new_size); + ustring new_dex(p_dex, new_size); + allocator.Free(p_dex); + return new_dex; +} + static jobject lspdDex = nullptr; jobject new_sharedmem(JNIEnv* env, jint size) { @@ -55,12 +93,15 @@ Java_org_lsposed_lspd_service_LSPApplicationService_preloadDex(JNIEnv *env, jcla return -1; } - auto new_dex = Obfuscation::obfuscateDex(addr, size); + auto new_dex = obfuscateDex(addr, size); LOGD("LSPApplicationService::preloadDex: %p, size=%zu", new_dex.data(), new_dex.size()); auto new_mem = new_sharedmem(env, new_dex.size()); lspdDex = env->NewGlobalRef(new_mem); auto new_fd = ASharedMemory_dupFromJava(env, lspdDex); auto new_addr = mmap(nullptr, new_dex.size(), PROT_READ | PROT_WRITE, MAP_SHARED, new_fd, 0); + if (new_addr == MAP_FAILED) { + LOGE("Failed to map new dex to memory?"); + } memmove(new_addr, new_dex.data(), new_dex.size()); return new_fd; @@ -88,7 +129,7 @@ Java_org_lsposed_lspd_service_LSPApplicationService_obfuscateDex(JNIEnv *env, jc void *mem = mem_wrapper.data(); - auto new_dex = Obfuscation::obfuscateDex(mem, size); + auto new_dex = obfuscateDex(mem, size); // create new SharedMem since it cannot be resized auto new_mem = new_sharedmem(env, new_dex.size()); @@ -96,7 +137,7 @@ Java_org_lsposed_lspd_service_LSPApplicationService_obfuscateDex(JNIEnv *env, jc mem = mmap(nullptr, new_dex.size(), PROT_READ | PROT_WRITE, MAP_SHARED, new_fd, 0); if (mem == MAP_FAILED) { - // LOGE("Failed to map new dex to memory?"); + LOGE("Failed to map new dex to memory?"); } memcpy(mem, new_dex.data(), new_dex.size()); ASharedMemory_setProt(fd, PROT_READ);