1.hook 构造函数 $init 例子,String 的构造函数 是不能这样hook的,具体示例在笔记二
var money=java.use("com.aisj.hook.Money");
money.$init.implementation=function(a,b){
console.log("money.$init",a)
return this.$init(a,b);
}
2.对于自定义列表数据的打印 例子
var utils=java.use(com.xjsbh.hook.Utils);
var stringBuilder=java.use("java.lang.StringBuilder");
utils.shufferMap.implementation=function(a){
var key=a.keySet();
var it=key.iterator();
var result=stringBuilder.$new();
while(it.hasNext()){
var keystr=it.next();
var valuestr=a.get(keystr);
result.append(valuestr);
}
console.log("utils.shufferMap:",result.toString());
}
3.hook 方法的所有重载 例子:
var utils=java.use("com.xjshs.hook.Utils");
var overloadsArr=utils.getCalc.overloads;
for(var i=0;i<overloadsArr.length;i++){
var params=""
for(var j=0;j<arguments.length;j++){
params+=arguments[l]+" ";
}
console.log(params);
}
return this.getCalc.apply(this,arguments);
4.如果字段名和方法名一样,都存在的时候 需要加下划线前缀 获取属性 例子
在内存中扫描 Java 堆,枚举 Java 对象(className)实例。比如可以使用 java.lang.String
扫描内存中的字符串。callbacks 提供两个参数:onMatch(instance)
和 onComplete
,分别是找到匹配对象和扫描完成调用。
//获取方法中某个名字字段
java.choose("com.sndlsd.hook.BanCard",{
onMatch:function(obj){
console.log("java.choose.BankCard"",obj._accountName.value);
},onComplete:function(){
}
});
5.hook 匿名类 一般都是 包名.类名$1 1代表是当前类名第几个匿名类 也可以用以前的那个遍历类的
6.如果碰到混淆函数名,可以尝试用base64 加密 解密 hook
//这个是base64 的hook例子
var money=java.use("com.xiaojianbang.hook.Money");
var base64=java.use("android.util.Base64");
var str=java.use("java.lang.String");
var funcName=str.$new(base64.decode("c2FkYW5rICAgICBkYUAj",0));
console.log(funcName);
money[funcName].implementation=function(){
var result=money[funcName]();
console.log(result);
return result;
}
或者用dexlib2 去生成新的dex
7. 枚举所有已经加载的类
console.log(java.enumerateLoadedClassesSync().join("\n"));