ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Frida Hook Java

2021-12-19 14:02:02  阅读:190  来源: 互联网

标签:Java arg0 Hook var Frida Test01 方法 public


hook简述

Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是把系统的程序拉出来变成我们自己执行代码片段。

要实现钩子函数,有两个步骤:
 1. 利用系统内部提供的接口,通过实现该接口,然后注入进系统(特定场景下使用)
 2. 动态代理(使用所有场景)

本次测试用到的工具有:

​ 夜神模拟器

​ frida15.0.9

​ GDA

​ adb

Java的三种方法

普通方法

1.普通方法用来描述对象的动态行为或是是特征

  • 普通方法有返回值
  • 普通方法支持被继承和重写(不考虑访问控制)
  • 普通方法名不能和类名一致
  • 普通方法名首字母小写。
  • 普通方法也支持重载
  • 普通方法支持重写,但是构造方法都不能继承,更不要说重写了。
public class Test01{
	public void fun(){
		System.out.println("普通方法被调用了~~~~");
	}


	public static void main(String[] args ){
		Test01 t = new Test01();
        t.fun();
		
	}
}

image-20210901135013691

2.构造方法可以调用普通方法,但是普通方法不能调用构造方法

public class Test01{
	public Test01(){
		fun();
	}
	public void fun(){
		System.out.println("普通方法被调用了~~~~");
	}


	public static void main(String[] args ){
		Test01 t = new Test01();
	}
}

image-20210901135054556

public class Test01{
	public Test01(){
		
	}
	public void fun(){
		Test01();
	}


	public static void main(String[] args ){
		Test01 t = new Test01();
		t.fun();
	}
}

image-20210901135146964

构造方法

1.构造方法必须和类名一致,并且没有返回值

public class Test{
    public Test(){
        
    }
}

2.在实例化对象的时候其实调用的就是构造方法

image-20210901135345170

3.构造方法也是可以被重载的

public class Test01{
	public Test01(){
		System.out.println("构造方法被调用了~~~");
	}
	public Test01(int i){
		System.out.println("有参构造!!!" + i);
	}


	public static void main(String[] args ){
		Test01 t = new Test01();
        Test01 t2 = new Test01(666);
	}
}

image-20210901135619363

重载方法

重载方法(Overloading)的定义:如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载。 具体满足条件包括:

  • 方法名相同
  • 方法的参数类型,参数个不一样
  • 方法的返回类型可以不相同
  • 方法的修饰符可以不相同
  • main 方法也可以被重载
class MyClass {
    int height;
    MyClass() {
        System.out.println("无参数构造方法");
        height = 4;
    }
    MyClass(int i) {
        System.out.println("房子高度为 " + i + " 米");
        height = i;
    }
    void info() {
        System.out.println("房子高度为 " + height + " 米");
    }
    void info(String s) {
        System.out.println(s + ": 房子高度为 " + height + " 米");
    }
}
public class MainClass {
    public static void main(String[] args) {
        MyClass t = new MyClass(3);
        t.info();
        t.info("重载方法");
        //重载构造函数
        new MyClass();
    }
}

image-20210901140007612

Frida Hook app

信息搜集

启动Hook的app,每一个按钮对应不同的方法和结果

普通方法—> 4000

构造方法—> RMB: 100

重载方法—> 重载方法123456

对象参数—> 美元: 200

image-20210901140427202

普通方法Hook

反编译

用GDA反编译app查看清单文件确定入口方法com.example.application.MainActivity,代码如下:

image-20210901144130189

MainActivity$1中获取调用的方法以及参数,两个参数都为2000

image-20210901144235592

getCalc方法代码,返回两个参数相加后的值

image-20210901144351504

Frida Hook

用adb将主机和模拟器连接起来,教程https://blog.csdn.net/wangjiakang12306/article/details/89511486

定位方法使用frida进行Hook,不用自己写hook脚本

image-20210901145151163

此时点击app中的普通方法,成功hook到方法

