frida

windows安装

1
pip3 install frida frida-tools

不过frida安装时总会卡住不动,可以到这里 选择和你的python版本一致的,注意指令集也要和python的一样.然后直接easy_install xxx.egg

Android安装

这里下载server,主要要和手机的指令集一致的,解压后

1
2
3
4
5
adb push server 手机路径
adb shell chmod +x server
forward tcp:27042 tcp:27042
forward tcp:27043 tcp:27043
adb shell ./server

应用

python脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import frida
import sys

js = open("code/frida/a.js", encoding="utf8").read()

def on_message(message, data):
print(data)
for k in ["stack", "description"]:
msg = message.get(k)
if msg is not None:
print(msg)

session = frida.get_remote_device().attach('com.picacomic.fregata')
script = session.create_script(js)
script.on('message', on_message)
script.load()

sys.stdin.read()
  1. 获取非native方法的输入值和返回值,这里的方法为 String c([]String)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    if (Java.available) {
    Java.perform(function () {
    var MyApplication = Java.use('com.picacomic.fregata.MyApplication');
    console.log(MyApplication);
    MyApplication.c.implementation = function (v) {
    console.log("param:");
    console.log(v);
    var ret = this.c(v);
    console.log("return value:");
    console.log(ret);
    return ret;
    };
    });
    } else {
    console.log("load java failed");
    }
  2. 获取native方法的输入值和返回值,这里的方法是 String getStringSigFromNative();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (Java.available) {
Java.perform(function () {
Interceptor.attach(Module.findExportByName("libJniTest.so", "Java_com_picacomic_fregata_MyApplication_getStringSigFromNative"), {
// onEnter 是方法开始前调用的,args[0]是env,args[1]是jclass,args[2...]就是方法的输入值了
onEnter: function(args) {
send(args[0]);
send(args[1]);
},
onLeave: function(ret) {
send("ret:" + Java.vm.getEnv().getStringUtfChars(ret, null).readCString());
}
});
});
} else {
console.log("load java failed");
}

这里的Java_com_picacomic_fregata_MyApplication_getStringSigFromNative是查so文件得到的方法名,非java源码里面的名称.可以把 .so抠出来,丢到linux里面,然后 nm -D libJniTest.so,输出大概长这样
native1

其他注意事项

打印String VAL 需要用 Java.vm.getEnv().getStringUtfChars(VAL, null).readCString(),不然打出来是个地址