Skip to content

Commit c0a4e7c

Browse files
committedJan 29, 2021
Call MakeInitializedClassVisibilyInitialized when pending hook is off
1 parent 1dd3d39 commit c0a4e7c

File tree

4 files changed

+39
-2
lines changed

4 files changed

+39
-2
lines changed
 

‎hooklib/src/main/cpp/includes/hide_api.h

+2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ extern "C" {
5454
JNIEnv *attachAndGetEvn();
5555

5656
ArtMethod* getArtMethod(JNIEnv *env, jobject method);
57+
58+
void MakeInitializedClassVisibilyInitialized(void* self);
5759
}
5860

5961
#endif //SANDHOOK_HIDE_API_H

‎hooklib/src/main/cpp/sandhook.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,12 @@ JNIEXPORT bool nativeHookNoBackup(void* origin, void* hook) {
410410
return trampolineManager.installNativeHookTrampolineNoBackup(origin, hook) != nullptr;
411411

412412
}
413-
413+
extern "C"
414+
JNIEXPORT void JNICALL
415+
Java_com_swift_sandhook_SandHook_MakeInitializedClassVisibilyInitialized(JNIEnv *env, jclass clazz,
416+
jlong self) {
417+
MakeInitializedClassVisibilyInitialized(reinterpret_cast<void*>(self));
418+
}
414419
extern "C"
415420
JNIEXPORT void* findSym(const char *elf, const char *sym_name) {
416421
SandHook::ElfImg elfImg(elf);
@@ -497,6 +502,11 @@ static JNINativeMethod jniSandHook[] = {
497502
"initForPendingHook",
498503
"()Z",
499504
(void *) Java_com_swift_sandhook_SandHook_initForPendingHook
505+
},
506+
{
507+
"MakeInitializedClassVisibilyInitialized",
508+
"(J)V",
509+
(void*) Java_com_swift_sandhook_SandHook_MakeInitializedClassVisibilyInitialized
500510
}
501511
};
502512

‎hooklib/src/main/cpp/utils/hide_api.cpp

+23-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "../includes/log.h"
88
#include "../includes/utils.h"
99
#include "../includes/trampoline_manager.h"
10+
#include "../includes/art_runtime.h"
1011

1112
extern int SDK_INT;
1213

@@ -61,6 +62,10 @@ extern "C" {
6162

6263
void (*backup_update_methods_code)(void *, ArtMethod *, const void *) = nullptr;
6364

65+
void* (*make_initialized_classes_visibly_initialized_)(void*, void*, bool) = nullptr;
66+
67+
void* runtime_instance_ = nullptr;
68+
6469
void initHideApi(JNIEnv* env) {
6570

6671
env->GetJavaVM(&jvm);
@@ -176,6 +181,7 @@ extern "C" {
176181
}
177182
}
178183

184+
runtime_instance_ = *reinterpret_cast<void**>(getSymCompat(art_lib_path, "_ZN3art7Runtime9instance_E"));
179185
}
180186

181187
bool canCompile() {
@@ -334,6 +340,19 @@ extern "C" {
334340
backup_update_methods_code(thiz, artMethod, quick_code);
335341
}
336342

343+
void MakeInitializedClassVisibilyInitialized(void* self){
344+
if(make_initialized_classes_visibly_initialized_) {
345+
#ifdef __LP64__
346+
constexpr size_t OFFSET_classlinker = 472;
347+
#else
348+
constexpr size_t OFFSET_classlinker = 276;
349+
#endif
350+
void *thiz = *reinterpret_cast<void **>(
351+
reinterpret_cast<size_t>(runtime_instance_) + OFFSET_classlinker);
352+
make_initialized_classes_visibly_initialized_(thiz, self, true);
353+
}
354+
}
355+
337356
bool hookClassInit(void(*callback)(void*)) {
338357
if (SDK_INT >= ANDROID_R) {
339358
void *symMarkClassInitialized = getSymCompat(art_lib_path,
@@ -352,7 +371,10 @@ extern "C" {
352371
backup_update_methods_code = reinterpret_cast<void (*)(void *, ArtMethod *, const void*)>(hook_native(
353372
symUpdateMethodsCode, (void *) replaceUpdateMethodsCode));
354373

355-
if (backup_mark_class_initialized) {
374+
make_initialized_classes_visibly_initialized_ = reinterpret_cast<void* (*)(void*, void*, bool)>(
375+
getSymCompat(art_lib_path, "_ZN3art11ClassLinker40MakeInitializedClassesVisiblyInitializedEPNS_6ThreadEb"));
376+
377+
if (backup_mark_class_initialized && backup_update_methods_code) {
356378
class_init_callback = callback;
357379
return true;
358380
} else {

‎hooklib/src/main/java/com/swift/sandhook/SandHook.java

+3
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ public static synchronized void hook(HookWrapper.HookEntity entity) throws HookE
9797
return;
9898
} else if (entity.initClass) {
9999
resolveStaticMethod(target);
100+
MakeInitializedClassVisibilyInitialized(getThreadId());
100101
}
101102

102103
resolveStaticMethod(backup);
@@ -403,6 +404,8 @@ public static boolean tryDisableProfile(String selfPackageName) {
403404

404405
public static native boolean initForPendingHook();
405406

407+
public static native void MakeInitializedClassVisibilyInitialized(long self);
408+
406409
@FunctionalInterface
407410
public interface HookModeCallBack {
408411
int hookMode(Member originMethod);

0 commit comments

Comments
 (0)
Please sign in to comment.