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 }