app攻防-Frida&Hook 系列1

🌟 ❤️

作者: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

app攻防-Frida&Hook 系列1

app攻防-Frida&Hook 系列1

拖入jadx如下

app攻防-Frida&Hook 系列1




运行程序

python hook.py & echo & pause & exit

app攻防-Frida&Hook 系列1

成功被调用并打印出调用参数


2.构造方法

即不调用该函数,去重新构造函数

很多时候我们找不到被实例化的对象的调用,即可直接根据此进行构造

app攻防-Frida&Hook 系列1


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实例化信息

app攻防-Frida&Hook 系列1

成功获取到被调用的具体信息



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.构造对象参数

app攻防-Frida&Hook 系列1

如何在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的代码返回值,可以是当前方法,也可以是其他
  }
});
"""

成功调用

app攻防-Frida&Hook 系列1

app攻防-Frida&Hook 系列1



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的代码返回值,可以是当前方法,也可以是其他
  }
});
"""

app攻防-Frida&Hook 系列1

亦可以通过反射的方法去获取值或者进行修改



0x04 实战案例

接下来进入实战案例,某某牛app登录窗口存在sign加密,导致我们无法进行登录注册接口的爆破漏洞尝试

app攻防-Frida&Hook 系列1

存在appsign参数,解包找关键词sign

app攻防-Frida&Hook 系列1

跟进相关aes加密参数

app攻防-Frida&Hook 系列1

找到可以hook的函数,构造如下

app攻防-Frida&Hook 系列1

app攻防-Frida&Hook 系列1

成功完成自动加密,可以实现爆破


原文始发于微信公众号(剑客古月的安全屋):app攻防-Frida&Hook 系列1

版权声明:admin 发表于 2024年6月25日 上午11:40。
转载请注明:app攻防-Frida&Hook 系列1 | CTF导航

相关文章