安卓hook之frida安装入门

frida是一个使用动态二进制插桩技术的跨平台工具,最早在测试安卓APP项目时接触到的。网上关于frida的教程很多,大多数人(至少我)可能只会用到百分之几的功能。本文仅重点介绍(还原)安装frida的过程。

我的测试环境:win10 64位;python3.8.0(官方推荐python3.x,我测试时2.8版本没成功也没折腾多版本python切换就直接卸载安装3.8了);夜神模拟器安卓7.1。

一、在win10上安装frida客户端

可去官网看frida支持的python版本 https://pypi.org/project/frida/#files

主要命令
pip install frida
pip install frida-tools
pip list会列出所有安装的模块我的frida版本是15.1.17

记住在windows系统下的firda版本,然后去下载对应版本的frida-server

二、下载frida-server服务端

下载地址https://github.com/frida/frida/releases 注意: frida版本要与frida-server版本一致

下载与15.1.17对应的frida-server版本(注意后面细分版本一般安卓模拟器是x86,安卓手机是arm64)

三、在安卓模拟器上安装frida-server服务端

使用夜神adb操作模拟器,可以参考这个地址 https://blog.csdn.net/test_leader/article/details/115491496

1、在模拟器的安卓上打开所有开发者调试相关开关

2、找到夜神安卓目录下的nox_adb.exe进行连接,不会找的可以用windows的搜索后打开所在目录。

打开cmd命令行切换到当前目录(也可以在该文件夹空白的地方按住shift键+鼠标右键,然后选择在此处打开命令行/Powershell)

nox_adb.exe connect 127.0.0.1:62001

3、把下载的frida-server文件(我下的是frida-server-15.1.17-android-x86.xz)解压后复制到第2步的nox_adb.exe所在文件夹里面重命名为firda-server(注意这个文件没有后缀),然后使用adb命令进行相关安装操作。

推送frida-server这个文件到模拟器的tmp目录
adb push frida-server /data/local/tmp/
推送完成后依次执行adb命令,修改权限并执行frida-server程序
adb shell
cd /data/local/tmp/ 
chmod 777 frida-server 

./frida-server &

执行完上面操作后,可以新打开一个cmd窗口执行frida-ps -U命令查看是否能显示模拟器上的安卓进程

如果出现失败可能就是frida-server版本出问题了,还有需要root权限,建议使用夜神模拟器。

4、关于端口转发

转发Android tcp端口到本地(新版本的frida可能不需要端口转发,老版本的需要转发,为以防万一建议还是执行下这2行命令)
), 电脑上运行如下命令 :
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043

5、关于模拟器重启后或执行python脚本异常报错

frida.TransportError: error receiving data: 远程主机强迫关闭了一个现有的连接。

需要在模拟器中运行frida server程序(如果还是不行,建议先重启模拟器后再重新执行命令打开frida服务端)
adb shell
cd /data/local/tmp/
./frida-server &

四、执行一个python脚本来hook

我是实现了hook目标app的md5函数,只要目标app调用了md5就可以打印出来。如果你测试的app有源码或能反编译的话可以通过hook相关验签函数来实现app签名或逻辑校验绕过等功能(比如app有时会有强制更新,可以通过直接将app判断强制更新的函数hook后改成不更新或非强制更新)

下面是我测试时的代码,仅供学习使用,不能在不同app之间通用,我hook的是com.xxx.test.ec.util.Md5Util这个方法,这个需要根据app的实际方法来,我是通过jadx反编译后复制出来的类名。

# -*- coding: utf-8 -*-
# 导入 frida, sys 库
import frida, sys

#md5--hook-
jscode = """
Java.perform(function(){
  <!-- 获取 MD5Util 这个类的对象 -->
  var utils = Java.use("com.xxx.test.ec.util.Md5Util");
  <!-- 调用 ToMd5 这个,这个方法的参数有1个 -->
    utils.md5.overload('java.lang.String').implementation = function(a){

    send("Hook Start...");
    send("传入参数: " +a);

    <!-- 获取 ToMD5 这个方法执行的结果,并打印到控制台上 -->
        var res= this.md5(a);
    send("ToMD5 方法返回值: " +res);

    return res;
  }
});
"""
# 这下面的代码的作用就是为了执行上面 JS 代码,输出 JS 中 send() 方法中的内容
def message(message, data):
  if message["type"] == 'send':
    print("[*] {0}".format(message['payload']))
  else:
    print(message)

# 获取这个 APK 的进程
#process = frida.get_remote_device().attach('com.xxx.test:pushcore')
#process = frida.get_usb_device().attach(3281)
process = frida.get_remote_device().attach('这里填目标app的名字')
# 加载 JS 代码
script = process.create_script(jscode)
script.on("message", message)
print('[*] Running CTF')
script.load()
sys.stdin.read()

其他参考来源:

frida基础详解 https://www.secpulse.com/archives/132082.html

frida初级到高级 https://blog.csdn.net/cqcre/article/details/106798576

基于互联网精神,在注明出处的前提下本站文章可自由转载!

本文链接:https://ranjuan.cn/android-hook-frida-base/

赞赏

微信赞赏支付宝赞赏

wordpress-hide-category
无法打开数据库msdb恢复操作已将该数据库标记
如何设计简单的php在线考试系统