refine code
This commit is contained in:
parent
4d5a4dcb27
commit
db7d1b9323
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 <linux/fs.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)
|
||||
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
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include <jni.h>
|
||||
#include <unistd.h>
|
||||
#include <unordered_map>
|
||||
#include <sys/mman.h>
|
||||
#include <android/sharedmem.h>
|
||||
#include <android/sharedmem_jni.h>
|
||||
|
|
@ -11,10 +12,47 @@
|
|||
#include <fcntl.h>
|
||||
#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<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;
|
||||
|
||||
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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue