🌟 ❤️
作者:yueji0j1anke
首发于公号:剑客古月的安全屋
字数:2032
阅读时间: 30min
声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。合法渗透,本文章内容纯属虚构,如遇巧合,纯属意外
目录
-
前言
-
Frida回顾+环境准备
-
Hook 模拟实战
-
实战案例
0x01 前言
前段时间配备的app教程总觉得不够具体详细,实战中也遇到了困难,故此出该系列介绍具体frida操作与实战案例
0x02 Frida重温 + 环境准备
frida是一款动态插桩工具,可以插入一些代码到原生app的内存空间去动态监视修改行为。由于其使用的是python,js等语言,所以可以将js等脚本插入app内存去对app逻辑实现跟踪和监控,甚至修改逻辑,这样的方式也叫作hook
而frida从java层到native层的hook都可以实现,即可以hook到java也可以hook到so,基本涵盖全平台
这里环境我准备的是
python 3.6.8
frida 12.8.0
frida-dexdump 2.0.1
frida-tools 5.3.0
0x03 Hook 模拟实战
1.普通方法
Java.perform(function(){
var utils = Java.use('要hook的类名');
var class = Java.use('java.lang.Class')
// hook 普通方法
utils.类的方法名.implementation = funtion( 方法的参数a,b ){
console.log(a); // 输出信息 参数a 也可使用 arguments[0] 输出方法的参数
send(); // 也可输出信息
// this 表示当前类
return this.xxx方法; // 为hook的代码返回值,可以是当前方法,也可以是其他
}
}
运行
python hook.py & echo & pause & exit
祖传的hook test apk拿来玩玩
frida-dexdump -U -f packagename
拖入jadx如下
运行程序
python hook.py & echo & pause & exit
成功被调用并打印出调用参数
2.构造方法
即不调用该函数,去重新构造函数
很多时候我们找不到被实例化的对象的调用,即可直接根据此进行构造
jscode = """
Java.perform(function () {
var money = Java.use('com.xiaojianbang.app.Money');
// hook 普通方法
money.$init.implementation = function(a, b){
console.log("Hook start...."); // 输出信息 参数a 也可使用 arguments[0] 输出方法的参数
send(a);// 也可输出信息
send(b);
// this 表示当前类
send("success");
return this.$init(a, b); // 为hook的代码返回值,可以是当前方法,也可以是其他
}
});
"""
或者更具体一些,附带具体的参数类型
jscode = """
Java.perform(function () {
var money = Java.use('com.xiaojianbang.app.Money');
// hook 普通方法
money.$init.overload('java.lang.String', 'int').implementation = function(a, b){
console.log("Hook start...."); // 输出信息 参数a 也可使用 arguments[0] 输出方法的参数
send(a);// 也可输出信息
send(b);
// this 表示当前类
send("success");
return this.$init(a, b); // 为hook的代码返回值,可以是当前方法,也可以是其他
}
});
"""
这里是输出的money实例化信息
成功获取到被调用的具体信息
3.重载方法
重载方法的返回值类型不需要必须一致。在Java中,方法的重载是指在一个类中可以定义多个同名方法,只要它们的参数列表不同(即参数的类型、数量或顺序不同)即可
比如之前的构造方法的hook函数,我们可以写成
jscode = """
Java.perform(function () {
var money = Java.use('com.xiaojianbang.app.Money');
// hook 普通方法
money.$init.overload('java.lang.String', 'int').implementation = function(a, b){
console.log("Hook start...."); // 输出信息 参数a 也可使用 arguments[0] 输出方法的参数
send(a);// 也可输出信息
send(b);
// this 表示当前类
send("success");
return this.$init(a, b); // 为hook的代码返回值,可以是当前方法,也可以是其他
}
});
"""
4.构造对象参数
如何在hook构造出类的对象参数呢?
构造出其绝对路径,比如com.xxxx.app.money
jscode = """
Java.perform(function () {
var utils = Java.use('com.xiaojianbang.app.Utils');
// 实例化一下
var money = Java.use('com.xiaojianbang.app.Money');
// hook 普通方法
utils.test.overload('com.xiaojianbang.app.Money').implementation = function(obj) {
console.log("Hook start...."); // 输出信息 参数a 也可使用 arguments[0] 输出方法的参数
send(obj.getInfo());// 也可输出信息
send(obj.name());
// this 表示当前类
var mon = money.$new('无敌了家人们',1000);
send(mon.getInfo());
// 再实例化一下子,提供我们的test参数
send("success");
return this.test(obj); // 为hook的代码返回值,可以是当前方法,也可以是其他
}
});
"""
成功调用
5.修改对象属性
不管是private或者是public属性都可以用xxx.变量名.value进行获取或者修改
jscode = """
Java.perform(function () {
var utils = Java.use('com.xiaojianbang.app.Utils');
// 实例化一下
var money = Java.use('com.xiaojianbang.app.Money');
// hook 普通方法
utils.test.overload('com.xiaojianbang.app.Money').implementation = function(obj) {
console.log("Hook start...."); // 输出信息 参数a 也可使用 arguments[0] 输出方法的参数
// this 表示当前类
var mon = money.$new('无敌了家人们',1000);
send(mon.getInfo());
// 再实例化一下子,提供我们的test参数
mon.num.value = 2000
send(mon.getInfo());
send("success");
return this.test(mon); // 为hook的代码返回值,可以是当前方法,也可以是其他
}
});
"""
亦可以通过反射的方法去获取值或者进行修改
0x04 实战案例
接下来进入实战案例,某某牛app登录窗口存在sign加密,导致我们无法进行登录注册接口的爆破漏洞尝试
存在appsign参数,解包找关键词sign
跟进相关aes加密参数
找到可以hook的函数,构造如下
成功完成自动加密,可以实现爆破
原文始发于微信公众号(剑客古月的安全屋):app攻防-Frida&Hook 系列1