refine code

This commit is contained in:
kotori0 2022-02-01 22:18:16 +08:00 committed by LoveSy
parent 4d5a4dcb27
commit db7d1b9323
6 changed files with 49 additions and 76 deletions

View File

@ -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

View File

@ -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>

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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);