duplex_hook.rs (1235B) - raw
1 use std::ffi::c_void; 2 3 use jni::{objects::JObject, sys::jboolean, JNIEnv}; 4 5 use crate::{common, def_hook, dobby_hook, util::get_jni_string}; 6 7 8 def_hook!( 9 is_same_object, 10 jboolean, 11 |env: JNIEnv, obj1: JObject, obj2: JObject| { 12 let mut env = env; 13 14 if obj1.is_null() || obj2.is_null() { 15 return is_same_object_original.unwrap()(env, obj1, obj2); 16 } 17 18 let class = env.find_class("java/lang/Class").unwrap(); 19 20 if !env.is_instance_of(&obj1, class).unwrap() { 21 return is_same_object_original.unwrap()(env, obj1, obj2); 22 } 23 24 let obj1_class_name = env.call_method(&obj1, "getName", "()Ljava/lang/String;", &[]).unwrap().l().unwrap().into(); 25 let class_name = get_jni_string(&mut env, obj1_class_name).expect("Failed to get class name"); 26 27 if class_name.contains("com.snapchat.client.duplex.MessageHandler") { 28 debug!("is_same_object hook: MessageHandler"); 29 return 0; 30 } 31 32 is_same_object_original.unwrap()(env, obj1, obj2) 33 } 34 ); 35 36 37 pub fn init() { 38 common::attach_jni_env(|env| { 39 dobby_hook!((**env.get_native_interface()).IsSameObject.unwrap() as *mut c_void, is_same_object); 40 }); 41 }