初识HOOK框架frida

  • hook是什么

hook框架是一种技术,用于在运行时拦截和修改应用程序的行为,通过hook,可以劫持应用程序的方法调用、修改参数、篡改返回值等,以达到对应用程序的修改、增强或调试的目的。

  • 常见的hook框架有哪些
    • Xposed Framework:Xposed 是一个功能强大的开源 Hook 框架,可以在不修改应用程序源代码的情况下,对应用程序进行各种修改。它允许你编写模块来拦截和修改应用程序的方法调用,修改应用程序的行为和逻辑。
    • Frida:Frida 是一个跨平台的动态 Hook 框架,支持安卓和其他操作系统。它提供了一个强大的 JavaScript API,可以在运行时对应用程序进行 Hook,包括方法拦截、参数修改、调用注入等。Frida 可以用于安全研究、逆向工程和应用程序调试等方面。

下载安装Frida

  1. 电脑中安装模块
#我这里使用的是Python虚拟环境进行安装的
pip install frida==16.1.7
pip install frida-tools==12.3.0

image.png

  1. 手机端安装frida-server
#下载地址
https://github.com/frida/frida/releases

#查看手机架构,选择相对应的版本
adb shell getprop ro.product.cpu.abi

#选择相应版本下载后,在电脑上进行解压

image.png
image.png

  1. 把 frida-server-16.1.7-android-arm64 推送到手机上 /data/local/tmp
adb push ./frida-server-16.1.7-android-arm64 /data/local/tmp

image.png

  1. 进入手机shell,查看是否安装成功

image.png

  1. 赋予可执行权限

chmod +x frida-server-16.1.7-android-arm64
image.png

  1. 运行frida-server,敲回车就可以执行了,卡主,表示启动了,如果没启动会报错

image.png

启动frida

当手机启动了frida-server后,电脑要与手机端进行通信,通过某个端口进行通信。

  • 方法一:
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
  • 方法二:使用python代码,右键运行即可
import subprocess # python中执行系统命令的一个模块
subprocess.getoutput("adb forward tcp:27042 tcp:27042")
subprocess.getoutput("adb forward tcp:27043 tcp:27043")

使用Python代码,打印手机中的进程和前台运行的进程


import frida

#1  获取设备信息  必须手机端启动了frida-server并且做了端口转发
rdev = frida.get_remote_device()

# 2 枚举所有的进程
# processes = rdev.enumerate_processes()
# for process in processes:
#     print(process)


# 3 打印出前台在运行的app
front_app = rdev.get_frontmost_application()
print(front_app)

image.png

hook方式

1、Python的hook方式

hook分为两种:spawn方案和attach方案

  • spawn方案:Spawn 方式是在目标应用程序启动时直接注入 Frida 的 Agent 代码
    • 需要在应用程序启动的早期阶段进行 Hook。
    • 需要访问和修改应用程序的内部状态,例如应用程序的全局变量、静态变量等。
    • 需要 Hook 应用程序的初始化过程,以实现对应用程序的自定义初始化逻辑。
    • 需要在应用程序的上下文中执行代码,并与其他模块或库进行交互。
import frida
import sys

### 这个代码不需要动### ### ###
rdev = frida.get_remote_device()
session = rdev.attach("app名")  # 写上要hook的app的名字
### 以后这个代码不需要动### ###



# 要改动的地方,js语法
scr = """
Java.perform(function () {
    //找到类的包名和方法名
    var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
    
    //替换类中的方法,方法有几个参数,就要传几个参数
    SecurityUtil.encodeMD5.implementation = function(str){
        console.log("参数:",str); // 传入的参数打印了,
        var res = this.encodeMD5(str); //调用原来的函数
        console.log("返回值:",res);  // 打印出正常执行这个方法,返回的结果
        return str; 
    }
});
"""



####下面代码完全不需要动
script = session.create_script(scr)
def on_message(message, data):
    print(message, data)
script.on("message", on_message)
script.load()
sys.stdin.read()
  • attach方案:Attach 方式是在目标应用程序已经运行的过程中动态地连接并注入 Frida 的 Agent 代码
    • 需要对已经运行的应用程序进行 Hook,即动态地连接到正在运行的进程。
    • 需要在应用程序运行时拦截和修改特定的方法调用。
    • 需要实时监视和修改应用程序的行为,例如参数修改、返回值篡改等。
    • 需要对应用程序进行调试和分析,以查找潜在的问题和漏洞。
import frida
import sys

rdev = frida.get_remote_device()
pid = rdev.spawn(["运行APP的包名"])
session = rdev.attach(pid)

scr = """
Java.perform(function () {
    // 包.类
    var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
    SecurityUtil.encodeMD5.implementation = function(str){
        console.log("明文:",str);
        var res = this.encodeMD5(str);
        console.log("md5加密结果=",res);
        return "305eb636-eb15-4e24-a29d-9fd60fbc91bf";
    }
});
"""
script = session.create_script(scr)


