参数定位

​ 对于一个app来讲,我们往往要获得的是其加密参数,一般来讲,都是通过对网络请求抓包,然后分析参数逻辑,确定加密位置,但是,这样有一个弊端,假使存在了针对抓包的对抗(sslping等),就会增加定位参数的逻辑成本,基于此,本文提供了另一种思路用于定位参数逻辑。

Intent

​ 一般来讲,页面跳转都存在序列化->反序列化的逻辑。

btnTwo.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                // 创建一个Bundle对象封装数据
                Bundle data = new Bundle();
                data.putInt("age",18);
                data.putString("name", "Jack");
                intent.putExtra("data", data);
                startActivity(intent);
            }
        });
// 第二个页面
Bundle data = getIntent().getBundleExtra("data");
int id = data.getInt("age");

​ 这里的逻辑是给按钮绑定点击事件,然后,startActivity就是页面跳转的逻辑,然后就把第一页的数据传到了第二页。

// 打印调用堆栈
function printStack() {
    Java.perform(function () {
        var Exception = Java.use("java.lang.Exception");
        var ins = Exception.$new("Exception");
        var straces = ins.getStackTrace();
        if (straces != undefined && straces != null) {
            var strace = straces.toString();
            var replaceStr = strace.replace(/,/g, "\r\n");
            console.log("=============================Stack strat=======================");
            console.log(replaceStr);
            console.log("=============================Stack end=======================\r\n");
            Exception.$dispose();
        }
    });
}


// hook intent
function hookintent() {
    Java.perform(function(){
        let Intent = Java.use("android.content.Intent");
        // 要注意这里的重载类型
        Intent.putExtra.overload('java.lang.String', 'android.os.Bundle').implementation = function(a, b){
            console.log("hook intent")
            printStack()
            return this.putExtra(a, b);
        };

    })
};
TextView

​ 第二种就是Hook Android 原生组件,因为,数据如何传输,最终还是会渲染到页面上,这样只需要,hook对应的组件,打印调用堆栈,就能定位到入口。

// hook setText
function hooksetText(){
    Java.perform(function(){
        let TextView = Java.use("android.widget.TextView");
        var stringClzz = Java.use('java.lang.String');
        TextView.setText.overload('java.lang.CharSequence').implementation = function(a){
            console.log("hook text View")
            var obj1= Java.cast(a, stringClzz); // 类型转化
            console.log(obj1);
            if( obj1.indexOf("test") > -1) {
                printStack();
            };
            return this.setText(a);
        };

    });
};

缺点就是,只能应对原生组件

Dialog

​ 第三种,就是hook弹窗。

function hookdialog(){
    Java.perform(function(){
        let Builder = Java.use("androidx.appcompat.app.AlertDialog$Builder");
        var stringClzz = Java.use('java.lang.String');
        console.log('hook dialog');
        Builder.setMessage.overload('java.lang.CharSequence').implementation = function(a){
            console.log("hook dialog1");
            var obj1= Java.cast(a, stringClzz); // 类型转化
            console.log(obj1);
            printStack()
            return this.setMessage(a);
        };

    });
};
Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

Mr2 WeChat Pay

WeChat Pay