diff --git a/lsplant/src/main/jni/logging.hpp b/lsplant/src/main/jni/logging.hpp index a4404bf..5253d38 100644 --- a/lsplant/src/main/jni/logging.hpp +++ b/lsplant/src/main/jni/logging.hpp @@ -7,11 +7,11 @@ #endif #ifdef LOG_DISABLED -#define LOGD(...) -#define LOGV(...) -#define LOGI(...) -#define LOGW(...) -#define LOGE(...) +#define LOGD(...) 0 +#define LOGV(...) 0 +#define LOGI(...) 0 +#define LOGW(...) 0 +#define LOGE(...) 0 #else #ifndef NDEBUG #define LOGD(fmt, ...) \ @@ -25,8 +25,8 @@ ": " fmt, \ __FILE_NAME__, __LINE__, __PRETTY_FUNCTION__ __VA_OPT__(, ) __VA_ARGS__) #else -#define LOGD(...) -#define LOGV(...) +#define LOGD(...) 0 +#define LOGV(...) 0 #endif #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__) diff --git a/lsplant/src/main/jni/lsplant.cc b/lsplant/src/main/jni/lsplant.cc index 6aafda2..d0cf428 100644 --- a/lsplant/src/main/jni/lsplant.cc +++ b/lsplant/src/main/jni/lsplant.cc @@ -89,6 +89,11 @@ jclass executable = nullptr; jclass path_class_loader = nullptr; jmethodID path_class_loader_init = nullptr; +constexpr auto kInternalMethods = std::make_tuple( + &method_get_name, &method_get_declaring_class, &class_get_name, &class_get_class_loader, + &class_get_declared_constructors, &in_memory_class_loader_init, &load_class, &set_accessible, + &path_class_loader_init); + std::string generated_class_name; std::string generated_source_name; std::string generated_field_name; @@ -604,6 +609,13 @@ using ::lsplant::IsHooked; JNI_SetStaticObjectField(env, built_class, hooker_field, hooker_object); if (DoHook(target, hook, backup)) { + std::apply( + [backup_method, target_method_id = env->FromReflectedMethod(target_method)](auto... v) { + ((*v == target_method_id && + (LOGD("Propagate internal used method because of hook"), *v = backup_method)) || + ...); + }, + kInternalMethods); jobject global_backup = JNI_NewGlobalRef(env, reflected_backup); RecordHooked(target, target->GetDeclaringClass()->GetClassDef(), global_backup, backup); if (!is_proxy) [[likely]] { @@ -645,8 +657,19 @@ using ::lsplant::IsHooked; } } } + auto *backup_method = env->FromReflectedMethod(reflected_backup); env->DeleteGlobalRef(reflected_backup); - return DoUnHook(target, backup); + if (DoUnHook(target, backup)) { + std::apply( + [backup_method, target_method_id = env->FromReflectedMethod(target_method)](auto... v) { + ((*v == backup_method && (LOGD("Propagate internal used method because of unhook"), + *v = target_method_id)) || + ...); + }, + kInternalMethods); + return true; + } + return false; } [[maybe_unused]] bool IsHooked(JNIEnv *env, jobject method) { diff --git a/test/src/main/jni/logging.h b/test/src/main/jni/logging.h index 703d424..09f4011 100644 --- a/test/src/main/jni/logging.h +++ b/test/src/main/jni/logging.h @@ -28,18 +28,18 @@ #endif #ifdef LOG_DISABLED -#define LOGD(...) -#define LOGV(...) -#define LOGI(...) -#define LOGW(...) -#define LOGE(...) +#define LOGD(...) 0 +#define LOGV(...) 0 +#define LOGI(...) 0 +#define LOGW(...) 0 +#define LOGE(...) 0 #else #ifndef NDEBUG #define LOGD(fmt, ...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, "%s:%d#%s" ": " fmt, __FILE_NAME__, __LINE__, __PRETTY_FUNCTION__ __VA_OPT__(,) __VA_ARGS__) #define LOGV(fmt, ...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "%s:%d#%s" ": " fmt, __FILE_NAME__, __LINE__, __PRETTY_FUNCTION__ __VA_OPT__(,) __VA_ARGS__) #else -#define LOGD(...) -#define LOGV(...) +#define LOGD(...) 0 +#define LOGV(...) 0 #endif #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)