refine code
This commit is contained in:
parent
4d5a4dcb27
commit
db7d1b9323
|
|
@ -5,9 +5,9 @@ endef
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
LOCAL_MODULE := lspd
|
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))
|
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
|
LOCAL_STATIC_LIBRARIES := cxx riru yahfa dobby dex_builder
|
||||||
ifeq ($(API), riru)
|
ifeq ($(API), riru)
|
||||||
LOCAL_SRC_FILES += api/riru_main.cpp
|
LOCAL_SRC_FILES += api/riru_main.cpp
|
||||||
|
|
|
||||||
|
|
@ -30,10 +30,6 @@
|
||||||
#include "jni/native_api.h"
|
#include "jni/native_api.h"
|
||||||
#include "service.h"
|
#include "service.h"
|
||||||
#include "symbol_cache.h"
|
#include "symbol_cache.h"
|
||||||
#include "slicer/reader.h"
|
|
||||||
#include "slicer/writer.h"
|
|
||||||
#include "slicer/dex_utf8.h"
|
|
||||||
#include "Obfuscation.h"
|
|
||||||
|
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
//
|
|
||||||
// Created by Kotori0 on 2021/12/2.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <cstddef>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <unordered_map>
|
|
||||||
#include "slicer/reader.h"
|
|
||||||
#include "slicer/writer.h"
|
|
||||||
#include "Obfuscation.h"
|
|
||||||
|
|
||||||
class WA: public dex::Writer::Allocator {
|
|
||||||
std::unordered_map<void*, size_t> 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::u1*>(dex), size};
|
|
||||||
|
|
||||||
reader.CreateFullIr();
|
|
||||||
auto ir = reader.GetIr();
|
|
||||||
for (auto &i: ir->strings) {
|
|
||||||
const char *s = i->c_str();
|
|
||||||
char* p = const_cast<char *>(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;
|
|
||||||
}
|
|
||||||
|
|
@ -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<unsigned char>;
|
|
||||||
|
|
||||||
class Obfuscation {
|
|
||||||
public:
|
|
||||||
static ustring obfuscateDex(void* dex, size_t size);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif //LSPOSED_OBFUSCATION_H
|
|
||||||
|
|
@ -2,8 +2,8 @@ LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
LOCAL_MODULE := daemon
|
LOCAL_MODULE := daemon
|
||||||
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../core/src/main/cpp/shared/ $(LOCAL_PATH)../../../../core/src/main/cpp/main/include/
|
LOCAL_C_INCLUDES := $(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_SRC_FILES := logcat.cpp obfuscation.cpp ../../../../core/src/main/cpp/main/api/config.cpp
|
||||||
LOCAL_STATIC_LIBRARIES := cxx dex_builder
|
LOCAL_STATIC_LIBRARIES := cxx dex_builder
|
||||||
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
|
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
|
||||||
LOCAL_LDLIBS := -llog -landroid
|
LOCAL_LDLIBS := -llog -landroid
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <unordered_map>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <android/sharedmem.h>
|
#include <android/sharedmem.h>
|
||||||
#include <android/sharedmem_jni.h>
|
#include <android/sharedmem_jni.h>
|
||||||
|
|
@ -11,10 +12,47 @@
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include "slicer/reader.h"
|
#include "slicer/reader.h"
|
||||||
#include "slicer/writer.h"
|
#include "slicer/writer.h"
|
||||||
#include "Obfuscation.h"
|
|
||||||
// TODO: BAD
|
// TODO: BAD
|
||||||
#include "../../../../core/src/main/cpp/main/include/config.h"
|
#include "../../../../core/src/main/cpp/main/include/config.h"
|
||||||
|
|
||||||
|
class WA: public dex::Writer::Allocator {
|
||||||
|
std::unordered_map<void*, size_t> 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<uint8_t>;
|
||||||
|
ustring obfuscateDex(void *dex, size_t size) {
|
||||||
|
const char* new_sig = "Lac/ksmm/notioss/lspdaa";
|
||||||
|
dex::Reader reader{reinterpret_cast<dex::u1*>(dex), size};
|
||||||
|
|
||||||
|
reader.CreateFullIr();
|
||||||
|
auto ir = reader.GetIr();
|
||||||
|
for (auto &i: ir->strings) {
|
||||||
|
const char *s = i->c_str();
|
||||||
|
char* p = const_cast<char *>(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;
|
static jobject lspdDex = nullptr;
|
||||||
|
|
||||||
jobject new_sharedmem(JNIEnv* env, jint size) {
|
jobject new_sharedmem(JNIEnv* env, jint size) {
|
||||||
|
|
@ -55,12 +93,15 @@ Java_org_lsposed_lspd_service_LSPApplicationService_preloadDex(JNIEnv *env, jcla
|
||||||
return -1;
|
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());
|
LOGD("LSPApplicationService::preloadDex: %p, size=%zu", new_dex.data(), new_dex.size());
|
||||||
auto new_mem = new_sharedmem(env, new_dex.size());
|
auto new_mem = new_sharedmem(env, new_dex.size());
|
||||||
lspdDex = env->NewGlobalRef(new_mem);
|
lspdDex = env->NewGlobalRef(new_mem);
|
||||||
auto new_fd = ASharedMemory_dupFromJava(env, lspdDex);
|
auto new_fd = ASharedMemory_dupFromJava(env, lspdDex);
|
||||||
auto new_addr = mmap(nullptr, new_dex.size(), PROT_READ | PROT_WRITE, MAP_SHARED, new_fd, 0);
|
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());
|
memmove(new_addr, new_dex.data(), new_dex.size());
|
||||||
|
|
||||||
return new_fd;
|
return new_fd;
|
||||||
|
|
@ -88,7 +129,7 @@ Java_org_lsposed_lspd_service_LSPApplicationService_obfuscateDex(JNIEnv *env, jc
|
||||||
|
|
||||||
void *mem = mem_wrapper.data();
|
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
|
// create new SharedMem since it cannot be resized
|
||||||
auto new_mem = new_sharedmem(env, new_dex.size());
|
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);
|
mem = mmap(nullptr, new_dex.size(), PROT_READ | PROT_WRITE, MAP_SHARED, new_fd, 0);
|
||||||
if (mem == MAP_FAILED) {
|
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());
|
memcpy(mem, new_dex.data(), new_dex.size());
|
||||||
ASharedMemory_setProt(fd, PROT_READ);
|
ASharedMemory_setProt(fd, PROT_READ);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue