Frida Hook Java
2021/12/19 14:20:13
本文主要是介绍Frida Hook Java,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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(); } }
2.构造方法可以调用普通方法,但是普通方法不能调用构造方法
public class Test01{ public Test01(){ fun(); } public void fun(){ System.out.println("普通方法被调用了~~~~"); } public static void main(String[] args ){ Test01 t = new Test01(); } }
public class Test01{ public Test01(){ } public void fun(){ Test01(); } public static void main(String[] args ){ Test01 t = new Test01(); t.fun(); } }
构造方法
1.构造方法必须和类名一致,并且没有返回值
public class Test{ public Test(){ } }
2.在实例化对象的时候其实调用的就是构造方法
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); } }
重载方法
重载方法(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(); } }
Frida Hook app
信息搜集
启动Hook的app,每一个按钮对应不同的方法和结果
普通方法—> 4000
构造方法—> RMB: 100
重载方法—> 重载方法123456
对象参数—> 美元: 200
普通方法Hook
反编译
用GDA反编译app查看清单文件确定入口方法com.example.application.MainActivity
,代码如下:
MainActivity$1中获取调用的方法以及参数,两个参数都为2000
getCalc方法代码,返回两个参数相加后的值
Frida Hook
用adb将主机和模拟器连接起来,教程https://blog.csdn.net/wangjiakang12306/article/details/89511486
定位方法使用frida进行Hook,不用自己写hook脚本
此时点击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; } }) })
回到模拟器点击普通方法,成功修改方法结果
构造方法Hook
反编译
该函数实例化Money
对象,是有参数的构造方法
定位Money
对象和对应构造方法代码,主要功能是将参数拼接并返回结果
Frida Hook
在实例化对象Money
处用frida进行hook
成功hook方法,但是没办法hook返回值,只能通过修改入口参数来改变程序的输出
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型参数加上前缀并返回
传入的参数为123456
Frida Hook
修改参数内容再进行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; } }) })
对象参数Hook
反编译
test的参数为一个对象也是一个重载,对象是Money
在入口处被实例化调用
Frida Hook
同样也hook不到返回值,只能通过修改入口参数来改变程序的输出结果
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; } }) })
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)]
这篇关于Frida Hook Java的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-23线下车企门店如何实现线上线下融合?
- 2024-12-23鸿蒙Next ArkTS编程规范总结
- 2024-12-23物流团队冬至高效运转,哪款办公软件可助力风险评估?
- 2024-12-23优化库存,提升效率:医药企业如何借助看板软件实现仓库智能化
- 2024-12-23项目管理零负担!轻量化看板工具如何助力团队协作
- 2024-12-23电商活动复盘,为何是团队成长的核心环节?
- 2024-12-23鸿蒙Next ArkTS高性能编程实战
- 2024-12-23数据驱动:电商复盘从基础到进阶!
- 2024-12-23从数据到客户:跨境电商如何通过销售跟踪工具提升营销精准度?
- 2024-12-23汽车4S店运营效率提升的核心工具