def on_message(message, data):
    print(message, data)


script.on("message", on_message)
script.load()
rdev.resume(pid)
sys.stdin.read()

2、js的hook方式

frida提供了js的api接口,可以使用js的脚本运行hook

  • attach方式
// 名字叫:hook.js
Java.perform(function () {
    // 包.类
    var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
    SecurityUtil.encodeMD5.implementation = function(str){
        console.log("明文:",str);
        var res = this.encodeMD5(str);
        console.log("md5加密结果=",res);
        return "123";
    }
});

// attach 运行 命令 (应用已经在前台运行了,不需要指定应用名字和包名)
// frida -UF -l hook.js  
  • spawn
// hook.js
Java.perform(function () {
    // 包.类
    var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
    SecurityUtil.encodeMD5.implementation = function(str){
        console.log("明文:",str);
        var res = this.encodeMD5(str);
        console.log("md5加密结果=",res);
        return "123";
    }
});

// spawn 方案运行 命令,会重启应用,需要指定应用的包名,不能不写包名,不写包名,不知道启动哪个应用
// frida -U -f com.che168.autotradercloud -l hook.js



# 注意:输入q + 再点击回车则退出

Python常见的加密算法

1、MD5加密

import hashlib
m = hashlib.md5()
m.update('helloworld'.encode("utf8"))
print(m.hexdigest()) # md5加密后的16进制

2、sha1加密

import hashlib
sha1 = hashlib.sha1()
data = 'helloword'
sha1.update(data.encode('utf-8'))
sha1_data = sha1.hexdigest()
print(sha1_data) # sha1 加密后的16进制

3、DES加密

# pip3 install pycryptodomex -i https://pypi.douban.com/simple
# DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。它的密钥长度是56位(因为每个第8 位都用作奇偶校验),密钥可以是任意的56位的数,而且可以任意时候改变。

from Cryptodome.Cipher import DES
key = b'88888888'
data = "hello world"
count = 8 - (len(data) % 8)
plaintext = data + count * "="
des = DES.new(key, DES.MODE_ECB)
ciphertext = des.encrypt(plaintext.encode())
print(ciphertext)

plaintext = des.decrypt(ciphertext)
plaintext = plaintext[:(len(plaintext)-count)]
print(plaintext)

4、非对称加密算法RSA

# 安装模块
pip3 install rsa -i https://pypi.douban.com/simple

import rsa
# 返回 公钥加密、私钥解密
public_key, private_key = rsa.newkeys(1024)
print(public_key)
print(private_key)

# plaintext = b"hello world"
# ciphertext = rsa.encrypt(plaintext, public_key)
# print('公钥加密后:',ciphertext)
# plaintext = rsa.decrypt(ciphertext, private_key)
# print('私钥解密:',plaintext)

### 使用私钥签名
plaintext = b"hello world"
sign_message = rsa.sign(plaintext, private_key, "MD5")
print('私钥签名后:',sign_message)

## 验证私钥签名
plaintext = b"hello world"
# method = rsa.verify(b"hello world", sign_message, public_key)
method = rsa.verify(b"hello world1", sign_message, public_key) # 报错Verification failed
print(method)

5、base64编码

import base64

# 编码
res=base64.b64encode(b'hello world')
print(res)

# 解码
res=base64.b64decode('aGVsbG8gd29ybGQ=')
print(res)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

固态浸压计

Solid State Dip Meter(固态浸没仪/固态浸压计) 是真空管栅极浸入式仪表的固态半导体版本。它是一种用于测量 LC 电路谐振频率的仪器。LC 电路是由电感 (L) 和电容 (C) 组成的电路。当电感的感抗与电容的容抗相互抵消时,这些元件可以谐振于特定频率。 固态浸入式仪…

matlab中Signal Editor定义梯形信号输出矩形信号

matlab中Signal Editor定义梯形信号输出矩形信号,可以通过如下勾选差值数据实现梯形信号输出。

MySQL数据库介绍与部署

背景 MySQL 是一个开源的关系型数据库管理系统(RDBMS),最初由瑞典公司 MySQL AB 开发,后被 Oracle 公司收购。MySQL 使用标准 SQL 进行查询和管理数据,并支持多种操作系统。它是最流行的开源数据库之一,被…

金属表面缺陷检测设备通常采用计算机视觉技术和机器学习算法

金属表面缺陷检测是在金属制造过程中非常重要的质量控制步骤。它涉及检测金属表面可能存在的各种缺陷,如裂纹、气泡、凹坑、氧化、斑点等。这些缺陷可能会影响金属制品的性能和质量,因此需要及早发现并进行处理。 目前,金属表面缺陷检测通常采…

C++:部分题目

1. 封装、继承、多态 封装:将所需的数据成员,以及对数据的操作方法(成员函数),绑定在一起成为类(类型),定义该类型的对象时,成员被自动隐藏在对象内部。通过封装可以限定…

