Android 安全研究 hook 神器frida学习(二)

  上一篇文章,简单对Frida有了一个了解,接下来学习一些基本的操作

  Frida再面不同类型的java 函数时所,调用方法时不同的,来做一个总结;

  普通函数:  

public class test {
    public static first(String x) {
        return x;
    }
...
}

      hook代码:

var class=Java.use("com.test.app.test");
test.first.implementation = function(x)
{
    console.log("Hook Start...");
//hook 代码 }

  构造函数:函数名和类名相同,能在创建Person实例的时候,一次性传入nameage,完成初始化

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

   hook方法:

var money=Java.use("com.test.app.Person");
Person.$init.implementation = function(a, b) //通过$init来获取该方法
{
    console.log("Hook Start...");
  //hook代码
return this.$init(a,b); //打印返回值时也这样引用; }

  重载函数:一个类中,方法名相同,但是方法参数不一样的函数

public class test {
    public static String fun(int a) {
        return a;
    }

    public static String fun(String b) {
        return b;
    }
}

   hook方法:

test.fun.overload("int").implementation = function(a)//hook参数为a的fun函数,添加overloda(参数类型)。
    {
        console.log("Hook Start...");
        //hook代码
    }
var JavaString=Java.use("java.lang.String");
test.fun.overload('java.lang.String').implementation = function (str) {    //hook参数为b的fun函数,这里要注意javascript到java的类型转换,需要引用java中的string类java.lang.String来构造,
            //打印参数
             
     str=JavaString.$new("abddfgg");
     console.log("original call : str:",str);
     return this.fun(str);
 };

      参数为对象实例的函数:该函数的参数为对象,上文的String 参数即是这种情况,需要hook该对象,实例化一个参数;

import com.test.app.abc;

public class test {
    public static String fun(adc  x) {
        return x.value;
 }

  hook方法:

var jabc = Java.use("com.test.app.abc");   //hook参数类
var jtest=Java.use("com.test.app.test");   
    
jtest.fun.implementation = function(a)
    {
        console.log("Hook Start...");
      
        var a = jadc.$new("xxxx");    //$new实例化一个参数。
        // a.name="xxxx";实例化以后还可修改对象的属性值。
        return this.fun(a);         
        
    }

  内部类函数:在一个类,中继续定义一个类,其中的函数;

class test {
    
    class test2 {     //内部类
        public void fun(int x) {
            return x;
        }
    }
}

  hook方法:

var jtest = Java.use('com.test.app.test$test2')//在第一个类后面加上$即可,$内部类
jtest.fun.implementation = function()
{
  .
}

 实际过程中,函数的参数类型往往是最容易出错的,java是强类型,js为弱类型,js定义的参数往往要转成java适用的类型。

原文地址:https://www.cnblogs.com/hatkids/p/14198457.html