【安卓逆向】Frida入门与常用备忘

news2024/9/25 21:23:24

【安卓逆向】Frida入门与常用备忘

      • 前置知识
        • 什么是hook?
        • hook的作用
        • 常见的逆向工具
      • Frida使用入门
        • 简介与资料参考备忘
        • 前置环境配置
        • 执行hook
        • 常用hook脚本/API

前置知识

什么是hook?

hook,译为“钩子”,是指将方法/函数勾住,勾住后我们可以做一些我们想做的事情。实际上我们可以通过一些工具,可以把我们java、native层面的方法/函数调用给“勾住了”,或者直接理解为监听,我们可以监听到调用方法,方法的传参,以及修改方法的返回值等等

hook的作用

了解这些工具,可以帮助我们更好的去定位问题、进行debug,甚至可以对一些app进行破解修改

常见的逆向工具

工具/方法作用java层native层SDK集成是否需要root备注其他
JADX反编译查看源码支持不支持加固的apk需要先脱壳
apktool反编译/回编 APK修改smail码
epic/sandhookapp集成SDK进行代码hook支持支持需要不需要xposed框架,不同的系统API不一致需要适配
xposed插件在集成了xposed框架的安卓环境上进行hook支持不支持不需要需要需要root,其他同上
frida在root的安卓环境下,对java/native 直接进行二进制hook支持支持需要需要需要root环境,python环境

Frida使用入门

简介与资料参考备忘

frida是一款二进制hook框架,支持java/native层hook,需要root环境,因为是二进制内存hook,可以实现直接hook当前进程,无需集成SDK甚至不需要重启进程

  • Frida官网
  • github地址
  • Frida安装教程
  • js脚本API文档

前置环境配置

  • 安装python3及pip环境
  • 使用pip安装frida库与工具
  // 安装特定版本 pip install frida==版本号
 pip install frida
 pip install frida-tools
 // 网络不好使用镜像库
 pip install firda -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
 // 查看当前frida版本
 frida --version
  • 若使用模拟器,则进行端口转发(默认端口)
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
  • 根据当前设备/模拟器架构,官网下载 对应的frida-server,push到于设备/模拟器上的目录并授予可执行权限
   # 这里放于 /data/local/tmp
  adb push E:\frida-server /data/local/tmp/frida-server
  # 进入adb shell
  adb shell
  # 以管理员权限访问
  su
  # 进入frida-server目录
  cd /data/local/tmp
  # 提供权限
  chmod 777 frida-server
  # 运行frida-server
  ./frida-server
  • 运行frida-server后保持窗口 此时服务开启,开启新的窗口检测是否成功
# 命令成功输出进程列表
frida-ps -U

# 根据包名连接目标进程
frida -U -f com.xxx.xxx 

在这里插入图片描述

执行hook

  • python脚本执行hook,样板代码如下
import frida, sys

def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)

jscode = """
Java.perform(() => {
  // Function to hook is defined here
  const MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');

  // Whenever button is clicked
  const onClick = MainActivity.onClick;
  onClick.implementation = function (v) {
    // Show a message to know that the function got called
    send('onClick');

    // Call the original onClick handler
    onClick.call(this, v);

    // Set our values after running the original onClick handler
    this.m.value = 0;
    this.n.value = 1;
    this.cnt.value = 999;

    // Log to the console that it's done, and we should have the flag!
    console.log('Done:' + JSON.stringify(this.cnt));
  };
});
"""

#  pid or package name
process = frida.get_usb_device().attach(13347) 
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running CTF')
script.load()
sys.stdin.read())
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running CTF')
script.load()
sys.stdin.read()
  • 直接注入js脚本
frida -U [pid|packagename] -l test.js

常用hook脚本/API

  • 测试代码类

public class TestStaticClass {

    public static int count = 0;
    private static String TAG = "TestStaticClass";

    public static String getCountString(){
        Log.i(TAG, "call testMethod");
        return "count:" + count;
    }

    public static void addCount(){
        count++;
    }

    public static String getCountString(int input){
        return "getCountString:" + input;
    }

    public static String getCountString(int[] input){
        return "getCountString:" + Arrays.toString(input);
    }

    public void testStack(){
        Log.i(TAG, "call testStack");
    }

}
  • 获取java类并构建新对象
