参数定位
对于一个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);
};
});
};