自定义js脚本,可以根据需要修改js脚本中的内容

setImmediate(function() {
Java.perform(function() {
	var targetClass='com.example.application.Utils';
	var methodName='getCalc';
	var gclass = Java.use(targetClass);
	gclass[methodName].overload('int','int').implementation = function(arg0,arg1) {
		var arg0=100
		var arg1=200
		console.log('\nGDA[Hook getCalc(int,int)]'+'\n\targ0 = '+arg0+'\n\targ1 = '+arg1);
		var i=this[methodName](arg0,arg1);
		console.log('\treturn '+i);
		return i;
	}
})
})

回到模拟器点击普通方法,成功修改方法结果

image-20210901150911478

构造方法Hook

反编译

该函数实例化Money对象,是有参数的构造方法

image-20210901155316877

定位Money对象和对应构造方法代码,主要功能是将参数拼接并返回结果

image-20210901155958516

Frida Hook

在实例化对象Money处用frida进行hook

image-20210901164658013

成功hook方法,但是没办法hook返回值,只能通过修改入口参数来改变程序的输出

image-20210901172224318

image-20210901172329474

setImmediate(function() {
Java.perform(function() {
	var targetClass='com.example.application.Money';
	var methodName='$init';
	var gclass = Java.use(targetClass);
	gclass[methodName].overload('int','java.lang.String').implementation = function(arg0,arg1) {
		var arg0=100
		var arg1='huhjh'
		console.log('\nGDA[Hook $init(int,java.lang.String)]'+'\n\targ0 = '+arg0+'\n\targ1 = '+arg1);
		var i=this[methodName](arg0,arg1);
		console.log('\treturn '+i);
		return i;
	}
})
})

重载方法Hook

反编译

方法的主要功能是将传入的int型参数加上前缀并返回

image-20210901174419341

传入的参数为123456

image-20210901174521617

Frida Hook

image-20210901174800717

修改参数内容再进行hook

setImmediate(function() {
Java.perform(function() {
	var targetClass='com.example.application.Utils';
	var methodName='test';
	var gclass = Java.use(targetClass);
	gclass[methodName].overload('int').implementation = function(arg0) {
		var arg0 = 666
		console.log('\nGDA[Hook test(int)]'+'\n\targ0 = '+arg0);
		var i=this[methodName](arg0);
		console.log('\treturn '+i);
		return i;
	}
})
})

image-20210901174903231

对象参数Hook

反编译

test的参数为一个对象也是一个重载,对象是Money

image-20210901181417682

在入口处被实例化调用

image-20210901181619239

Frida Hook

同样也hook不到返回值,只能通过修改入口参数来改变程序的输出结果

image-20210901181827447

setImmediate(function() {
Java.perform(function() {
	var targetClass='com.example.application.Money';
	var methodName='$init';
	var gclass = Java.use(targetClass);
	gclass[methodName].overload('int','java.lang.String').implementation = function(arg0,arg1) {
		var arg0=1000
		var arg1='sdsdf'
		console.log('\nGDA[Hook $init(int,java.lang.String)]'+'\n\targ0 = '+arg0+'\n\targ1 = '+arg1);
		var i=this[methodName](arg0,arg1);
		console.log('\treturn '+i);
		return i;
	}
})		
})

image-20210901182553444

argetClass);
gclass[methodName].overload(‘int’,‘java.lang.String’).implementation = function(arg0,arg1) {
var arg0=1000
var arg1=‘sdsdf’
console.log(’\nGDA[Hook $init(int,java.lang.String)]’+’\n\targ0 = ‘+arg0+’\n\targ1 = ‘+arg1);
var i=thismethodName;
console.log(’\treturn '+i);
return i;
}
})
})


[外链图片转存中...(img-yQHbW6po-1639893502627)]

标签:Java,arg0,Hook,var,Frida,Test01,方法,public
来源: https://blog.csdn.net/qq_45414878/article/details/122023380

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有