0
点赞
收藏
分享

微信扫一扫

浅谈Javascript虚拟列表(virtaul list)改造成虚拟表格(virtaul table)的技术

芥子书屋 03-27 07:00 阅读 3

🛫 系列文章导航

▒ 目录 ▒

🛫 导读

开发环境

版本号描述
文章日期2024-03-24
操作系统Win11 - 22H222621.2715
node -vv20.10.0
npm -v10.2.3
夜神模拟器7.0.5.8
Android9
python3.9.9
frida16.2.1
frida-tools12.3.0
objection1.11.0

1️⃣ Android App 代码介绍

中文内部类和方法

重载函数

public class MainActivity extends AppCompatActivity {

    void fun(int x , int y ){
        Log.d("yemao.sum" , String.valueOf(x+y));
    }
    String fun(String x){
        return x.toLowerCase();
    }
}

成员变量及静态函数

public class MainActivity extends AppCompatActivity {
    private String total = "hello";

    void secret(){
        total += " secretFunc";
        Log.d("yemao.secret" , "this is secret func");
    }
    static void staticSecret(){
        Log.d("yemao.secret" , "this is static secret func");
    }

}

2️⃣ 普通函数HOOK

Java.perform


function main() {
  普通函数()
  重载函数()
  构造函数()
  函数主动调用()
}


Java.perform(main)

操作步骤


function 普通函数() {
  var cls = Java.use('com.yemao.demo.MainActivity$非重载测试类')
  console.log("Java.Use.Successfully!") //定位类成功!
  cls['中文方法'].implementation = function(x: number, y: number) {
      console.log("[普通函数] x => ",x,", y => ",y)
      // this['中文方法'] 可以获得Hook之前的函数,可以直接调用之前的函数
      // 这时候,可以根据自己的需求,修改参数等!!!
      var ret_value = this['中文方法'](x, y);
      return ret_value
  }
}

3️⃣ 重载函数HOOK


function 普通函数() {
  var MainAcitivity = Java.use('com.yemao.demo.MainActivity')
  console.log("Java.Use.Successfully!") //定位类成功!
  MainAcitivity.fun.overload('int', 'int').implementation = function(x: number, y: number) {
    console.log("[重载函数] x => ",x,", y => ",y)
    var ret_value = this.fun(x, y);
    return ret_value
  }
}

4️⃣ 构造函数HOOK


function 普通函数() {
  var cls = Java.use('com.yemao.demo.MainActivity$非重载测试类')
  console.log("Java.Use.Successfully!") //定位类成功!
  cls.$init.implementation = function(mainAcitivity) {
      console.log("[构造函数] ===")
      var ret_value = this.$init(mainAcitivity);
      return ret_value
  }
}

5️⃣ 函数主动调用


function 函数主动调用() {
  var MainAcitivity = Java.use('com.yemao.demo.MainActivity')
  console.log("Java.Use.Successfully! 函数主动调用") //定位类成功!
    
  // 静态函数主动调用
  MainAcitivity.staticSecret();

  // Error: secret: cannot call instance method without an instance
  // MainAcitivity.secret();


  // 动态函数主动调用
  Java.choose('com.yemao.demo.MainActivity',{
    onMatch: function(instance){
      console.log('instance found',instance)
      instance.secret()
    },
    onComplete: function(){
      console.log('search Complete')
    }
  })
}

🛬 文章小结

frida api释义

函数名参数返回值含义
Java.perform函数任何对App中Java层的操作都必须包裹在这个函数
中,否则Frida运行起来后就会报错
Java.useclassNameJavaScript wrapper动态获取类实例对象
MainAcitivity.fun.implementation函数实现
MainAcitivity.fun.overload参数数组重载函数中,区分不同的函数
Java.chooseclassName, callbacks枚举className的实例对象,调用callbacks处理回调逻辑

📖 参考资料

举报

相关推荐

0 条评论