• 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适用的类型。

  • 相关阅读:
    设计模式学习笔记——状态模式(state)
    设计模式学习笔记——工厂方法模式(Factory Method)
    设计模式学习笔记——抽象工厂(Abstract Factory)
    设计模式学习笔记——单例模式(Singleton)
    设计模式学习笔记——适配器模式(Adapter)
    设计模式学习笔记——建造者模式(Builder)
    设计模式学习笔记——观察者模式(Observer)
    玩转Node.js(三)
    玩转Node.js(二)
    玩转Node.js(一)
  • 原文地址:https://www.cnblogs.com/hatkids/p/14198457.html
Copyright © 2020-2023  润新知