Frida从入门到放弃

安装Python

安装Frida

1
2
pip install frida
pip install frida-tools

转发端口

1
2
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043

查看手机安装的应用

1
frida-ps -aU

附加进程

1
2
frida -U -f com.kuaiduizuoye.scan --no-pause
frida -U -f cn.soulapp.android --no-pause

Java

构造函数

点击跳转

方法

点击跳转

成员变量

Native

Native分两种情况

  • 导出函数
  • 未导出函数

若为导出函数可直接使用函数名作为Hook的参数
若为未导出函数,则需要用到地址。

每次加载So到内存,虚拟机都会为其分配个地址,为基地址。
地址为:基地址+相对地址(不同平台不同)

在Frida中有两种计算方式

  • 手动
  • Frida自动

手动方法如下

查看进程pid(第二个数字)

1
ps | grep com.kuaiduizuoye.scan

查看基地址

1
cat /proc/2275/maps |grep libanti_spam.so

自动方法如下
Module.findBaseAddress(“libanti_spam.so”).add(0x00001ddc)

可参考的模板代码

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
41
42
43
44

import frida
import sys

rdev = frida.get_remote_device()
session = rdev.attach("cn.soulapp.android");

scr = """

Java.perform(function () {



var URL = Java.use('java.net.URL');
URL.$init.overload('java.lang.String').implementation = function (apiUrl){
send(apiUrl);

printStack();

};

//打印堆栈
function printStack(){
var threadef = Java.use('java.lang.Thread');
var threadinstance = threadef.$new();
var stack = threadinstance.currentThread().getStackTrace();
for(var i = 0;i<stack.length;i++){
send("Full call stack:" + stack[i].toString());
}
}

});

"""
script = session.create_script(scr)


def on_message(message, data):
print(message)


script.on("message", on_message)
script.load()
sys.stdin.read()

附可用的虚拟机

逍遥模拟器对apk中的so好像不支持。。。其他的话,貌似都是可以了。
Genymotion的话,有限制apk得安装x86的框架才能安装没有x86架构的apk。
来自Frida的解释点我
https://github.com/frida/frida/issues/295
https://github.com/frida/frida/issues/192

常见BUG

  • 不适配或者系统不适合的机型,一附加会导致手机或虚拟机重启

另外,最好一定要保证Windows上安装的Frida版本与手机/虚拟机上安装的版本一致!还有就是,注意看清楚系统架构!

常用参考网站

FRIDA官网
FRIDA Github
FRIDA Server下载
FRIDA API
参考项目
参考项目

Brida插件

谢谢,爱你么么哒