初识HOOK框架frida

news2024/11/24 11:01:30
  • 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)

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

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

相关文章

算法体系-11 第十一节:二叉树基本算法(上)

一 两链表相交 1.1 题目描述 给定两个可能有环也可能无环的单链表,头节点head1和head2。请实现一个函数,如果两个链表相交,请返回相交的 第一个节点。如果不相交,返回null 【要求】 如果两个链表长度之和为N,时间复杂…

什么是GPU云服务器?2024腾讯云GPU云服务器全解析!

腾讯云GPU服务器是提供GPU算力的弹性计算服务,腾讯云GPU服务器具有超强的并行计算能力,可用于深度学习训练、科学计算、图形图像处理、视频编解码等场景,腾讯云百科txybk.com整理腾讯云GPU服务器租用价格表、GPU实例优势、GPU解决方案、GPU软…

名词【语法笔记】

1.名词分为几大类 2.每一类,又有几个小类,以及所需要注意什么

python中字典相关知识点总结

1.字典的定义 字典:在Python中,字典是一系列键-值对。每个键都与一个值相关联,程序员可以通过键来访问与之相关联的值。 实际举例: student{name:xincun,age:18} 通过实例我们可以发现,键-值对是两个相关联的值。指…

3.20作业

1.创建一个工人信息库,包含工号(主键),姓名,年龄,薪资 CREATE TABLE work (id int, name char, age int,money float); 2.添加三条工人信息(可以完整信息,也可以非完整信息&#xff…

Twincat实现电机控制

不仅是控制系统的核心部分,而且能够将任何基于PC的系统转换为一个带有PLC、NC、CNC和机器人实时操作系统的实时控制系统。TwinCAT软件在工业自动化领域具有广泛的应用,特别是在机器人关节电机控制方面!!! 在机器人关节电机控制方面,TwinCAT通…

【C语言基础篇】字符串处理函数(二)strcpy的介绍及模拟实现

目录 一、strcpy介绍 函数原型: 函数功能: 函数参数: 函数返回值: 二、strcpy模拟实现 代码: 测试: 个人主页: 倔强的石头的博客 系列专栏 :C语言指南 C语言刷题系列…

JeePlus低代码开发平台存在SQL注入漏洞

漏洞描述 JeePlus低代码开发平台存在SQL注入漏洞 fofa语句 app"JeePlus" 漏洞复现 打开页面 构造payload GET /a/sys/user/validateMobile?mobile1%27and1%3D%28updatexml%281%2Cconcat%280x7e%2C%28selectmd5%281%29%29%2C0x7e%29%2C1%29%29and%271%27%3D%271…

六、循环结构

在python当中有两类循环结构:for循环和while循环 一、遍历for循环 for循环首先判断遍历对象中是否有元素,在依次遍历 for循环常与range()函数使用 for i in range(1,10,):#range()函数依次遍历1~10但不包括10print(i,end ) p…

账号+密码+图片验证码认证

账号密码图片验证码认证 实现步骤 实现账号密码认证,执行流程如下 第一步: 对于验证码服务工程的生成验证码图片的接口在网关处需要放行,否则页面无法获取生成的验证码图片 /**临时放行所有请求 /auth/**认证服务地址 /content/open/**内容管理公开访问文件接口 …

【计算机视觉】Gaussian Splatting源码解读补充(二)

第一部分 目录 三、前向传播(渲染):submodules/diff-gaussian-rasterization/cuda_rasterizer/forward.cu预备知识:CUDA编程基础 三、前向传播(渲染):submodules/diff-gaussian-rasterization/c…

软件工程导论画图题汇总:期末+复试

文章目录 一、数据模型:实体联系图(E-R图)二、行为模型:状态转换图三、功能模型:数据流图四、数据字典五、系统流程图六、层次图七、HIPO图八、结构图九、程序流程图十、盒图十一、PAD图十二、判定表、判定树 一、数据…

Vue2(四):Vue监测数据的原理

一、先来看一个问题 添加一个按钮点击更新马冬梅的信息&#xff1a; <button click"gengxin">点击更新马冬梅的信息</button> methods:{gengxin(){this.person[1].name马老师,this.person[1].age50,this.person[1].sex男}} 下面这种方式就不能奏效&a…

数据库系统概论-第5章 数据库完整性

5.1 实体完整性 5.2 参照完整性 5.3 用户定义完整性 5.4 完整性约束命名子句 5.5 域中的完整性限制 5.6 断言 5.7 触发器 5.8 小结

STM32CubeIDE基础学习-EXTI外部中断实验

STM32CubeIDE基础学习-EXTI外部中断实验 文章目录 STM32CubeIDE基础学习-EXTI外部中断实验前言第1章 硬件介绍第2章 工程配置2.1 工程外设配置部分2.2 生成工程代码部分 第3章 代码编写第4章 实验现象总结 前言 中断概念&#xff1a;让CPU打断正在执行的程序&#xff0c;进而去…

第8关:删除P表中所有的记录

任务描述 删除P表中所有的记录 相关知识 零件表P由零件代码&#xff08;PNO&#xff09;、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成&#xff1b; P表如下图&#xff1a; 现已构建P表&#xff0c;结构信息如下&#xff1a; 开始你的任务吧&#xff0c;祝你成功 USE my…

spring MVC是如何找到html文件并返回的?

Spring MVC 搜索路径 启动一个SpringBoot项目时&#xff0c;访问http://localhost:8080&#xff0c;对于SpringMVC&#xff0c;它会默认把这段url看成http://localhost:8080/index.html&#xff0c;所以这两个url是等价的。 .html, .css, .js, .img …都是静态资源文件&#x…

直播预约丨《袋鼠云大数据实操指南》No.1:从理论到实践,离线开发全流程解析

近年来&#xff0c;新质生产力、数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮&#xff0c;持续冲击并革新着企业数字化转型的观念视野&#xff0c;昭示着一个以数据为核心驱动力的新时代正稳步启幕。 面对这些引领经济转型的新兴概念&#xff0c;为了更好地服务于客户…

6.如何判断数据库搜索是否走索引?

判断是否使用索引搜索 索引在数据库中是一个不可或缺的存在&#xff0c;想让你的查询结果快准狠&#xff0c;还是需要索引的来帮忙&#xff0c;那么在mongo中如何判断搜索是不是走索引呢&#xff1f;通常使用执行计划&#xff08;解释计划、Explain Plan&#xff09;来查看查询…

Linux之缓冲区与C库IO函数简单模拟

缓冲区 首先, 我们对缓冲区最基本的理解, 是一块内存, 用户提供的缓冲区就是用户缓冲区, C标准库提供的就是C标准库提供的缓冲区, 操作系统提供的就是操作系统缓冲区, 它们都是一块内存. 为什么要有缓冲区? 先举个生活中的例子, 我们寄快递的时候往往是去驿站寄快递, 而不是…