南强小屋 Design By 杰米
typora-root-url: ./
[TOC]
执行
frida -U com.example.androiddemo(包名) -l hook.js(脚本文件名)
hook类里的方法
两个相同的函数名 参数不同
让LogingActivity.a(obj, obj)=obj2即可
即下面那个a函数的返回值=obj2
=> 编写hook脚本,查看a函数的返回值
function hook_java() { java.perform(function () { //包名类名 var LoginActivity = Java.use("com.xxx....Activity.LoginActivity"); // 上面的变量.函数名.implementation 返回值的类型对应上 LoginActivity.a.implementation = function(str, str2) { var result = this.a(str, str2); console.log("LoginActivity.a->",str, str2, result); return result; } });}function main() { hook_java();}setImmediate(main);
因为有两个a函数,要写成如下
function hook_java() { java.perform(function () { //包名类名 var LoginActivity = Java.use("com.xxx....Activity.LoginActivity"); // 上面的变量.函数名.implementation 返回值的类型对应上 //多了 overload('java.lang.String', 'java.lang.String') //会在报错的时候显示出来怎么修改 LoginActivity.a.overload('java.lang.String', 'java.lang.String').implementation = function(str, str2) { var result = this.a(str, str2); console.log("LoginActivity.a->",str, str2, result); return result; } });}function main() { hook_java();}setImmediate(main);
hook函数 返回篡改的值
function hook_java() { java.perform(function () { var FridaActivity1 = Java.use("com.example.androiddemo.Activity.FridaActivity1"); FridaActivity1.a.implementation = function(barr) { console.log("FridaActivity1.a ->") return "jadx反编译出的源码指定的那段字符串"; } });}function main() { hook_java();}setImmediate(main);
主动调用函数
调用静态函数
主动调用 setStatic_bool_var 和 setBool_var 这两个函数,把那两个变量设置为true
function call_FridaActivity2() { Java.perform(function() { var FridaActivity2 = Java.use("com.example.androiddemo.Activity.FridaActivity2"); FridaActivity2.setStatic_bool_var(); //调用静态函数 //非静态 调用非静态静态函数 Java.choose("com.example.androiddemo.Activity.FridaActivity2", { onMatch: function(instance) { instance.setBool_var(); }, onComplete: function(){ } }); });}
hook改变变量的值
静态、非静态、变量名和函数名重合
function call_FridaActivity3() { Java.perform(function() { var FridaActivity3 = Java.use("com.example.androiddemo.Activity.FridaActivity3"); //类名.变量名.value FridaActivity3.static_bool_var.value = true; //静态 console.log(FridaActivity3.static_bool_var.value); //非静态变量 Java.choose("com.example.androiddemo.Activity.FridaActivity3", { onMatch: function(instance) { //设置非静态成员变量的值 instance.bool_var.value = true; //设置有相同函数名的成员变量的值 在变量名前加一个下划线 instance._same_name_bool_var.value = true; console.log(instance.bool_var.value) console.log(instance._same_name_bool_var.value) }, onComplete: function(){ } }); });}
hook类中类
hook内部类 枚举函数
function hook_InnerClasses() { Java.perform(function() { // 中间用$符号连接 var InnerClasses = Java.use("com.example.androiddemo.Activity.FridaActivity4$InnerClasses"); console.log(InnerClasses); // <com.example.androiddemo.Activity.FridaActivity4$InnerClasses> //hook 内部类的函数 InnerClasses.check1.implementation = function(){ return true; }; InnerClasses.check2.implementation = function(){ return true; }; InnerClasses.check3.implementation = function(){ return true; }; InnerClasses.check4.implementation = function(){ return true; }; InnerClasses.check5.implementation = function(){ return true; }; InnerClasses.check6.implementation = function(){ return true; }; });}
hook多个函数
function hook_mul_function(){ Java.perform(function(){ var class_name = "com.example.androiddemo.Activity.FridaActivity4$InnerClasses" var InnerClasses = Java.use(class_name); //console.log(InnerClasses.class.getDeclareMethods()); //xxx.class.getDeclareMethods() var all_methods = InnerClasses.class.getDeclareMethods(); for (var i=0; i < all_methods.length, i++){ console.log(all_methods[i]); } });}