方法含义其他
$new新建对象
$init构造函数
const JavaString = Java.use('java.lang.String');
var exampleString1 = JavaString.$new('Hello World, this is an example string in Java.');
  • 获取类与静态函数方法调用

    Java.perform(() => {
     const TestStaticClass = Java.use("com.hjl.nativetest.TestStaticClass");
     TestStaticClass.count.value = 1; //访问静态变量
     TestStaticClass.addCount();   //hook静态函数直接调用
    });
    
  • hook方法打印方法值并修改返回值

    Java.perform(() => {
     // 获取类
     const TestStaticClass = Java.use("com.hjl.nativetest.TestStaticClass");
     // 获取方法
     const getCountString = TestStaticClass.getCountString;  
     // hook方法
     getCountString.implementation = function () {
    
      // 当方法调用时 
      send('call getCountString');
    
      // 调用原方法获取结果
      var result = getCountString.call(this);
    
      console.log("getCountString:" + result);
      // 返回自定义的结果 
      return "hook return String";
    };
    
    // 获取重载方法
    // 基础类型直接填,数组以类似JNI的签名形式如[I ,类型填完整类
    const getCountString2 = TestStaticClass.getCountString.overload('int')
    getCountString2.implementation = function (data) {
    
      // 打印原始输入参数
      send('call getCountString:' + data);
    
      // 调用原方法获取结果
      var result = getCountString2.call(this,data);
      console.log("getCountString:" + result);
      // 返回自定义的结果
      return "hook return String";
    };
    });
    
  • 获取调用栈

    Java.perform(() => {
    const TestStaticClass = Java.use("com.hjl.nativetest.TestStaticClass");
    const Exception = Java.use('java.lang.Exception');
    const Log = Java.use('android.util.Log');
    
    const testStack = TestStaticClass.testStack
    testStack.implementation = function () {
       console.log(stackTraceHere());
    };
    
    function stackTraceHere() {
      return Log.getStackTraceString(Exception.$new());
    }
    });
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022-CSDN的一年

前言 马上要到兔年的春节,年前最后一个版本顺利上线,闲下来两天,可以对过往一年进行一下总结,说起来这是入职CSDN之后第一次自己将自己所思所想以以博客的形式发布在CSDN网站上,也是比较奇特的体验。语言表达能力不强&…

利用华为路由器配置单臂路由功能,实现多个vlan间通信

单臂路由,是通过一台路由器使不同VLAN之间互通的数据通过路由器进行三层转发。 如果在路由器上为每个 VLAN分配一个单独的路由器物理接口,那么随着VLAN数量的增口,必然需要更多的接口,而路由器能提供的接口数量有限,所…

Kubernetes 基本概念

Kubernetes 是什么 Kubernetes 是一个可移植、可扩展的开源平台。用于管理容器化的工作负载和服务,可促进声明式配 置和自动化。是谷歌保密了十几年的秘密武器Borg的开源版本,谷歌一直通过Borg系统管理着数量庞大 的应用程序集群。由于Kubernetes是基于…

元素排序 Comparable 和 Comparator 有什么区别?

1.字面含义不同 我们先从二者的字面含义来理解它,Comparable 翻译为中文是“比较”的意思,而 Comparator 是“比较器”的意思。Comparable 是以 -able 结尾的,表示它自身具备着某种能力,而 Comparator 是以 -or 结尾,…

7. R语言【相关性分析函数】:cov、cor、cor.test 和 【相关性检验函数】:cor.test、corr.test、pcor.test

b站课程视频链接: https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新,但是要花钱,我花99😢😢元买了,感觉讲的没问题,就是知识点结构有点乱,有点废话)&…

二、TortoiseGit的安装

1、TortoiseGit的安装 1.1、TortoiseGit简介 (1)TortoiseGit是一个基于TortoiseSVN的Git的Windows Shell接口。它是开源的,可以免费使用。 (2)TortoiseGit是git的比较好用的一个图形化工具。 1.2、软件下载 (1)下载地址 Download – TortoiseGit – Windows S…

84. 双向循环神经网络

1. 未来很重要 取决于过去和未来的上下文,可以填很不一样的词目前为止RNN只看过去在填空的时候,我们也可以看未来城 2. 双向RNN 两个隐状态层,并行计算隐状态,但是隐状态传播方向相反。 公式如下: 3. 推理 双向RNN不…

