Commit 5bd6ce01 authored by swift_gan's avatar swift_gan

reconst

parent a482565f
...@@ -21,6 +21,7 @@ add_library( # Sets the name of the library. ...@@ -21,6 +21,7 @@ add_library( # Sets the name of the library.
src/main/cpp/trampoline/trampoline.cpp src/main/cpp/trampoline/trampoline.cpp
src/main/cpp/trampoline/trampoline_manager.cpp src/main/cpp/trampoline/trampoline_manager.cpp
src/main/cpp/utils/fake_dlfcn.cpp src/main/cpp/utils/fake_dlfcn.cpp
src/main/cpp/utils/hide_api.cpp
src/main/cpp/utils/utils.cpp src/main/cpp/utils/utils.cpp
src/main/cpp/utils/offset.cpp src/main/cpp/utils/offset.cpp
src/main/cpp/casts/cast_art_method.cpp src/main/cpp/casts/cast_art_method.cpp
......
...@@ -4,37 +4,113 @@ ...@@ -4,37 +4,113 @@
#include <cstdint> #include <cstdint>
#include "../includes/art_method.h" #include "../includes/art_method.h"
#include "../includes/cast_art_method.h" #include "../includes/cast_art_method.h"
#include "../includes/hide_api.h"
using namespace art::mirror; using namespace art::mirror;
using namespace SandHook;
void ArtMethod::setStatic() {
};
void ArtMethod::tryDisableInline() { void ArtMethod::tryDisableInline() {
if (SDK_INT < ANDROID_O)
return;
uint32_t accessFlag = getAccessFlags();
accessFlag &= ~ 0x08000000;
setAccessFlags(accessFlag);
} }
void ArtMethod::disableInterpreterForO() { void ArtMethod::disableInterpreterForO() {
uint32_t accessFlag = getAccessFlags();
accessFlag |= 0x0100;
setAccessFlags(accessFlag);
} }
void ArtMethod::disableCompilable() { void ArtMethod::disableCompilable() {
uint32_t accessFlag = getAccessFlags();
if (SDK_INT >= ANDROID_O2) {
accessFlag |= 0x02000000;
accessFlag |= 0x00800000;
} else {
accessFlag |= 0x01000000;
}
setAccessFlags(accessFlag);
} }
bool ArtMethod::isAbstract() { bool ArtMethod::isAbstract() {
uint32_t accessFlags = getAccessFlags();
return ((accessFlags & 0x0400) != 0);
} }
bool ArtMethod::isNative() { bool ArtMethod::isNative() {
uint32_t accessFlags = getAccessFlags();
return ((accessFlags & 0x0100) != 0);
}
bool ArtMethod::isCompiled() {
return getQuickCodeEntry() == SandHook::CastArtMethod::quickToInterpreterBridge;
} }
void ArtMethod::setAccessFlags(uint32_t flags) { void ArtMethod::setAccessFlags(uint32_t flags) {
CastArtMethod::accessFlag->set(this, flags);
} }
void ArtMethod::setPrivate() { void ArtMethod::setPrivate() {
uint32_t accessFlag = getAccessFlags();
accessFlag &= ~ 0x1;
accessFlag |= 0x2;
setAccessFlags(accessFlag);
}
void ArtMethod::setStatic() {
uint32_t accessFlag = getAccessFlags();
accessFlag |= 0x0008;
setAccessFlags(accessFlag);
};
uint32_t ArtMethod::getAccessFlags() {
return CastArtMethod::accessFlag->get(this);
}
uint32_t ArtMethod::getDexMethodIndex() {
return CastArtMethod::dexMethodIndex->get(this);
}
void* ArtMethod::getQuickCodeEntry() {
return CastArtMethod::entryPointQuickCompiled->get(this);
}
void* ArtMethod::getInterpreterCodeEntry() {
return CastArtMethod::entryPointFormInterpreter->get(this);
}
void ArtMethod::setQuickCodeEntry(void *entry) {
CastArtMethod::entryPointQuickCompiled->set(this, entry);
}
void ArtMethod::setJniCodeEntry(void *entry) {
}
void ArtMethod::setInterpreterCodeEntry(void *entry) {
CastArtMethod::entryPointFormInterpreter->set(this, entry);
}
void ArtMethod::setDexCacheResolveItem(uint32_t index, void* item) {
CastArtMethod::dexCacheResolvedMethods->setElement(this, index, item);
}
bool ArtMethod::compile() {
// if (isCompiled())
// return true;
// Size threadId = getAddressFromJavaByCallMethod(env, "com/swift/sandhook/SandHook", "getThreadId");
// if (threadId == 0)
// return false;
// return compileMethod(this, ) && isCompiled();
}
void ArtMethod::flushCache() {
}
void ArtMethod::backup(ArtMethod *backup) {
} }
\ No newline at end of file
...@@ -57,7 +57,7 @@ public: ...@@ -57,7 +57,7 @@ public:
void setQuickCodeEntry(void* entry); void setQuickCodeEntry(void* entry);
void setJniCodeEntry(void* entry); void setJniCodeEntry(void* entry);
void setInterpreterCodeEntry(void* entry); void setInterpreterCodeEntry(void* entry);
void setDexCacheResolveItem(ArtMethod* method, uint32_t index); void setDexCacheResolveItem(uint32_t index, void* item);
void* getQuickCodeEntry(); void* getQuickCodeEntry();
void* getInterpreterCodeEntry(); void* getInterpreterCodeEntry();
......
...@@ -62,7 +62,7 @@ namespace SandHook { ...@@ -62,7 +62,7 @@ namespace SandHook {
template<typename T> template<typename T>
int findOffset(void *start, size_t len, size_t step, T value) { int findOffset(void *start, size_t len, size_t step, T value) {
if (NULL == start) { if (nullptr == start) {
return -1; return -1;
} }
......
//
// Created by swift on 2019/1/21.
//
#ifndef SANDHOOK_HIDE_API_H
#define SANDHOOK_HIDE_API_H
#include <jni.h>
#include "../utils/fake_dlfcn.h"
#include "dlfcn.h"
extern "C" {
void initHideApi(JNIEnv *env, int SDK_VERSION);
bool compileMethod(void *artMethod, void *thread);
}
#endif //SANDHOOK_HIDE_API_H
...@@ -13,11 +13,11 @@ ...@@ -13,11 +13,11 @@
extern "C" { extern "C" {
Size getAddressFromJava(JNIEnv *env, char *className, char *fieldName); Size getAddressFromJava(JNIEnv *env, const char *className, const char *fieldName);
Size getAddressFromJavaByCallMethod(JNIEnv *env, char *className, char *methodName); Size getAddressFromJavaByCallMethod(JNIEnv *env, const char *className, const char *methodName);
jint getIntFromJava(JNIEnv *env, char *className, char *fieldName); jint getIntFromJava(JNIEnv *env, const char *className, const char *fieldName);
bool munprotect(size_t addr, size_t len); bool munprotect(size_t addr, size_t len);
......
#include <jni.h> #include <jni.h>
#include "includes/cast_art_method.h" #include "includes/cast_art_method.h"
#include "includes/trampoline_manager.h" #include "includes/trampoline_manager.h"
#include "./utils/hide_api.h" #include "includes/hide_api.h"
SandHook::TrampolineManager trampolineManager; SandHook::TrampolineManager trampolineManager;
......
//
// Created by swift on 2019/1/21.
//
#include "../includes/hide_api.h"
extern "C" {
void* (*jitLoad)(bool*) = nullptr;
void* jitCompilerHandle = nullptr;
bool (*jitCompileMethod)(void*, void*, void*, bool) = nullptr;
void initHideApi(JNIEnv* env, int SDK_VERSION) {
if (SDK_VERSION >= 24) {
void *jit_lib;
if (sizeof(void*) == 8) {
jit_lib = fake_dlopen("/system/lib64/libart-compiler.so", RTLD_NOW);
} else {
jit_lib = fake_dlopen("/system/lib/libart-compiler.so", RTLD_NOW);
}
jitCompileMethod = (bool (*)(void *, void *, void *, bool)) fake_dlsym(jit_lib, "jit_compile_method");
jitLoad = reinterpret_cast<void* (*)(bool*)>(fake_dlsym(jit_lib, "jit_load"));
bool generate_debug_info = false;
jitCompilerHandle = (jitLoad)(&generate_debug_info);
}
}
bool compileMethod(void* artMethod, void* thread) {
if (jitCompileMethod == nullptr) {
return false;
}
return jitCompileMethod(jitCompilerHandle, artMethod, thread, false);
}
}
//
// Created by swift on 2019/1/21.
//
#ifndef SANDHOOK_HIDE_API_H
#define SANDHOOK_HIDE_API_H
#include <jni.h>
#include "fake_dlfcn.h"
#include "dlfcn.h"
void* (*jitLoad)(bool*) = nullptr;
void* jitCompilerHandle = nullptr;
bool (*jitCompileMethod)(void*, void*, void*, bool) = nullptr;
void initHideApi(JNIEnv* env, int SDK_VERSION) {
if (SDK_VERSION >= 24) {
void *jit_lib;
if (sizeof(void*) == 8) {
jit_lib = fake_dlopen("/system/lib64/libart-compiler.so", RTLD_NOW);
} else {
jit_lib = fake_dlopen("/system/lib/libart-compiler.so", RTLD_NOW);
}
jitCompileMethod = (bool (*)(void *, void *, void *, bool)) fake_dlsym(jit_lib, "jit_compile_method");
jitLoad = reinterpret_cast<void* (*)(bool*)>(fake_dlsym(jit_lib, "jit_load"));
bool generate_debug_info = false;
jitCompilerHandle = (jitLoad)(&generate_debug_info);
}
}
bool compileMethod(void* artMethod, void* thread) {
if (jitCompileMethod == nullptr) {
return false;
}
return jitCompileMethod(jitCompilerHandle, artMethod, thread, false);
}
#endif //SANDHOOK_HIDE_API_H
...@@ -9,7 +9,7 @@ namespace SandHook { ...@@ -9,7 +9,7 @@ namespace SandHook {
template<typename T> template<typename T>
int Offset::findOffset(void *start, size_t len, size_t step, T value) { int Offset::findOffset(void *start, size_t len, size_t step, T value) {
if (NULL == start) { if (nullptr == start) {
return -1; return -1;
} }
...@@ -25,7 +25,7 @@ namespace SandHook { ...@@ -25,7 +25,7 @@ namespace SandHook {
template<typename T> template<typename T>
int Offset::findOffsetWithCB1(void *start, size_t len, size_t step, bool func(int, T)) { int Offset::findOffsetWithCB1(void *start, size_t len, size_t step, bool func(int, T)) {
if (NULL == start) { if (nullptr == start) {
return -1; return -1;
} }
...@@ -41,7 +41,7 @@ namespace SandHook { ...@@ -41,7 +41,7 @@ namespace SandHook {
template<typename T> template<typename T>
int Offset::findOffsetWithCB2(void *start1, void *start2, size_t len, size_t step, bool func(T, T)) { int Offset::findOffsetWithCB2(void *start1, void *start2, size_t len, size_t step, bool func(T, T)) {
if (NULL == start1 || NULL == start2) { if (nullptr == start1 || nullptr == start2) {
return -1; return -1;
} }
......
...@@ -4,8 +4,9 @@ ...@@ -4,8 +4,9 @@
#include "../includes/utils.h" #include "../includes/utils.h"
extern "C" {
Size getAddressFromJava(JNIEnv *env, char *className, char *fieldName) { Size getAddressFromJava(JNIEnv *env, const char *className, const char *fieldName) {
jclass clazz = env->FindClass(className); jclass clazz = env->FindClass(className);
if (clazz == NULL) { if (clazz == NULL) {
printf("find class error !"); printf("find class error !");
...@@ -17,9 +18,9 @@ Size getAddressFromJava(JNIEnv *env, char *className, char *fieldName) { ...@@ -17,9 +18,9 @@ Size getAddressFromJava(JNIEnv *env, char *className, char *fieldName) {
return 0; return 0;
} }
return env->GetStaticLongField(clazz, id); return env->GetStaticLongField(clazz, id);
} }
Size getAddressFromJavaByCallMethod(JNIEnv *env, char *className, char *methodName) { Size getAddressFromJavaByCallMethod(JNIEnv *env, const char *className, const char *methodName) {
jclass clazz = env->FindClass(className); jclass clazz = env->FindClass(className);
if (clazz == NULL) { if (clazz == NULL) {
printf("find class error !"); printf("find class error !");
...@@ -31,9 +32,9 @@ Size getAddressFromJavaByCallMethod(JNIEnv *env, char *className, char *methodNa ...@@ -31,9 +32,9 @@ Size getAddressFromJavaByCallMethod(JNIEnv *env, char *className, char *methodNa
return 0; return 0;
} }
return env->CallStaticLongMethodA(clazz, id, nullptr); return env->CallStaticLongMethodA(clazz, id, nullptr);
} }
jint getIntFromJava(JNIEnv *env, char *className, char *fieldName) { jint getIntFromJava(JNIEnv *env, const char *className, const char *fieldName) {
jclass clazz = env->FindClass(className); jclass clazz = env->FindClass(className);
if (clazz == NULL) { if (clazz == NULL) {
printf("find class error !"); printf("find class error !");
...@@ -45,9 +46,9 @@ jint getIntFromJava(JNIEnv *env, char *className, char *fieldName) { ...@@ -45,9 +46,9 @@ jint getIntFromJava(JNIEnv *env, char *className, char *fieldName) {
return 0; return 0;
} }
return env->GetStaticIntField(clazz, id); return env->GetStaticIntField(clazz, id);
} }
bool munprotect(size_t addr, size_t len) { bool munprotect(size_t addr, size_t len) {
long pagesize = sysconf(_SC_PAGESIZE); long pagesize = sysconf(_SC_PAGESIZE);
unsigned alignment = (unsigned) ((unsigned long long) addr % pagesize); unsigned alignment = (unsigned) ((unsigned long long) addr % pagesize);
int i = mprotect((void *) (addr - alignment), (size_t) (alignment + len), int i = mprotect((void *) (addr - alignment), (size_t) (alignment + len),
...@@ -56,5 +57,7 @@ bool munprotect(size_t addr, size_t len) { ...@@ -56,5 +57,7 @@ bool munprotect(size_t addr, size_t len) {
return false; return false;
} }
return true; return true;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment