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.
src/main/cpp/utils/utils.cpp
src/main/cpp/utils/offset.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_compiler_options.cpp
src/main/cpp/trampoline/arch/arm32.S
src/main/cpp/trampoline/arch/arm64.S
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 @@
// Created by 甘尧 on 2019/2/23.
//
#ifndef SANDHOOK_ART_COMPILER_OPTIONS_H
#define SANDHOOK_ART_COMPILER_OPTIONS_H
#ifndef ART_COMPILER_OPTIONS_H
#define ART_COMPILER_OPTIONS_H
#include "arch.h"
#include <stddef.h>
namespace art {
class CompilerOptions {
public:
void* compiler_filter_;
Size huge_method_threshold_;
Size large_method_threshold_;
Size small_method_threshold_;
Size tiny_method_threshold_;
Size num_dex_methods_threshold_;
Size inline_depth_limit_;
Size inline_max_code_units_;
size_t huge_method_threshold_;
size_t large_method_threshold_;
size_t small_method_threshold_;
size_t tiny_method_threshold_;
size_t num_dex_methods_threshold_;
size_t inline_depth_limit_;
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 @@
namespace art {
namespace jit {
//7.0 - 9.0
class JitCompiler {
public:
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 @@
#include <jni.h>
#include "dlfcn_nougat.h"
#include "dlfcn.h"
#include <memory>
#include "../includes/art_compiler_options.h"
#include "../includes/art_jit.h"
extern "C" {
......@@ -20,6 +23,10 @@ extern "C" {
bool canGetObject();
jobject getJavaObject(JNIEnv* env, void* thread, void* address);
art::jit::JitCompiler* getGlobalJitCompiler();
art::CompilerOptions* getGlobalCompilerOptions();
}
#endif //SANDHOOK_HIDE_API_H
......@@ -3,6 +3,7 @@
#include "includes/trampoline_manager.h"
#include "includes/hide_api.h"
#include "includes/log.h"
#include "includes/cast_compiler_options.h"
SandHook::TrampolineManager trampolineManager;
......@@ -23,6 +24,7 @@ Java_com_swift_sandhook_SandHook_initNative(JNIEnv *env, jclass type, jint sdk)
// TODO
SDK_INT = sdk;
SandHook::CastArtMethod::init(env);
SandHook::CastCompilerOptions::init(env);
trampolineManager.init(SandHook::CastArtMethod::entryPointQuickCompiled->getOffset());
initHideApi(env);
return JNI_TRUE;
......@@ -345,6 +347,24 @@ Java_com_swift_sandhook_SandHook_is64Bit(JNIEnv *env, jclass type) {
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"
JNIEXPORT void JNICALL
Java_com_swift_sandhook_test_TestClass_jni_1test(JNIEnv *env, jobject instance) {
......
......@@ -3,9 +3,6 @@
//
#include "../includes/hide_api.h"
#include "../includes/arch.h"
#include <memory>
#include "../includes/art_compiler_options.h"
#include "../includes/art_jit.h"
extern int SDK_INT;
......@@ -21,6 +18,8 @@ extern "C" {
jobject (*addWeakGlobalRef)(JavaVM *, void *, void *) = nullptr;
art::jit::JitCompiler** globalJitCompileHandlerAddr = nullptr;
void initHideApi(JNIEnv* env) {
......@@ -54,7 +53,7 @@ extern "C" {
"_ZN3art3Dbg8ResumeVMEv"));
}
}
//init for getObject
//init for getObject & JitCompiler
if (SDK_INT < 23) {
void *handle = dlopen("libart.so", RTLD_LAZY | RTLD_GLOBAL);
addWeakGlobalRef = (jobject (*)(JavaVM *, void *, void *)) dlsym(handle,
......@@ -77,15 +76,17 @@ extern "C" {
addWeakGloablReferenceSymbol);
//try disable inline !
void* jitCompileHandlerGlobalAddr = 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) {
return;
}
art::CompilerOptions* options = jitCompileHandlerGlobal->compilerOptions.get();
Size inlineUnit = options->inline_max_code_units_;
options->inline_max_code_units_ = 0;
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) {
// return;
// }
// 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" {
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 {
public static native boolean is64Bit();
public static native boolean disableVMInline();
@FunctionalInterface
public interface HookModeCallBack {
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