模拟算法总述

模拟 1.模拟算法介绍 模拟算法通过模拟实际情况来解决问题,一般容易理解但是实现起来比较复杂,有很多需要注意的细节,或者是一些所谓很”麻烦”的东西。 模拟题一般不涉及太难的算法,一般就是由较多的简单但是不好处理的部分组成…

.net使用excel的cells对象没有value方法——学习.net的Excel工作表问题

$exception {"Public member Value on type Range not found."} System.MissingMemberException 代码准备运行问题解决1. 下载别的版本的.net框架2. 安装3. 运行 代码 Imports Excel Microsoft.office.Interop.Excel Public Class Form1Private Sub Button1_Click(…

Adams Car——Adams car与Simulink联合仿真

1.修改悬架阻尼、刚度 ①先找到车辆悬架阻尼和刚度文件,这里以阻尼显示为例 ②修改阻尼曲线 找到对应车的文件 ③修改完后进行替换,刚度修改同理 2.转动惯量与车的质量修改

SQL server服务连接失败,通过端口1433连接到主机 localhost的 TCP/IP 连接失败

SQL server服务连接失败,通过端口1433连接到主机 localhost的 TCP/IP 连接失败 出现这个错误的时候,首先确保sql的服务正常启动 通常来说正常安装的SQL server之后,会自带一个软件 打开:SQL server配置管理器 确认一下红框内的…

单片机--数电(2)

组合逻辑电路 根基题目要求设计逻辑电路 组合逻辑电路 由一些逻辑门电路搭建,为实现某些功能的电路 特点 在任意时刻输出只取决于该时刻的输入,与电路原来的状态无关 根据图分析组合逻辑的方法 可以使用multisim的逻辑转换仪 1组合逻辑电路图 2…

C语言——自定义类型——结构体(从零到一的跨越)

目录 前言 1.什么是结构体 2.结构体类型的声明 2.1结构体的声明 2.2结构体的创建和初始化 2.3结构成员访问操作符 2.3.1结构体成员直接访问 2.3.2结构体成员的间接访问 2.4结构体变量的重命名 2.5结构体的特殊声明 2.6结构的自引用 3.结构体内存对齐 3.1对齐规则 3…

保护王国的钥匙:探索特权访问管理 (PAM) 的深度

在零信任架构的范例中,特权访问管理(PAM)正在成为网络安全策略的关键组成部分,旨在控制和监控组织内的特权访问。本文深入探讨了 PAM 在现代网络安全中的关键作用,探讨了其原理、实施策略以及特权访问的演变格局。 什么…

3.20作业

1、思维导图 2、 1> 创建一个工人信息库,包含工号(主键)、姓名、年龄、薪资。 2> 添加三条工人信息(可以完整信息,也可以非完整信息) 3> 修改某一个工人的薪资(确定的一个&am…

机器学习_聚类(Clustering)

文章目录 简介K-均值算法(K_Means) 简介 你经常跟哪些人联系,而这些人又经常给哪些人发邮件,由此找到关系密切的人群。因此,这可能需要另一个聚类算法,你希望用它发现社交网络中关系密切的朋友。 K-均值算法(K_Means) K-均值是…

Cesium新版修改源码后,编译不生效问题

最新版本的cesium源码在编译时默认使用node_models下的cesium/engine,从而导致咱们修改项目中的源码并不会生效 解决方式 : 进入到实际的源码位置,执行npm link 在返回到源码的根目录下执行 npm link ./packages/engine

​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结

接上次博客:Redis(四):持久化和事务:RDB(定期备份)【触发机制、流程说明、文件的处理、优缺点】、AOF(实时备份)【使用AOF、命令写入、文件同步、重写机制、启动时数据恢…

DEiT中如何处理mask数据的?与MAE的不同

在DeiT里面,是通过mask的方式,将maskunmasked的patches输出进ViT中,但其实在下游任务输入的patches还是和训练时patches的数量N是一致的(encoder所有的patches)。 而MAE是在encoder中只encoder未被mask的patches 通过…

蓝桥杯java组 螺旋折线

题目描述 如图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。 例如dis(0, 1)3, dis(-2, -1)9 给出整点坐标(X, Y),你能计算出dis(X, Y)吗? 【输入格…

直播预告|Sora 会怎样驱动视频编解码领域的突破与革新

在数字化时代,视频内容的传播与消费已成为日常生活的一部分。视频编解码技术是数字媒体领域的一项核心技术,它影响着视频质量,传输速度以及观看体验。与此同时,视频产业正在经历一场由技术驱动的变革,Sora、AIGC 等相关…

通用组件封装——iconfont 封装图标组件

文章目录 背景一、iconfont 处理1. 一键添加入库功能2. 图标项目配置 二、代码实现 背景 在项目中会使用到大量的图标,而 element 等组件库现有的 icon 图标可能无法满足项目的需要,比如很多图标没有可以替代的,或者项目中有彩色图标的需求都…