Frida中的Java和js变量类型的映射关系
此处Java中的变量类型,转换成Frida中的类型的写法是:
Frida(的js)中的变量类型,其底层来自于Dex
所以其实就是:
- Frida的类型 == Dex中的类型 的语法
即:
- Java变量类型 -》 Frida=Dex变量类型
- 非数组列表
- 简单类型
- 完整写法
int
int
byte
byte
short
short
long
long
float
float
double
double
char
char
- -》 缩写 ShortyDescriptor
- 缩写 说明
V
void;仅对返回类型有效Z
booleanB
byteS
shortC
charI
intJ
longF
floatD
double
- 完整写法
- 特殊的对象Object == 带父类,带路径的Java的类:前缀L + 点. 变成 斜杠/ + 后缀分号;
- 语法:
Lfully/qualified/Name;
- 说明:类
fully.qualified.Name
- 举例
Ljava/lang/String;
Ljava/lang/Object;
Ljava/lang/System;
Ljava/io/PrintStream;
Ljava/net/InetAddress;
Ljava/time/LocalDateTime;
Ljava/lang/ClassLoader;
- 语法:
- 简单类型
- 列表=数组:前面再加个:左中括号
[
- 语法
[descriptor
- 说明
- descriptor 的数组,可递归地用于“数组的数组”,但维数不能超过 255
- 举例
- 普通类型:字母缩写
int[]
->[I
byte[]
->[B
short[]
->[S
long[]
->[J
float[]
->[F
double[]
->[D
char[]
->[C
- 特殊类型:用(Frida=Dex中的)完整类名写法
[Ljava/lang/String;
[Ljava/lang/Object;
[Ldalvik/system/DexPathList$Element;
- 普通类型:字母缩写
- 语法
- 非数组列表
含义 = 使用场景举例:
(1)Java相关:函数的签名=定义
举例1:
runtime/native/dalvik_system_DexFile.cc - platform/art - Git at Google (googlesource.com)
NATIVE_METHOD(DexFile, createCookieWithArray, "([BII)Ljava/lang/Object;"),
-》
([BII)Ljava/lang/Object;
([BII)
- 括号内是函数参数
[BII
[B
=byte[]
= 字节码数组列表I
=int
I
=int
- 括号内是函数参数
Ljava/lang/Object;
- 类型:
Object
- 类型:
-》所以函数的完整定义 类型 就是这样的:
Object createCookieWithArray(byte[], int, int)
举例2:
NATIVE_METHOD(DexFile, isProfileGuidedCompilerFilter, "(Ljava/lang/String;)Z"),
-》
(Ljava/lang/String;)Z
(Ljava/lang/String;)
Ljava/lang/String;
Z
-》
void isProfileGuidedCompilerFilter(String)
(2)Frida中
Frida中,定义Object数组的写法:
var JavaObjArr = Java.use("[Ljava.lang.Object;")
console.log("JavaObjArr=" + JavaObjArr)
输出:
JavaObjArr=<class: [Ljava.lang.Object;>
把变量转换为Object的数组:
var objArr = Java.cast(obj, JavaObjArr)
console.log("objArr=" + objArr)
输出:
objArr=[Ljava.lang.Object;@fc9e9af