Frida Hook(五) - 安卓hook进阶基础

admin 2024年7月4日23:07:35评论1 views字数 6907阅读23分1秒阅读模式

之前的Frida Hook(二)中已经讲了一些常用的hook脚本用法,在本文中会继续扩展点之前没覆盖到的知识点,这类稍微麻烦一点点,不过也算是比较基础的,

对于刚接触的frida的小伙伴强烈推荐官方脚本资源网站 https://codeshare.frida.re/,基本上各种通用的hook脚本都有,站在巨人的肩膀上少做牛马的体力活

Frida Hook(五) -  安卓hook进阶基础

          

          

字段Hook

Demo 源代码

Java                  
package com.sec.hook;                  
public class SecTest {                  
    private static String flag;                  
    private int amount;                  
    private String currency;                  
}
       

          

静态字段Hook

直接通过类名,然后访问静态属性字段,以上述demo为例,获取到flag值

JavaScript                  
Java.perform(function(){                  
    var sec=Java.use("com.sec.hook.SecTest");                  
    console.log(sec.flag.value)                  
})

修改返回值

JavaScript                  
Java.perform(function(){                  
    var sec=Java.use("com.sec.hook.SecTest");                  
    console.log(sec.flag.value)                  
    sec.flag.value = "pikaqiu"                  
    console.log(sec.flag.value)                  
    return                  
})

          

实例字段Hook

实例字段需要得到对象,有对象才可以访问;实例字段下又分为两种情况,即创建新对象和获取已有对象。

          

创建新对象

第一步需要使用new方法创建一个关于SecTest的新对象,之后可以借助value属性获取字段内容和修改字段    

JavaScript                  
Java.perform(function(){                  
    var secClass=Java.use("com.sec.hook.SecTest");                  
    var secObj = secClass.$new(1000);  //创建对象                  
    console.log(secObj.amount.value);  // 获取出当前对象的数据                  
    secObj.amount.value = 2000;  //修改对应的数据                  
                    
})

          

获取已有对象

如果是使用获取已有对象的方法,需要使用Java.choose方法

JavaScript                  
Java.perform(function(){                  
    Java.choose("com.sec.hook.SecTest",{                  
        onMatch: function(obj) {                  
            console.log{obj.amount.value}                  
        }                  
        onComplete:funcation() {}                  
    })                  
})

          

同名方法与字段Hook

如果一个类中方法名与字段名一致,若要获取到字段数据,则需要在字段前加下划线前缀;

举例下列代码中    

Frida Hook(五) -  安卓hook进阶基础

Hook脚本应该为

JavaScript                  
Java.perform(function(){                  
    Java.choose("com.xiaojianbang.hook.BankCard",{                  
        onMatch: function(obj) {                  
            console.log{obj._accountName.value}                  
        }                  
        onComplete:funcation() {}                  
    })                  
})

          

匿名类Hook

匿名类的特点是new关键词后边跟类或者接口,加花括号的意思是直接定义一个类

示例:假设我们有一个 Java 类 OuterClass,它包含一个匿名类:

JavaScript                  
public class OuterClass {                  
    public void createAnonymousClass() {                  
        Runnable runnable = new Runnable() {                  
            @Override                  
            public void run() {                  
                System.out.println("Running in anonymous class");                  
            }                  
        };                  
        runnable.run();                  
    }                  
}                  
       

Hook脚本

JavaScript                  
Java.perform(function () {                  
    // 获取外部类                  
    var OuterClass = Java.use('com.example.OuterClass');  // 替换为实际的外部类名                  
                 
    // 获取匿名类                  
    var AnonymousClass = Java.use('com.example.OuterClass$1');  // 确保类名正确                  
                 
    // Hook 匿名类的 run 方法                  
    AnonymousClass.run.implementation = function () {                  
        console.log('Anonymous class run method is called');                  
        // 调用原方法                  
        this.run();                  
        // 在原方法之后执行其他操作                  
        console.log('Anonymous class run method is finished');                  
    };                  
                 
});                  

          

重载方法Hook

方法重载是一个类的多态性的表现,重载方法在一个类中方法名字相同,而参数不同,返回值也可以不同

因此在Hook时也需要额外注意其参数类型列表

示例:

Java                  
public class ExampleClass {                  
    public void doSomething() {                  
        System.out.println("doSomething with no arguments");                  
    }                  
                 
    public void doSomething(int value) {                  
        System.out.println("doSomething with int: " + value);                  
    }                  
                 
    public void doSomething(String value) {                  
        System.out.println("doSomething with String: " + value);                  
    }                  
                 
    public void doSomething(int value1, String value2) {                  
        System.out.println("doSomething with int and String: " + value1 + ", " + value2);                  
    }                  
}
       

Hook脚本

JavaScript                  
Java.perform(function () {                  
    // 获取目标类                  
    var ExampleClass = Java.use('com.example.ExampleClass');  // 替换为实际的类名                  
                 
    // Hook 无参的 doSomething 方法                  
    ExampleClass.doSomething.overload().implementation = function () {                  
        console.log('Hooked no-arg doSomething');                  
                 
        // 调用原方法                  
        this.doSomething();                  
                 
        // 在原方法之后执行其他操作                  
        console.log('After calling no-arg doSomething');                  
    };                  
                 
    // Hook 带 int 参数的 doSomething 方法                  
    ExampleClass.doSomething.overload('int').implementation = function (value) {                  
        console.log('Hooked int-arg doSomething with value: ' + value);                  
                 
        // 调用原方法                  
        this.doSomething(value);                  
                 
        // 在原方法之后执行其他操作                  
        console.log('After calling int-arg doSomething with value: ' + value);                  
    };                  
                 
    // Hook 带 String 参数的 doSomething 方法                  
    ExampleClass.doSomething.overload('java.lang.String').implementation = function (value) {                  
        console.log('Hooked String-arg doSomething with value: ' + value);                  
                 
        // 调用原方法                  
        this.doSomething(value);                  
                 
        // 在原方法之后执行其他操作                  
        console.log('After calling String-arg doSomething with value: ' + value);                  
    };                  
                 
    // Hook 带 int 和 String 参数的 doSomething 方法                  
    ExampleClass.doSomething.overload('int', 'java.lang.String').implementation = function (value1, value2) {                  
        console.log('Hooked int and String-arg doSomething with values: ' + value1 + ', ' + value2);                  
                 
        // 调用原方法                  
        this.doSomething(value1, value2);                  
                 
        // 在原方法之后执行其他操作                  
        console.log('After calling int and String-arg doSomething with values: ' + value1 + ', ' + value2);                  
    };                  
});                  
       

          

对象参数Hook

在有些方法中,需要传入对象作为参数,这种情况下hook会稍微麻烦点,

示例:

JavaScript                  
public class Data {                  
    public String value;                  
                 
    public Data(String value) {                  
        this.value = value;                  
    }                  
}                  
                 
public class ExampleClass {                  
    public void doSomething(Data data) {                  
        System.out.println("doSomething with Data: " + data.value);                  
    }                  
}                  
       

Hook脚本

JavaScript                  
Java.perform(function () {                  
    // 获取目标类                  
    var ExampleClass = Java.use('com.example.ExampleClass');  // 替换为实际的类名                  
    var Data = Java.use('com.example.Data');  // 替换为实际的类名                  
                 
    // Hook 带 Data 参数的 doSomething 方法                  
    ExampleClass.doSomething.overload('com.example.Data').implementation = function (data) {                  
        console.log('Hooked doSomething with Data object');                  
                 
        // 打印原始值                  
        console.log('Original data.value: ' + data.value.value);                  
                 
        // 修改 data 对象的 value 字段                  
        data.value.value = 'Modified Value';                  
                 
        // 调用原方法                  
        this.doSomething(data);                  
                 
        // 在原方法之后执行其他操作                  
        console.log('After calling doSomething with modified Data object');                  
    };                  
                 
    // 创建类实例并测试方法调用                  
    var instance = ExampleClass.$new();                  
    var dataInstance = Data.$new('Initial Value');                  
    instance.doSomething(dataInstance);                  
});                  
       

              

原文始发于微信公众号(暴暴的皮卡丘):Frida Hook(五) - 安卓hook进阶基础

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月4日23:07:35
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Frida Hook(五) - 安卓hook进阶基础http://cn-sec.com/archives/2921574.html

发表评论

匿名网友 填写信息