文章目录
- Hook 框架 Frida
- Hook框架介绍
- 下载和安装
- Frida 的使用
- 手机端启动frida服务端
- 电脑端配置
- 简单使用
- python的hook方式
- js的hook方式
Hook 框架 Frida
Hook框架介绍
Hook 框架是一种技术,用于在运行时拦截和修改应用程序的行为。
通过 Hook,你可以劫持应用程序的方法调用、修改参数、篡改返回值等,以达到对应用程序的修改、增强或调试的目的
常见hook框架:
- Xposed Framework:Xposed 是一个功能强大的开源 Hook 框架,可以在不修改应用程序源代码的情况下,对应用程序进行各种修改。它允许你编写模块来拦截和修改应用程序的方法调用,修改应用程序的行为和逻辑。
- Frida:Frida 是一个跨平台的动态 Hook 框架,支持安卓和其他操作系统。它提供了一个强大的 JavaScript API,可以在运行时对应用程序进行 Hook,包括方法拦截、参数修改、调用注入等。Frida 可以用于安全研究、逆向工程和应用程序调试等方面。
下载和安装
Frida 需要同时安装在手机端和电脑端。电脑端基于python 解释器环境安装,并且手机端的软件版本需要和python 模块版本保持一致
电脑端安装
# 装最新,两个模块pip install frida --upgradepip install frida-tools --upgradepip list | grep frida frida 16.4.10 # 手机端也要装这个版本frida-tools 12.5.0
手机端安装
# 1 查看手机架构adb shell getprop ro.product.cpu.abi# arm64-v8a
# 2 去github下载 frida-server 对应手机的版本https://github.com/frida/frida/releases下载:frida-server-16.4.10-android-arm64.xz# 3 解压后得到:frida-server-16.4.10-android-arm64
# 4 上传到手机 : /data/local/tmpadb push ./frida-server-16.4.10-android-arm64 /data/local/tmp
# 5 在cmd中进入到手机内adb shellsu # 手机需要解rootcd /data/local/tmpls # 查看当前目录下所有文件和文件夹# 看到这个文件:frida-server-16.4.10-android-arm64
# 6 赋予这个软件执行权限--》liunxchmod +x frida-server-16.4.10-android-arm64 # 加上执行权限
Frida 的使用
手机端启动frida服务端
# 切换到frida-server所在路径
adb shell
su
cd /data/local/tmp
./frida-server-16.4.10-android-arm64 # 卡在这里--》就是运行起来了# ctrl+c 是停止,使用过程中不要停止# 遇到如下错误:重启手机
电脑端配置
# 方式一:命令行执行
adb forward tcp:27042 tcp:27042 # 端口转发
adb forward tcp:27043 tcp:27043# 方式二:使用python执行
import subprocess
subprocess.getoutput("adb forward tcp:27042 tcp:27042")
subprocess.getoutput("adb forward tcp:27043 tcp:27043")
简单使用
import frida
# 获取设备信息
rdev=frida.get_remote_device()
# 循环打印出目前手机上运行的进程
processes = rdev.enumerate_processes()
for process in processes:print(process)# 获取手机前台在运行的应用
front_app = rdev.get_frontmost_application()
print(front_app)
#Application(identifier="com.google.android.apps.photos", name="相册", pid=29155, parameters={}) 应用包名和应用名# 下图错误原因--》没有做端口转发,或者手机端没启动frida-server
python的hook方式
frida的hook 脚本的api是要用js写的,能用python写是因为我们装了个模块去进行转换,本质还是在写js
hook方式分两种
-spawn方案-在app启动的时候,就注入-解决app在一开始运行时就要hook的情况-唯品会:只要app第一次启动,会向后端发送一个请求,注册设备(自动发的)-attach方案-要hook的应用启动了,写了脚本运行--》脚本运行后注入,程序卡住-当进行某个操作--》触发hook到的函数,控制台就会有打印-针对于登录:-点击了登陆了按钮,再hook,知道hook的时机
hook车智赢的密码逆向
-
获取车智赢app信息
import frida # 获取设备信息 rdev=frida.get_remote_device() # 获取手机前台在运行的应用 front_app = rdev.get_frontmost_application() print(front_app)# Application(identifier="com.che168.autotradercloud", name="车智赢+", pid=28133, parameters={})
-
attach方案
# 刚刚hook车智赢的密码加密就是这个方案
import frida
import sys
#1 连接手机设备
rdev = frida.get_remote_device()#2 链接到这个应用: 车智赢+
session = rdev.attach("车智赢+") # attach 使用name就行,需要手机app 前台开开app 页面# 3 重点:字符串--》》js的hook语法
scr = """
//1 外层是固定到的写法
Java.perform(function () {//2 找到类 反编译的首行+类名:com.autohome.ahkit.utils下的 配合jadx 使用var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");//替换类中的方法SecurityUtil.encodeMD5.implementation = function(str){console.log("入参是:",str); // 打印入参--》本来传入的密码是111111---》我们可以改成22222var res = this.encodeMD5(str); //调用原来的函数console.log("返回值:",res); // 把原来函数返回结果打印出来return str; // 返回值正常应该是:res,但是我返回了str---》抓包抓到的密码,就是明文密码}
});
"""# 4 以后下面的代码是固定的,不会动--》不用管是什么意思
script = session.create_script(scr)
def on_message(message, data):print(message, data)
script.on("message", on_message)
script.load()
sys.stdin.read()
- spawn方案
# 使用spawn方案演示hook密码加密
import frida
import sysrdev = frida.get_remote_device()
pid = rdev.spawn(["com.che168.autotradercloud"]) # spawn 方案 需要使用 identifier,执行程序会自动打开/重启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()
js的hook方式
js脚本
// 这块实际上就是python hook 里面的 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";}
});
attach方案
# 来到当前js所在目录执行--》hook正在运行的应用
frida -UF -l 4-js-hook车智赢加密.js# 按q退出
spawn方案
# 会重启app,hook 写了包名的应用
frida -U -f com.che168.autotradercloud -l 4-js-hook车智赢加密.js