之前的Frida Hook(二)中已经讲了一些常用的hook脚本用法,在本文中会继续扩展点之前没覆盖到的知识点,这类稍微麻烦一点点,不过也算是比较基础的,
对于刚接触的frida的小伙伴强烈推荐官方脚本资源网站 https://codeshare.frida.re/,基本上各种通用的hook脚本都有,站在巨人的肩膀上少做牛马的体力活
![Frida Hook(五) - 安卓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进阶基础 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进阶基础
评论