Fix soft reboot of YAHFA (Fix OatQuickMethodHeader issue)
This commit is contained in:
parent
b04d830fba
commit
0ba98eaf62
|
|
@ -10,10 +10,6 @@
|
||||||
|
|
||||||
namespace art {
|
namespace art {
|
||||||
namespace art_method {
|
namespace art_method {
|
||||||
|
|
||||||
inline static size_t oat_header_length;
|
|
||||||
inline static int32_t oat_header_code_length_offset;
|
|
||||||
|
|
||||||
CREATE_MEM_FUNC_SYMBOL_ENTRY(std::string, PrettyMethod, void *thiz, bool with_signature) {
|
CREATE_MEM_FUNC_SYMBOL_ENTRY(std::string, PrettyMethod, void *thiz, bool with_signature) {
|
||||||
if (UNLIKELY(thiz == nullptr))
|
if (UNLIKELY(thiz == nullptr))
|
||||||
return "null";
|
return "null";
|
||||||
|
|
@ -26,67 +22,8 @@ namespace art {
|
||||||
return PrettyMethod(thiz, true);
|
return PrettyMethod(thiz, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// CREATE_MEM_HOOK_STUB_ENTRIES(
|
|
||||||
// LP_SELECT("_ZN3art9ArtMethod23GetOatQuickMethodHeaderEj", "_ZN3art9ArtMethod23GetOatQuickMethodHeaderEm"),
|
|
||||||
// void *, GetOatQuickMethodHeader,
|
|
||||||
// (void * thiz, uintptr_t pc), {
|
|
||||||
// // This is a partial copy from AOSP. We only touch them if they are hooked.
|
|
||||||
// if (UNLIKELY(edxp::isHooked(thiz))) {
|
|
||||||
// uintptr_t original_ep =
|
|
||||||
// reinterpret_cast<uintptr_t>(getOriginalEntryPointFromTargetMethod(
|
|
||||||
// thiz)) & ~0x1;
|
|
||||||
// if (original_ep) {
|
|
||||||
// char *code_length_loc =
|
|
||||||
// reinterpret_cast<char *>(original_ep) +
|
|
||||||
// oat_header_code_length_offset;
|
|
||||||
// uint32_t code_length =
|
|
||||||
// *reinterpret_cast<uint32_t *>(code_length_loc) &
|
|
||||||
// ~0x80000000u;
|
|
||||||
// LOGD("art_method::GetOatQuickMethodHeader: ArtMethod=%p (%s), isHooked=true, original_ep=0x%zux, code_length=0x%x, pc=0x%zux",
|
|
||||||
// thiz, PrettyMethod(thiz).c_str(),
|
|
||||||
// original_ep, code_length, pc);
|
|
||||||
// if (original_ep <= pc &&
|
|
||||||
// pc <= original_ep + code_length)
|
|
||||||
// return reinterpret_cast<void *>(
|
|
||||||
// original_ep -
|
|
||||||
// oat_header_length);
|
|
||||||
// // If PC is not in range, we mark it as not found.
|
|
||||||
// LOGD("art_method::GetOatQuickMethodHeader: PC not found in current method.");
|
|
||||||
// return nullptr;
|
|
||||||
// } else {
|
|
||||||
// LOGD("art_method::GetOatQuickMethodHeader: ArtMethod=%p (%s) isHooked but not backup, fallback to system",
|
|
||||||
// thiz, PrettyMethod(thiz).c_str());
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return backup(thiz, pc);
|
|
||||||
// });
|
|
||||||
|
|
||||||
static void Setup(void *handle, HookFunType hook_func) {
|
static void Setup(void *handle, HookFunType hook_func) {
|
||||||
LOGD("art_method hook setup, handle=%p", handle);
|
LOGD("art_method hook setup, handle=%p", handle);
|
||||||
int api_level = edxp::GetAndroidApiLevel();
|
|
||||||
switch (api_level) {
|
|
||||||
case __ANDROID_API_O__:
|
|
||||||
[[fallthrough]];
|
|
||||||
case __ANDROID_API_O_MR1__:
|
|
||||||
[[fallthrough]];
|
|
||||||
case __ANDROID_API_P__:
|
|
||||||
oat_header_length = 24;
|
|
||||||
oat_header_code_length_offset = -4;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LOGW("No valid offset in SDK %d for oat_header_length, using offset from Android R",
|
|
||||||
api_level);
|
|
||||||
[[fallthrough]];
|
|
||||||
case __ANDROID_API_Q__:
|
|
||||||
[[fallthrough]];
|
|
||||||
case __ANDROID_API_R__:
|
|
||||||
oat_header_length = 8;
|
|
||||||
oat_header_code_length_offset = -4;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// edxp::HookSyms(handle, hook_func, GetOatQuickMethodHeader);
|
|
||||||
|
|
||||||
|
|
||||||
RETRIEVE_MEM_FUNC_SYMBOL(PrettyMethod, "_ZN3art9ArtMethod12PrettyMethodEb");
|
RETRIEVE_MEM_FUNC_SYMBOL(PrettyMethod, "_ZN3art9ArtMethod12PrettyMethodEb");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "base/object.h"
|
|
||||||
#include "art/runtime/art_method.h"
|
|
||||||
|
|
||||||
namespace art {
|
|
||||||
|
|
||||||
namespace jit {
|
|
||||||
|
|
||||||
// CREATE_MEM_HOOK_STUB_ENTRIES("_ZN3art3jit12JitCodeCache37GetSavedEntryPointOfPreCompiledMethodEPNS_9ArtMethodE",
|
|
||||||
// const void*, GetSavedEntryPointOfPreCompiledMethod, (void *thiz,
|
|
||||||
// void *art_method), {
|
|
||||||
// if (UNLIKELY(edxp::isHooked(art_method))) {
|
|
||||||
// LOGD("Found hooked method %p (%s), return entrypoint as jit entrypoint", art_method,
|
|
||||||
// art::art_method::PrettyMethod(art_method).c_str());
|
|
||||||
// return getEntryPoint(art_method);
|
|
||||||
// }
|
|
||||||
// return backup(thiz, art_method);
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
static void HookJitCacheCode(void *handle, HookFunType hook_func) {
|
|
||||||
const int api_level = edxp::GetAndroidApiLevel();
|
|
||||||
// For android R, the invisibly initialization makes static methods initializes multiple
|
|
||||||
// times in non-x86 devices. So we need to hook this function to make sure
|
|
||||||
// our hooked entry point won't be overwritten.
|
|
||||||
// This is for SandHook and YAHFA
|
|
||||||
if (api_level >= __ANDROID_API_R__) {
|
|
||||||
// edxp::HookSyms(handle, hook_func, GetSavedEntryPointOfPreCompiledMethod);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "base/object.h"
|
|
||||||
|
|
||||||
namespace art {
|
|
||||||
|
|
||||||
namespace oat_file_manager {
|
|
||||||
|
|
||||||
CREATE_HOOK_STUB_ENTRIES(
|
|
||||||
"_ZN3art14OatFileManager24SetOnlyUseSystemOatFilesEv", // 9 & 11
|
|
||||||
void, SetOnlyUseSystemOatFiles, (), {
|
|
||||||
return;
|
|
||||||
});
|
|
||||||
|
|
||||||
CREATE_HOOK_STUB_ENTRIES(
|
|
||||||
"_ZN3art14OatFileManager24SetOnlyUseSystemOatFilesEbb", // 10
|
|
||||||
void, SetOnlyUseSystemOatFilesQ, (), {
|
|
||||||
return;
|
|
||||||
});
|
|
||||||
|
|
||||||
// @ApiSensitive(Level.LOW)
|
|
||||||
// http://androidxref.com/9.0.0_r3/xref/art/runtime/oat_file_manager.cc#637
|
|
||||||
static void DisableOnlyUseSystemOatFiles(void *handle, HookFunType hook_func) {
|
|
||||||
const int api_level = edxp::GetAndroidApiLevel();
|
|
||||||
if (api_level >= __ANDROID_API_P__) {
|
|
||||||
edxp::HookSyms(handle, hook_func, SetOnlyUseSystemOatFiles,
|
|
||||||
SetOnlyUseSystemOatFilesQ);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -17,8 +17,6 @@
|
||||||
#include "art/runtime/class_linker.h"
|
#include "art/runtime/class_linker.h"
|
||||||
#include "art/runtime/gc/heap.h"
|
#include "art/runtime/gc/heap.h"
|
||||||
#include "art/runtime/hidden_api.h"
|
#include "art/runtime/hidden_api.h"
|
||||||
#include "art/runtime/oat_file_manager.h"
|
|
||||||
#include "art/runtime/jit/jit_code_cache.h"
|
|
||||||
#include "art/runtime/art_method.h"
|
#include "art/runtime/art_method.h"
|
||||||
#include "art/runtime/instrumentation.h"
|
#include "art/runtime/instrumentation.h"
|
||||||
#include "art/runtime/reflection.h"
|
#include "art/runtime/reflection.h"
|
||||||
|
|
@ -84,8 +82,6 @@ namespace edxp {
|
||||||
art::ClassLinker::Setup(art_handle, hook_func);
|
art::ClassLinker::Setup(art_handle, hook_func);
|
||||||
art::mirror::Class::Setup(art_handle, hook_func);
|
art::mirror::Class::Setup(art_handle, hook_func);
|
||||||
art::JNIEnvExt::Setup(art_handle, hook_func);
|
art::JNIEnvExt::Setup(art_handle, hook_func);
|
||||||
// art::oat_file_manager::DisableOnlyUseSystemOatFiles(art_handle, hook_func);
|
|
||||||
// art::jit::HookJitCacheCode(art_handle, hook_func);
|
|
||||||
art::instrumentation::DisableUpdateHookedMethodsCode(art_handle, hook_func);
|
art::instrumentation::DisableUpdateHookedMethodsCode(art_handle, hook_func);
|
||||||
art::PermissiveAccessByReflection(art_handle, hook_func);
|
art::PermissiveAccessByReflection(art_handle, hook_func);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue