前言
在日常分析安卓应用时,通常会有对应用进行hook的需求,用的比较多的hook框架有Xposed,frida,xhook等,正好最近接触Frida接触的较多,所以对Frida的一些常用操作做个记录,方便以后翻阅查询,同时也可以对学习frida的小伙伴有个参考的资料;
一般Frida逆向三阶段:
- 阶段一.分析程序执行逻辑,函数参数,函数返回值
- 阶段二.在1的基础上对数据进行修改,执行流程的控制,核心方法的调用
- 阶段三.在2的基础上实现对核心方法的封装调用,提供对外服务接口
1.FRIDA安装
1.1.安装python3环境
https://www.python.org/ 下载最新的直接安装
1.2.frida安装
C:\Users\Administrator>pip install frida-tools
Collecting frida-tools
/...省略.../
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Running setup.py install for frida-tools ... done
Successfully installed colorama-0.4.0 frida-12.2.25 frida-tools-1.2.2 prompt-toolkit-1.0.15 pygments-2.2.0 six-1.11.0 wcwidth-0.1.7
推荐下面这个版本 非常稳定 实测
pip install frida==14.2.18
pip install frida-tools==9.2.5
pip install objection==1.8.4
1.3.frida-server下载
frida-server下载需要注意的有两点:
1.安装的frida版本:需要下载与安装的frida版本对应的frida-server,否则会出错。
C:\Users\Administrator>frida --version
12.2.25
下载地址:https://github.com/frida/frida/releases
2.手机设备的架构:因为我的手机是arm64平台的所以选择的是android-arm64
frida-server-12.2.25-android-arm64.xz
下载完毕之后,解压后通过adb push到设备的临时目录下
adb push frida-server-12.2.25-android-arm64 /data/local/tmp/
1.4.启动frida服务并连接
adb shell进入设备shell环境,cd到临时目录下,给frida-server文件设置可执行权限使其可以运行
chmod 755 frida-server-12.2.25-android-arm64
之后运行frida服务文件,注意需要通过root权限去运行
./frida-server-12.2.25-android-arm64
然后 进行端口转发
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
完毕后就可以在windows上运行简单的frida命令测试我们是否安装成功了
/* -U 连接USB设备 */
/* frida-ps 列出正在运行的进程*/
C:\Users\Administrator>frida-ps -U
PID Name
---- --------------------------------
310 1:3
714 360sguard
723 360sguard
373 ATFWD-daemon
575 adbd
259 adsprpcd
[....]
3289 zygote
1.5.搭建frida开发环境
$ git clone git://github.com/oleavr/frida-agent-example.git
$ cd frida-agent-example/
$ npm install
$ frida -U -f com.example.android --no-pause -l _agent.js
2.FRIDA 基础
首先来看一下frida的常用功能
常见的参数及其含义:
参数 | 含义 |
---|---|
-U | 使用 USB 设备连接 |
-l | 指定js脚本的路径名字 |
-F | app 最前显示的应用 |
-f | 指定包名,自动启动 app 用%resume 恢复主线程 |
–no-pause | 启动后,自动运行主线程 可省略%resume |
–debug | 附加到 Node.js 进行调试 |
-o | 将输入的日志文件保存到指定路径 |
-p | 指定进程ID |
-n | 指定包名附加 |
举个例子:
frida -U --no-pause -f tv.danmaku.bili -l hook_bilibili.js -o hook_bili.log
2.1.frida查看当前设备进程
λ frida-ps -U
PID Name
----- -------------------------------------------------------
6241 adbd
897 adsprpcd
749 android.hardware.audio@2.0-service
947 android.hardware.biometrics.fingerprint@2.1-service.fpc
750 android.hardware.bluetooth@1.0-service-qti
600 android.hardware.boot@1.0-service
752 android.hardware.camera.provider@2.4-service
753 android.hardware.cas@1.0-service
612 android.hardware.configstore@1.1-service
[...]
2.2.frida对指定方法进行trace
λ frida-ps -U | grep frida
31521 cn.gemini.k.fridatest
30073 frida-helper-32
λ frida-trace -i "open" -U "cn.gemini.k.fridatest"
Instrumenting...
open: Auto-generated handler at "E:\\Frida\\frida_work\\__handlers__\\libutils.so\\open.js"
Started tracing 1 function. Press Ctrl+C to stop.
/* TID 0x7b3a */
16061 ms open()
/* TID 0x7b3c */
16114 ms open()
16114 ms open()
16114 ms open()
用的比较多的一般就是上面的两个功能,都是frida帮我们生成好了hook代码,直接拿来使用就行,简单方便,但有时候我们想自己定制些功能怎么办?
接下来看下如何通过编写js代码来实现对安卓APP中某些方法的hook。
在hook之前首先要熟悉我们需要hook的目标方法,应用包名,参数等基础信息。这里简单写了个demo,后面我们都通过这个demo来学习。
package cn.gemini.k.fridatest;
import android.util.Log;
public class FridaHook1 {
static String password = "88888888";
int cde = 20;
int abc = 10;
public int abc(){
return abc;
}
FridaHook1(){
Log.e(