day16集合

1.Collection集合 1.1数组和集合的区别【理解】 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类 1.2集合类体系结构【理解】…

web期末作业网页设计——APEX(网页源码)

大学生网页制作期末作业-HTMLCSSJavaScript(包含源码)-apex欢迎来到Apex英雄Apex-legends 充满各种机会的世界 边境远方 偏僻星球群 欢迎来到诸王峡谷 于2019年2月5日发行。玩家在游戏中将扮演外星战场上的星空战士。 《Apex英雄》是由《泰坦天降》制作组…

<栈>的概念结构实现【C语言版】

1.栈的概念及结构 栈存储数据的方式跟数组一样,都是将元素排成一行。只不过它还有以下 3 条约束。 ● 只能在末尾插入数据。 ● 只能读取末尾的数据。 ● 只能移除末尾的数据。 你可以将栈看成一叠碟子:你只能看到最顶端那只碟子的碟面&#xff0c…

微博图床挂了!

一直担心的事情还是发生了。作为hexo多年的使用者,微博图床一直是我的默认选项,hexotyporaiPic更是我这几年写文章的黄金组合。而图床中,新浪图床一直都是我的默认选项,速度快、稳定同时支持大图片批量上传更是让其成为了众多图床…

工具及方法 - 设计你的文件夹结构

电脑上资料总是很多,要如何管理,是每个人都需要处理的问题。 如果处理不好,时间一长,很多资料就可能不知所踪或者难以查找。 出现这种情况,让人头疼,还浪费了时间,降低了工作效率。 所以&…

springboot服务启动JMX监控

前言 java应用部署下在生产环境,肯定是少不了监控的,比如说我们想要监控JVM的线程使用情况,内存使用情况等等。这时候我们可以采用JMX来实现JVM监控,如果对JMX不熟悉,可以参见之前的 精通JVM监控,不知道J…

Java技能树-操作符(二)-练习篇

按位操作符 下面代码执行后的结果是: System.out.println(1 & 2); System.out.println(1 | 2);答案是:A 正确结果是: 0 3Process finished with exit code 0十进制:1 二进制:0000 0001 十进制:2 二进…

【SpringCloud】Erauke的基本原理与使用

【SpringCloud】Erauke的基本原理与使用 一、Eureka-提供者与消费者 【问】如果服务A调用了服务B,而服务B又调用了服务C,服务B的角色是什么? 二、Eureka的结构和作用 什么是Eureka? Eureka 解决服务调用的问题 order-servic…

计算机论文的参考文献,应该怎么引用? - 易智编译EaseEditing

参考文献的引用格式,要看期刊的要求,期刊会规定文章格式,这里面就包括参考文献的格式。 如果不是投稿到期刊,也会有相应的要求,按要求来就行。 不仅很参考文献的格式,还有很多细节也要注意: …

【Java多线程】创建多线程的方式二---实现Runnable接口(多窗口卖票)

题:创建三个窗口卖票,总票数为100张 1.继承Thread类的方式: 因为是三个窗口共卖100张所以我们在定义ticket时要用到static来修饰 private static int ticket 100; 代码如下: class Window extends Thread{private static in…

k8s在华为openeuler搭建

参考文献 Kubernetes1.26.0部署(Ubuntu/CentOS)未完待续https://blog.csdn.net/weixin_67405599/article/details/128466282 Kubeadm 快速搭建 k8s v1.24.1 集群(openEuler 22.03 LTS)https://huaweicloud.csdn.net/633119cbd3efff3090b52068.html op…

宽度优先搜索算法(BFS)详解(超级详细讲解,附有大图)

目录 一.宽度优先搜索(BFS)是什么? 二.图解宽搜(BFS) 三.对比与发现 四。工具——队列 五.模板 六.最后 一.宽度优先搜索(BFS)是什么? 百度百科这样说: 宽度优先搜索…

一文讲透:质量管理的历史

(本文摘自《软件质量保证与管理(第2版)》,清华大学出版社,2020)1875年泰勒制诞生,意味着科学管理的开始,最初的质量管理也就是将检验活动与其他职能分离,出现了专职的检验…