Java层主动调用

主要学习内容:
Java.choose(className, callback)
在内存中扫描 Java 堆,枚举 Java 对象(className)实例。比如可以使用 java.lang.String 扫描内存中的字符串。callbacks 提供两个参数:onMatch(instance) 和 onComplete,分别是找到匹配对象和扫描完成调用。

代码清单  MainActivity.java

package com.roysue.demo02;

import androidx.appcompat.app.AppCompatActivity;


import android.os.Bundle;
import android.util.Log;



public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        while(true){
            try{
                Thread.sleep(1000);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
            fun(50, 30);
            Log.d("rOysue.String", fun("LoWeRcAsE Me!!!!!!!"));
        }
    }
    void fun(int x, int y){
        Log.d("rOysue.sum", String.valueOf(x+y));
    }
    String fun(String x){
        return x.toLowerCase();
    }

    void secret(){
        Log.d("rOysue.secret", "this is secret func");
    }
    static void staticSecret(){
        Log.d("rOysue.secret", "this is static secret func");
    }

}

原书代码 3.js

function main(){
    console.log("Script loaded successfully")
    Java.perform(function(){
        console.log("Inside java perform function")

        var MainActivity = Java.use('com.roysue.demo02.MainActivity')
        MainActivity.staticSecret()
       
        Java.choose('com.roysue.demo02.MainActivity',{
            onMatch: function (instance) {
                console.log("instance found:", instance);
                instance.secret()
            },
            onComplete: function () {
                console.log("search Complete");
            }
        })
    })
}
setImmediate(main)

 

可修改代码 3.js

function main(){
    console.log("Script loaded successfully")
    Java.perform(function x(){
        console.log("Inside java perform function")

        var MainActivity = Java.use('com.roysue.demo02.MainActivity')
        MainActivity.fun.overload('java.lang.String').implementation = function (str) {
            //打印参数
            console.log("original call : str:" + str);
            //修改结果
            var ret_value = "sakura";
            return ret_value;
        };

        Java.choose('com.roysue.demo02.MainActivity',{
            onMatch: function (x) {
                console.log("find instance :" + x);
                console.log("result of secret func:" + x.secret());
            },
            onComplete: function () {
                console.log("end");
            }
        });
    });
}
setImmediate(main)

 

在代码清单脚本中,可以发现静态的staticSecret()函数和Hook使用的方式大同小异,都是Java.use这个API去获取MainActivity类,在获取对应的类对象后通过“.”连接符连接staticSecret方法名,最终以和Java中一样的方式直接调用静态方法staticSecret()函数;动态方法secret需要先通过Java.choose这个API从内存中获取相应的类的实例对象,然后才能通过这个实例对象去调用动态的secret函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值