Commit bd46d435 authored by swift_gan's avatar swift_gan Committed by swift_gan

done disable vm inline!

parent 75d75c0e
...@@ -25,7 +25,9 @@ add_library( # Sets the name of the library. ...@@ -25,7 +25,9 @@ add_library( # Sets the name of the library.
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
src/main/cpp/casts/cast_compiler_options.cpp
src/main/cpp/art/art_method.cpp src/main/cpp/art/art_method.cpp
src/main/cpp/art/art_compiler_options.cpp
src/main/cpp/trampoline/arch/arm32.S src/main/cpp/trampoline/arch/arm32.S
src/main/cpp/trampoline/arch/arm64.S src/main/cpp/trampoline/arch/arm64.S
src/main/cpp/inst/insts_arm32.cpp src/main/cpp/inst/insts_arm32.cpp
......
//
// Created by 甘尧 on 2019/2/24.
//
#include "../includes/art_compiler_options.h"
#include "../includes/cast_compiler_options.h"
#include "../includes/hide_api.h"
using namespace SandHook;
using namespace art;
extern int SDK_INT;
size_t CompilerOptions::getInlineMaxCodeUnits() {
if (SDK_INT < ANDROID_N)
return 0;
return CastCompilerOptions::inlineMaxCodeUnits->get(this);
}
bool CompilerOptions::setInlineMaxCodeUnits(size_t units) {
if (SDK_INT < ANDROID_N)
return false;
CastCompilerOptions::inlineMaxCodeUnits->set(this, units);
return true;
}
//
// Created by 甘尧 on 2019/2/24.
//
#include "../includes/cast_compiler_options.h"
#include "../includes/hide_api.h"
extern int SDK_INT;
namespace SandHook {
class CastInlineMaxCodeUnits : public IMember<art::CompilerOptions, size_t> {
protected:
Size calOffset(JNIEnv *jniEnv, art::CompilerOptions *p) override {
if (SDK_INT < ANDROID_N)
return getParentSize() + 1;
if (SDK_INT >= ANDROID_O) {
return BYTE_POINT + 5 * sizeof(size_t);
} else {
return BYTE_POINT + 6 * sizeof(size_t);
}
}
};
void CastCompilerOptions::init(JNIEnv *jniEnv) {
inlineMaxCodeUnits->init(jniEnv, nullptr, sizeof(art::CompilerOptions));
}
IMember<art::CompilerOptions, size_t>* CastCompilerOptions::inlineMaxCodeUnits = new CastInlineMaxCodeUnits();
}
...@@ -2,23 +2,27 @@ ...@@ -2,23 +2,27 @@
// Created by 甘尧 on 2019/2/23. // Created by 甘尧 on 2019/2/23.
// //
#ifndef SANDHOOK_ART_COMPILER_OPTIONS_H #ifndef ART_COMPILER_OPTIONS_H
#define SANDHOOK_ART_COMPILER_OPTIONS_H #define ART_COMPILER_OPTIONS_H
#include "arch.h" #include <stddef.h>
namespace art { namespace art {
class CompilerOptions { class CompilerOptions {
public: public:
void* compiler_filter_; void* compiler_filter_;
Size huge_method_threshold_; size_t huge_method_threshold_;
Size large_method_threshold_; size_t large_method_threshold_;
Size small_method_threshold_; size_t small_method_threshold_;
Size tiny_method_threshold_; size_t tiny_method_threshold_;
Size num_dex_methods_threshold_; size_t num_dex_methods_threshold_;
Size inline_depth_limit_; size_t inline_depth_limit_;
Size inline_max_code_units_; size_t inline_max_code_units_;
size_t getInlineMaxCodeUnits();
bool setInlineMaxCodeUnits(size_t units);
}; };
} }
#endif //SANDHOOK_ART_COMPILER_OPTIONS_H #endif //ART_COMPILER_OPTIONS_H
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
namespace art { namespace art {
namespace jit { namespace jit {
//7.0 - 9.0
class JitCompiler { class JitCompiler {
public: public:
virtual ~JitCompiler(); virtual ~JitCompiler();
......
//
// Created by 甘尧 on 2019/1/12.
//
#ifndef SANDHOOK_CAST_COMPILER_OPTIONS_H
#define SANDHOOK_CAST_COMPILER_OPTIONS_H
#include "cast.h"
#include "art_compiler_options.h"
namespace SandHook {
class CastCompilerOptions {
public:
static void init(JNIEnv *jniEnv);
static IMember<art::CompilerOptions, size_t>* inlineMaxCodeUnits;
};
}
#endif //SANDHOOK_CAST_COMPILER_OPTIONS_H
...@@ -8,6 +8,9 @@ ...@@ -8,6 +8,9 @@
#include <jni.h> #include <jni.h>
#include "dlfcn_nougat.h" #include "dlfcn_nougat.h"
#include "dlfcn.h" #include "dlfcn.h"
#include <memory>
#include "../includes/art_compiler_options.h"
#include "../includes/art_jit.h"
extern "C" { extern "C" {
...@@ -20,6 +23,10 @@ extern "C" { ...@@ -20,6 +23,10 @@ extern "C" {
bool canGetObject(); bool canGetObject();
jobject getJavaObject(JNIEnv* env, void* thread, void* address); jobject getJavaObject(JNIEnv* env, void* thread, void* address);
art::jit::JitCompiler* getGlobalJitCompiler();
art::CompilerOptions* getGlobalCompilerOptions();
} }
#endif //SANDHOOK_HIDE_API_H #endif //SANDHOOK_HIDE_API_H
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include "includes/trampoline_manager.h" #include "includes/trampoline_manager.h"
#include "includes/hide_api.h" #include "includes/hide_api.h"
#include "includes/log.h" #include "includes/log.h"
#include "includes/cast_compiler_options.h"
SandHook::TrampolineManager trampolineManager; SandHook::TrampolineManager trampolineManager;
...@@ -23,6 +24,7 @@ Java_com_swift_sandhook_SandHook_initNative(JNIEnv *env, jclass type, jint sdk) ...@@ -23,6 +24,7 @@ Java_com_swift_sandhook_SandHook_initNative(JNIEnv *env, jclass type, jint sdk)
// TODO // TODO
SDK_INT = sdk; SDK_INT = sdk;
SandHook::CastArtMethod::init(env); SandHook::CastArtMethod::init(env);
SandHook::CastCompilerOptions::init(env);
trampolineManager.init(SandHook::CastArtMethod::entryPointQuickCompiled->getOffset()); trampolineManager.init(SandHook::CastArtMethod::entryPointQuickCompiled->getOffset());
initHideApi(env); initHideApi(env);
return JNI_TRUE; return JNI_TRUE;
...@@ -345,6 +347,24 @@ Java_com_swift_sandhook_SandHook_is64Bit(JNIEnv *env, jclass type) { ...@@ -345,6 +347,24 @@ Java_com_swift_sandhook_SandHook_is64Bit(JNIEnv *env, jclass type) {
return BYTE_POINT == 8; return BYTE_POINT == 8;
} }
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_swift_sandhook_SandHook_disableVMInline(JNIEnv *env, jclass type) {
if (SDK_INT < ANDROID_N)
return JNI_FALSE;
art::CompilerOptions* compilerOptions = getGlobalCompilerOptions();
if (compilerOptions == nullptr)
return JNI_FALSE;
size_t originOptions = compilerOptions->getInlineMaxCodeUnits();
//maybe a real inlineMaxCodeUnits
if (originOptions > 0 && originOptions < 10000) {
compilerOptions->setInlineMaxCodeUnits(0);
return JNI_TRUE;
} else {
return JNI_FALSE;
}
}
extern "C" extern "C"
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_com_swift_sandhook_test_TestClass_jni_1test(JNIEnv *env, jobject instance) { Java_com_swift_sandhook_test_TestClass_jni_1test(JNIEnv *env, jobject instance) {
......
...@@ -3,9 +3,6 @@ ...@@ -3,9 +3,6 @@
// //
#include "../includes/hide_api.h" #include "../includes/hide_api.h"
#include "../includes/arch.h" #include "../includes/arch.h"
#include <memory>
#include "../includes/art_compiler_options.h"
#include "../includes/art_jit.h"
extern int SDK_INT; extern int SDK_INT;
...@@ -21,6 +18,8 @@ extern "C" { ...@@ -21,6 +18,8 @@ extern "C" {
jobject (*addWeakGlobalRef)(JavaVM *, void *, void *) = nullptr; jobject (*addWeakGlobalRef)(JavaVM *, void *, void *) = nullptr;
art::jit::JitCompiler** globalJitCompileHandlerAddr = nullptr;
void initHideApi(JNIEnv* env) { void initHideApi(JNIEnv* env) {
...@@ -54,7 +53,7 @@ extern "C" { ...@@ -54,7 +53,7 @@ extern "C" {
"_ZN3art3Dbg8ResumeVMEv")); "_ZN3art3Dbg8ResumeVMEv"));
} }
} }
//init for getObject //init for getObject & JitCompiler
if (SDK_INT < 23) { if (SDK_INT < 23) {
void *handle = dlopen("libart.so", RTLD_LAZY | RTLD_GLOBAL); void *handle = dlopen("libart.so", RTLD_LAZY | RTLD_GLOBAL);
addWeakGlobalRef = (jobject (*)(JavaVM *, void *, void *)) dlsym(handle, addWeakGlobalRef = (jobject (*)(JavaVM *, void *, void *)) dlsym(handle,
...@@ -77,15 +76,17 @@ extern "C" { ...@@ -77,15 +76,17 @@ extern "C" {
addWeakGloablReferenceSymbol); addWeakGloablReferenceSymbol);
//try disable inline ! //try disable inline !
void* jitCompileHandlerGlobalAddr = fake_dlsym(handle, "_ZN3art3jit3Jit20jit_compiler_handle_E"); globalJitCompileHandlerAddr = reinterpret_cast<art::jit::JitCompiler **>(fake_dlsym(handle, "_ZN3art3jit3Jit20jit_compiler_handle_E"));
art::jit::JitCompiler* jitCompileHandlerGlobal = *reinterpret_cast<art::jit::JitCompiler**>(jitCompileHandlerGlobalAddr);
art::jit::JitCompiler* jitCompileHandlerTemp = static_cast<art::jit::JitCompiler *>(jitCompilerHandle);
if (jitCompileHandlerGlobal == nullptr) { // art::jit::JitCompiler* jitCompileHandlerGlobal = *reinterpret_cast<art::jit::JitCompiler**>(jitCompileHandlerGlobalAddr);
return; // art::jit::JitCompiler* jitCompileHandlerTemp = static_cast<art::jit::JitCompiler *>(jitCompilerHandle);
} // if (jitCompileHandlerGlobal == nullptr) {
art::CompilerOptions* options = jitCompileHandlerGlobal->compilerOptions.get(); // return;
Size inlineUnit = options->inline_max_code_units_; // }
options->inline_max_code_units_ = 0; // art::CompilerOptions* options = jitCompileHandlerGlobal->compilerOptions.get();
// Size inlineUnit = options->inline_max_code_units_;
// options->inline_max_code_units_ = 0;
} }
} }
...@@ -132,5 +133,20 @@ extern "C" { ...@@ -132,5 +133,20 @@ extern "C" {
return result; return result;
} }
art::jit::JitCompiler* getGlobalJitCompiler() {
if (SDK_INT < ANDROID_N)
return nullptr;
if (globalJitCompileHandlerAddr == nullptr || globalJitCompileHandlerAddr <= 0)
return nullptr;
return *globalJitCompileHandlerAddr;
}
art::CompilerOptions* getGlobalCompilerOptions() {
art::jit::JitCompiler* compiler = getGlobalJitCompiler();
if (compiler == nullptr)
return nullptr;
return compiler->compilerOptions.get();
}
} }
...@@ -313,6 +313,8 @@ public class SandHook { ...@@ -313,6 +313,8 @@ public class SandHook {
public static native boolean is64Bit(); public static native boolean is64Bit();
public static native boolean disableVMInline();
@FunctionalInterface @FunctionalInterface
public interface HookModeCallBack { public interface HookModeCallBack {
int hookMode(Member originMethod); int hookMode(Member originMethod);
......
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