APP逆向之Frida基础教程

流转 Lv3

入门

安装

1
2
3
Frida 代码自动补全
```bash
npm install --save @types/frida-gum

安装Frida

1
2
pip install frida-tools
pip install objection

找到相应版本的Frida 推送到设备中

https://github.com/frida/frida/releases/tag/16.5.1

命令

1
adb push frida-server16.5.1 /data/local/frida-server16.5.1

基础命令

frida-tools里面还提供了五个实用工具
frida-discover、
frida-kill、
frida-ls-devices、
frida-ps以及
frida-trace
在 shims下面

获取可用设备列表

1
frida-ls-devices

获取设备进程列表
frida-ps [options]

● -U:连接到USB设备。
● -D:如果有多个USB设备,可以用该选项指定设备的UDID。
● -R/-H:连接到远程frida-server,主要用于远程调试。
● -a:仅显示正在运行的应用。
● -i:显示所有已安装的应用(包括App Store应用和系统应用)。

具体demo:

  • 连接到USB设备查看进程列表 frida-ps -U
  • 连接到USB设备查看正在运行的应用 frida-ps -U -a
  • 连接到USB设备查看所有安装的应用 frida-ps -U -a -i
  • 指定查看某个设备 frida-ps -D xxxx -a

遇到的坑:

  1. windows上frida环境配置出现Waiting for USB device to appear…
    解决:
    运行下面代码
    1
    2
    adb forward tcp:27042 tcp:27042
    frida-ps -H 127.0.0.1:27042

结束设备的某个进程
frida-kill工具用来结束设备上的某个进程,它的使用规则如下:

  • frida-kill -U /
  • frida-kill -D /

例如用frida-ps获取了微信的PID为1815,

则可以用如下命令结束它:

1
2
3
4
frida-kill -U 1815  
frida-kill -U 微信
frida-kill -D xxxx 1815
frida-kill -D xxxx 微信

frida 追踪

https://frida.re/docs/frida-trace/

frida-trace工具用于跟踪函数或方法的调用,其功能非常强大,使用“-h”选项来查看帮助信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 设备相关
-D 连接到指定的设备,多个设备时使用。示例:frida-trace -D 555315d66cac2d5849408f53da9eea514a90547e -F
-U 连接到USB设备,只有一个设备时使用。示例fria-trace -U -F

// 应用程序相关
-f 目标应用包名。spawn模式。示例:frida-trace -U -f com.apple.www
-F 当前正在运行的程序。attach模式示例。示例:frida-trace -U -F或frida-trae -UF
-n 正在运行的程序的名字。attach模式。示例:frida-trace -U -n QQ
-N 正在运行的程序的包名。attach模式。示例:frida-trace -U -N com.apple.www
-p 正在运行的程序的pid。attach模式。示例:frida-trace -U -p 2302

// 方法相关,以下参数在一条跟踪命令中可重复使用
-I 包含模块。示例:frida-trace -UF -I "libcommonCrypto*"
-X 不包含模块。示例:frida-trace -UF -X "libcommonCrypto*"
-i 包含c函数。示例:frida-trace -UF -i "strtsr"
-x 不包名c函数。示例:frida-trace -UF -i "*MD5" -x "CC_MD5"
-a 包含模块+偏移跟踪。示例:frida-trace -UF -a 模块名\!0x7B7D48
-j 包含某个Java方法 实列frida-trace -UF -j '*!*tesucanshu*/isu'
!用来分隔MODULEOFFSET,例如"gdi32full.dll!ExtTextOutW"
*代表匹配任意内容

-J 包含某个Java方法 实列frida-trace -UF -J '*!*tesucanshu*/isu'


// 日志相关
-o 日志输出到文件。示例:frida-trace -UF -j '*!*tesucanshu*/isu' -o run.log

附加的两种方式

1.Attach模式

前台打开APP:

frida -UF -l 脚本.js

2.Spwan模式

    frida -U -f 包名 
    %resume
    可以加 --no-pause
    
但是在 16的版本已经取消 --no-pause 具体命令自行研究

另外需要一点JS和python语法基础

Hook 构造函数

常用API:

​ 是一个非常重要的对象,在里面有许多的API。在对Java层进行hook时,是必须要写Java.perform的。

Java.perform

Java.perform(fn)主要用于当前线程附加到Java VM并且调用fn方法

Java.available

该函数一般用来判断当前进程是否加载了JavaVM,DalvikART虚拟机 通俗一点讲是否在Java代码空间

Java.androidVersion

显示android系统版本号

Java.use

Java.use(className),动态获取className的类定义 类似于xposed里面的获取Class 可以直接点到源代码看他的定义

Java.use(类名).方法名.implementation

获取方法的实现

overload

重载参数

.$init()

拦截构造函数时候使用

立即注入或者延迟注入

setImmediate(test);
setInterval(test,1000);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function main() {
Java.perform(function () {
if (Java.available) {
var Person_class = Java.use("com.example.hookdemo.Person");

//hook构造函数
Person_class.$init.overload('java.lang.String', 'int', 'java.lang.String').implementation = function (a1, a2, a3) {
console.log(a1, a2, a3);
var result = this.$init(a1, a2, a3);
return result;

}

//查看参数
Person_class.setAddress.implementation = function (address) {
console.log("address=>", address);
var result = this.setAddress("address");
console.log("result=>", result);
return result;
}

//查看返回值
Person_class.getName.implementation = function () {
var result = this.getName();
console.log("result=>", result);
return result;
}


//重载函数
Person_class.print.overload('java.lang.String', 'int', 'java.lang.String').implementation = function (a1, a2, a3) {
console.log(a1, a2, a3);
var result = this.print(a1, a2, a3);
return result;
}
}
})
}

setImmediate(main)
  • 标题: APP逆向之Frida基础教程
  • 作者: 流转
  • 创建于 : 2024-09-18 22:38:36
  • 更新于 : 2024-10-23 12:45:18
  • 链接: http://hybpjx.github.io/2024/09/18/APP逆向之Frida基础教程/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论