跳到主要内容

java

java 库提供 Java 序列化对象的解析、构造与序列化能力,以及字节码反编译,用于深度分析与手工构造 Java 反序列化数据流,是反序列化漏洞研究的底层工具。

典型使用场景:

  • 解析序列化流:java.ParseJavaObjectStream / java.ParseHexJavaObjectStream 解析序列化字节,java.ToJson / java.FromJson 在对象与 JSON 间转换。
  • 手工构造对象:java.NewJavaObject / java.NewJavaClass / java.NewJavaClassDescjava.NewJavaString、各类 java.NewJavaFieldXxxValue 逐字段构造 Java 对象,java.MarshalJavaObjects 序列化输出。
  • 反编译:java.Decompile 把 class/jar 反编译为源码。

与相邻库的关系:java 是底层手工构造层,yso 在其之上提供现成的 gadget 生成;二者配合 facades/iiop 完成完整反序列化利用链。

共 32 个函数

函数索引

函数参数返回值说明
java.Decompilefrom string, to stringerror反编译一个 jar包或者 class
java.FromJsonraw []byte[]JavaSerializable, error将 java.ToJson 生成的 JSON 还原为 Java 序列化对象列表
java.NewJavaBlockDataBytesraw []byte*JavaBlockData创建一个 Java 序列化的块数据对象(TC_BLOCKDATA),承载原始字节
java.NewJavaClassj *JavaClassDesc*JavaClass创建一个 Java 类对象(TC_CLASS),用于序列化对 Class 本身的引用
java.NewJavaClassDatafields []JavaSerializable, blockData []JavaSerializable*JavaClassData创建一个 Java 类数据对象,承载对象实例的字段值与自定义块数据
java.NewJavaClassDescclassName string, serialVersionUID []byte, flag byte, fields *JavaClassFields, annotations []JavaSerializable, superClass *JavaClassDetails*JavaClassDesc创建一个 Java 类描述对象(TC_CLASSDESC),用于描述对象所属类的元信息
java.NewJavaClassDetailsclassName string, serialVersionUID []byte, Flag byte, Fields *JavaClassFields, Annotations []JavaSerializable, SuperClass *JavaClassDetails*JavaClassDetails创建 Java 类描述详情(类名、serialVersionUID、字段、父类等)
java.NewJavaClassFieldname string, jType byte, className JavaSerializable*JavaClassField创建一个 Java 类字段描述,描述单个字段的名称与类型
java.NewJavaEndBlockData-*JavaEndBlockData创建一个 Java 序列化的块数据结束标记对象(TC_ENDBLOCKDATA)
java.NewJavaEnumi *JavaClassDesc, constantName *JavaString*JavaEnumDesc创建一个 Java 枚举对象(TC_ENUM),由枚举类描述与常量名组成
java.NewJavaFieldArrayValuei JavaSerializable*JavaFieldValue创建一个数组类型的 Java 序列化字段值,承载数组/null/引用对象
java.NewJavaFieldBoolValueb bool*JavaFieldValue创建一个 boolean 类型的 Java 序列化字段值
java.NewJavaFieldByteValueb byte*JavaFieldValue创建一个 byte 类型的 Java 序列化字段值
java.NewJavaFieldCharValuei int*JavaFieldValue创建一个 char 类型的 Java 序列化字段值
java.NewJavaFieldDoubleValuei float64*JavaFieldValue创建一个 double 类型的 Java 序列化字段值
java.NewJavaFieldFloatValuei float32*JavaFieldValue创建一个 float 类型的 Java 序列化字段值
java.NewJavaFieldIntValuei uint64*JavaFieldValue创建一个 int 类型的 Java 序列化字段值
java.NewJavaFieldLongValuei uint64*JavaFieldValue创建一个 long 类型的 Java 序列化字段值
java.NewJavaFieldObjectValuei JavaSerializable*JavaFieldValue创建一个对象类型的 Java 序列化字段值,承载对象/字符串/类等引用类型
java.NewJavaFieldShortValuei int*JavaFieldValue创建一个 short 类型的 Java 序列化字段值
java.NewJavaFieldValuet byte, raw []byte*JavaFieldValue创建一个指定类型与原始字节的 Java 序列化字段值,是各类字段值构造的基础函数
java.NewJavaLongStringraw string*JavaString创建一个 Java 序列化的长字符串对象(TC_LONGSTRING),用于超长字符串
java.NewJavaNull-*JavaNull创建一个 Java 序列化的 null 对象(TC_NULL)
java.NewJavaReferencehandle uint64*JavaReference创建一个 Java 序列化的引用对象(TC_REFERENCE),通过句柄复用已序列化对象
java.NewJavaStringraw string*JavaString创建一个 Java 序列化的普通字符串对象(TC_STRING)
java.ParseHexJavaObjectStreamraw string[]JavaSerializable, error解析十六进制编码的 Java 序列化字节流,返回 Java 序列化对象列表
java.ParseJavaObjectStreamraw []byte[]JavaSerializable, error解析 Java 序列化字节流,返回其中包含的 Java 序列化对象列表
java.ToJsoni any[]byte, error将解析得到的 Java 序列化对象转换为可读的 JSON 字节数组

可变参数函数索引

函数参数返回值说明
java.MarshalJavaObjectsres ...JavaSerializable[]byte将一个或多个 Java 序列化对象编码为 Java 序列化字节流
java.NewJavaArrayj *JavaClassDesc, values ...*JavaFieldValue*JavaArray创建一个 Java 数组对象(TC_ARRAY),承载同类型元素的字段值序列
java.NewJavaClassFieldsfields ...*JavaClassField*JavaClassFields创建一个 Java 类字段描述集合,用于聚合多个字段描述
java.NewJavaObjectclass *JavaClassDesc, classData ...*JavaClassData*JavaObject创建一个 Java 对象(TC_OBJECT),由类描述与类数据组成,是反序列化攻击载荷的核心结构

函数详情

Decompile

Decompile(from string, to string) error

反编译一个 jar包或者 class

参数

参数名类型说明
fromstring待反编译的 jar/war/class 文件路径
tostring反编译结果输出的目录或文件路径

返回值

序号类型说明
r1error反编译失败时返回错误

示例

// 无法本地验证: 需要磁盘上真实存在的 jar/war/class 文件(请替换为真实路径)
err = java.Decompile("test.jar", "test/"); die(err) // 反编译 jar 到目录
err = java.Decompile("test.war", "test/"); die(err) // 反编译 war 到目录
err = java.Decompile("a.class", "a.java"); die(err) // 反编译单个 class 到文件

FromJson

FromJson(raw []byte) ([]JavaSerializable, error)

将 java.ToJson 生成的 JSON 还原为 Java 序列化对象列表

在 yak 中通过 java.FromJson 调用,是 java.ToJson 的逆操作

参数

参数名类型说明
raw[]bytejava.ToJson 生成的 JSON 字节数组

返回值

序号类型说明
r1[]JavaSerializable还原出的 Java 序列化对象列表
r2error错误信息,失败时非 nil

示例

s = java.NewJavaString("hello")
b = java.MarshalJavaObjects(s)
objs = java.ParseJavaObjectStream(b)~
j = java.ToJson(objs)~
restored = java.FromJson(j)~
assert len(restored) == len(objs), "restored object count should match"

NewJavaBlockDataBytes

NewJavaBlockDataBytes(raw []byte) *JavaBlockData

创建一个 Java 序列化的块数据对象(TC_BLOCKDATA),承载原始字节

在 yak 中通过 java.NewJavaBlockDataBytes 调用,常用于 writeObject 自定义数据

参数

参数名类型说明
raw[]byte块数据的原始字节内容

返回值

序号类型说明
r1*JavaBlockDataJava 块数据序列化对象

示例

// 该示例为示意性用法:构造原始块数据
block = java.NewJavaBlockDataBytes([]byte("data"))
println(block.TypeVerbose)

NewJavaClass

NewJavaClass(j *JavaClassDesc) *JavaClass

创建一个 Java 类对象(TC_CLASS),用于序列化对 Class 本身的引用

在 yak 中通过 java.NewJavaClass 调用

参数

参数名类型说明
j*JavaClassDesc类描述对象

返回值

序号类型说明
r1*JavaClassJava 类序列化对象

示例

// 该示例为示意性用法:构造类对象
desc = java.NewJavaClassDesc("com.example.Foo", []byte{0,0,0,0,0,0,0,1}, 0x02, java.NewJavaClassFields(), nil, nil)
cls = java.NewJavaClass(desc)
println(cls.TypeVerbose)

NewJavaClassData

NewJavaClassData(fields []JavaSerializable, blockData []JavaSerializable) *JavaClassData

创建一个 Java 类数据对象,承载对象实例的字段值与自定义块数据

在 yak 中通过 java.NewJavaClassData 调用,配合 java.NewJavaObject 使用

参数

参数名类型说明
fields[]JavaSerializable字段值序列化对象列表
blockData[]JavaSerializable自定义块数据序列化对象列表

返回值

序号类型说明
r1*JavaClassDataJava 类数据对象

示例

// 该示例为示意性用法:构造类数据
data = java.NewJavaClassData([java.NewJavaFieldIntValue(1)], [])
println(len(data.Fields))

NewJavaClassDesc

NewJavaClassDesc(className string, serialVersionUID []byte, flag byte, fields *JavaClassFields, annotations []JavaSerializable, superClass *JavaClassDetails) *JavaClassDesc

创建一个 Java 类描述对象(TC_CLASSDESC),用于描述对象所属类的元信息

在 yak 中通过 java.NewJavaClassDesc 调用

参数

参数名类型说明
classNamestring类的全限定名
serialVersionUID[]byte序列化版本号(8 字节)
flagbyte类描述标志位
fields*JavaClassFields字段描述集合
annotations[]JavaSerializable类注解数据列表
superClass*JavaClassDetails父类描述详情,可为 nil

返回值

序号类型说明
r1*JavaClassDescJava 类描述序列化对象

示例

// 该示例为示意性用法:构造类描述
fields = java.NewJavaClassFields()
desc = java.NewJavaClassDesc("com.example.Foo", []byte{0,0,0,0,0,0,0,1}, 0x02, fields, nil, nil)
obj = java.NewJavaObject(desc)
println(len(java.MarshalJavaObjects(obj)) > 0)

NewJavaClassDetails

NewJavaClassDetails(className string, serialVersionUID []byte, Flag byte, Fields *JavaClassFields, Annotations []JavaSerializable, SuperClass *JavaClassDetails) *JavaClassDetails

创建 Java 类描述详情(类名、serialVersionUID、字段、父类等)

在 yak 中通过 java.NewJavaClassDetails 调用,是构造 ClassDesc 的底层结构

参数

参数名类型说明
classNamestring类的全限定名
serialVersionUID[]byte序列化版本号(8 字节)
Flagbyte类描述标志位
Fields*JavaClassFields字段描述集合
Annotations[]JavaSerializable类注解数据列表
SuperClass*JavaClassDetails父类描述详情,可为 nil

返回值

序号类型说明
r1*JavaClassDetailsJava 类描述详情对象

示例

// 该示例为示意性用法:构造类描述详情
fields = java.NewJavaClassFields()
details = java.NewJavaClassDetails("com.example.Foo", []byte{0,0,0,0,0,0,0,1}, 0x02, fields, nil, nil)
println(details.ClassName)

NewJavaClassField

NewJavaClassField(name string, jType byte, className JavaSerializable) *JavaClassField

创建一个 Java 类字段描述,描述单个字段的名称与类型

在 yak 中通过 java.NewJavaClassField 调用

参数

参数名类型说明
namestring字段名
jTypebyte字段类型标记(如 0x49 表示 int、0x4c 表示对象)
classNameJavaSerializable对象类型字段的类名描述对象,基本类型可传 nil

返回值

序号类型说明
r1*JavaClassFieldJava 类字段描述对象

示例

// 该示例为示意性用法:构造一个 int 字段描述
f = java.NewJavaClassField("id", 0x49, nil)
println(f.Name)

NewJavaEndBlockData

NewJavaEndBlockData() *JavaEndBlockData

创建一个 Java 序列化的块数据结束标记对象(TC_ENDBLOCKDATA)

在 yak 中通过 java.NewJavaEndBlockData 调用,用于标记自定义块数据写入结束

返回值

序号类型说明
r1*JavaEndBlockDataJava 块数据结束标记序列化对象

示例

// 该示例为示意性用法:构造块数据结束标记
end = java.NewJavaEndBlockData()
println(end.TypeVerbose)

NewJavaEnum

NewJavaEnum(i *JavaClassDesc, constantName *JavaString) *JavaEnumDesc

创建一个 Java 枚举对象(TC_ENUM),由枚举类描述与常量名组成

在 yak 中通过 java.NewJavaEnum 调用

参数

参数名类型说明
i*JavaClassDesc枚举类型的类描述对象
constantName*JavaString枚举常量名(Java 字符串对象)

返回值

序号类型说明
r1*JavaEnumDescJava 枚举序列化对象

示例

// 该示例为示意性用法:构造枚举对象
desc = java.NewJavaClassDesc("java.lang.Enum", []byte{0,0,0,0,0,0,0,0}, 0x02, java.NewJavaClassFields(), nil, nil)
e = java.NewJavaEnum(desc, java.NewJavaString("RED"))
println(e.TypeVerbose)

NewJavaFieldArrayValue

NewJavaFieldArrayValue(i JavaSerializable) *JavaFieldValue

创建一个数组类型的 Java 序列化字段值,承载数组/null/引用对象

在 yak 中通过 java.NewJavaFieldArrayValue 调用

参数

参数名类型说明
iJavaSerializable数组、null 或引用类型的 Java 序列化对象

返回值

序号类型说明
r1*JavaFieldValueJava 字段值序列化对象

示例

// 该示例为示意性用法:构造数组字段值
v = java.NewJavaFieldArrayValue(java.NewJavaNull())
println(v.FieldTypeVerbose)

NewJavaFieldBoolValue

NewJavaFieldBoolValue(b bool) *JavaFieldValue

创建一个 boolean 类型的 Java 序列化字段值

在 yak 中通过 java.NewJavaFieldBoolValue 调用

参数

参数名类型说明
bbool布尔值

返回值

序号类型说明
r1*JavaFieldValueJava 字段值序列化对象

示例

// 该示例为示意性用法:构造 bool 字段值
v = java.NewJavaFieldBoolValue(true)
println(v.FieldTypeVerbose)

NewJavaFieldByteValue

NewJavaFieldByteValue(b byte) *JavaFieldValue

创建一个 byte 类型的 Java 序列化字段值

在 yak 中通过 java.NewJavaFieldByteValue 调用

参数

参数名类型说明
bbyte字节值

返回值

序号类型说明
r1*JavaFieldValueJava 字段值序列化对象

示例

// 该示例为示意性用法:构造 byte 字段值
v = java.NewJavaFieldByteValue(0x41)
println(v.FieldTypeVerbose)

NewJavaFieldCharValue

NewJavaFieldCharValue(i int) *JavaFieldValue

创建一个 char 类型的 Java 序列化字段值

在 yak 中通过 java.NewJavaFieldCharValue 调用

参数

参数名类型说明
iintchar 对应的整数码点

返回值

序号类型说明
r1*JavaFieldValueJava 字段值序列化对象

示例

// 该示例为示意性用法:构造 char 字段值
v = java.NewJavaFieldCharValue(65)
println(v.FieldTypeVerbose)

NewJavaFieldDoubleValue

NewJavaFieldDoubleValue(i float64) *JavaFieldValue

创建一个 double 类型的 Java 序列化字段值

在 yak 中通过 java.NewJavaFieldDoubleValue 调用

参数

参数名类型说明
ifloat64double 浮点值

返回值

序号类型说明
r1*JavaFieldValueJava 字段值序列化对象

示例

// 该示例为示意性用法:构造 double 字段值
v = java.NewJavaFieldDoubleValue(3.14159)
println(v.FieldTypeVerbose)

NewJavaFieldFloatValue

NewJavaFieldFloatValue(i float32) *JavaFieldValue

创建一个 float 类型的 Java 序列化字段值

在 yak 中通过 java.NewJavaFieldFloatValue 调用

参数

参数名类型说明
ifloat32float 浮点值

返回值

序号类型说明
r1*JavaFieldValueJava 字段值序列化对象

示例

// 该示例为示意性用法:构造 float 字段值
v = java.NewJavaFieldFloatValue(1.5)
println(v.FieldTypeVerbose)

NewJavaFieldIntValue

NewJavaFieldIntValue(i uint64) *JavaFieldValue

创建一个 int 类型的 Java 序列化字段值

在 yak 中通过 java.NewJavaFieldIntValue 调用

参数

参数名类型说明
iuint64int 整数值

返回值

序号类型说明
r1*JavaFieldValueJava 字段值序列化对象

示例

// 该示例为示意性用法:构造 int 字段值
v = java.NewJavaFieldIntValue(123456)
println(v.FieldTypeVerbose)

NewJavaFieldLongValue

NewJavaFieldLongValue(i uint64) *JavaFieldValue

创建一个 long 类型的 Java 序列化字段值

在 yak 中通过 java.NewJavaFieldLongValue 调用

参数

参数名类型说明
iuint64long 整数值

返回值

序号类型说明
r1*JavaFieldValueJava 字段值序列化对象

示例

// 该示例为示意性用法:构造 long 字段值
v = java.NewJavaFieldLongValue(123456789)
println(v.FieldTypeVerbose)

NewJavaFieldObjectValue

NewJavaFieldObjectValue(i JavaSerializable) *JavaFieldValue

创建一个对象类型的 Java 序列化字段值,承载对象/字符串/类等引用类型

在 yak 中通过 java.NewJavaFieldObjectValue 调用

参数

参数名类型说明
iJavaSerializable对象、字符串、类、数组、枚举、引用或 null 类型的 Java 序列化对象

返回值

序号类型说明
r1*JavaFieldValueJava 字段值序列化对象

示例

// 该示例为示意性用法:构造对象字段值
v = java.NewJavaFieldObjectValue(java.NewJavaString("hello"))
println(v.FieldTypeVerbose)

NewJavaFieldShortValue

NewJavaFieldShortValue(i int) *JavaFieldValue

创建一个 short 类型的 Java 序列化字段值

在 yak 中通过 java.NewJavaFieldShortValue 调用

参数

参数名类型说明
iintshort 整数值

返回值

序号类型说明
r1*JavaFieldValueJava 字段值序列化对象

示例

// 该示例为示意性用法:构造 short 字段值
v = java.NewJavaFieldShortValue(1024)
println(v.FieldTypeVerbose)

NewJavaFieldValue

NewJavaFieldValue(t byte, raw []byte) *JavaFieldValue

创建一个指定类型与原始字节的 Java 序列化字段值,是各类字段值构造的基础函数

在 yak 中通过 java.NewJavaFieldValue 调用

参数

参数名类型说明
tbyte字段类型标记(如 JT_INT、JT_BYTE 等)
raw[]byte字段值的原始字节

返回值

序号类型说明
r1*JavaFieldValueJava 字段值序列化对象

示例

// 该示例为示意性用法:构造一个字节型字段值
v = java.NewJavaFieldValue(0x42, []byte{0x01})
println(v.FieldTypeVerbose)

NewJavaLongString

NewJavaLongString(raw string) *JavaString

创建一个 Java 序列化的长字符串对象(TC_LONGSTRING),用于超长字符串

在 yak 中通过 java.NewJavaLongString 调用

参数

参数名类型说明
rawstring字符串内容

返回值

序号类型说明
r1*JavaStringJava 长字符串序列化对象

示例

s = java.NewJavaLongString("hello")
println(s.Value) // OUT: hello

NewJavaNull

NewJavaNull() *JavaNull

创建一个 Java 序列化的 null 对象(TC_NULL)

在 yak 中通过 java.NewJavaNull 调用,常用于表示空引用字段

返回值

序号类型说明
r1*JavaNullJava null 序列化对象

示例

// 该示例为示意性用法:构造 null 对象并参与序列化
n = java.NewJavaNull()
b = java.MarshalJavaObjects(n)
println(len(b))

NewJavaReference

NewJavaReference(handle uint64) *JavaReference

创建一个 Java 序列化的引用对象(TC_REFERENCE),通过句柄复用已序列化对象

在 yak 中通过 java.NewJavaReference 调用

参数

参数名类型说明
handleuint64被引用对象的句柄(从 0x7e0000 起递增)

返回值

序号类型说明
r1*JavaReferenceJava 引用序列化对象

示例

// 该示例为示意性用法:构造对已有对象的引用
ref = java.NewJavaReference(0x7e0000)
println(ref.TypeVerbose)

NewJavaString

NewJavaString(raw string) *JavaString

创建一个 Java 序列化的普通字符串对象(TC_STRING)

在 yak 中通过 java.NewJavaString 调用

参数

参数名类型说明
rawstring字符串内容

返回值

序号类型说明
r1*JavaStringJava 字符串序列化对象

示例

s = java.NewJavaString("hello")
println(s.Value) // OUT: hello

ParseHexJavaObjectStream

ParseHexJavaObjectStream(raw string) ([]JavaSerializable, error)

解析十六进制编码的 Java 序列化字节流,返回 Java 序列化对象列表

在 yak 中通过 java.ParseHexJavaObjectStream 调用,适用于已被 hex 编码的序列化数据

参数

参数名类型说明
rawstring十六进制编码的 Java 序列化字节流

返回值

序号类型说明
r1[]JavaSerializable解析得到的 Java 序列化对象列表
r2error错误信息,失败时非 nil

示例

s = java.NewJavaString("hello")
h = codec.EncodeToHex(java.MarshalJavaObjects(s))
objs = java.ParseHexJavaObjectStream(h)~
assert len(objs) == 1, "should parse exactly one object"

ParseJavaObjectStream

ParseJavaObjectStream(raw []byte) ([]JavaSerializable, error)

解析 Java 序列化字节流,返回其中包含的 Java 序列化对象列表

在 yak 中通过 java.ParseJavaObjectStream 调用,是 java.MarshalJavaObjects 的逆操作

参数

参数名类型说明
raw[]byteJava 序列化字节流

返回值

序号类型说明
r1[]JavaSerializable解析得到的 Java 序列化对象列表
r2error错误信息,失败时非 nil

示例

s = java.NewJavaString("hello")
b = java.MarshalJavaObjects(s)
objs = java.ParseJavaObjectStream(b)~
assert len(objs) == 1, "should parse exactly one object"

ToJson

ToJson(i any) ([]byte, error)

将解析得到的 Java 序列化对象转换为可读的 JSON 字节数组

在 yak 中通过 java.ToJson 调用,便于查看序列化对象的内部结构

参数

参数名类型说明
iany已解析的 Java 序列化对象(或其切片)

返回值

序号类型说明
r1[]byteJSON 字节数组
r2error错误信息,失败时非 nil

示例

s = java.NewJavaString("hello")
b = java.MarshalJavaObjects(s)
objs = java.ParseJavaObjectStream(b)~
j = java.ToJson(objs)~
assert len(j) > 0, "json output should not be empty"

可变参数函数详情

MarshalJavaObjects

MarshalJavaObjects(res ...JavaSerializable) []byte

将一个或多个 Java 序列化对象编码为 Java 序列化字节流

在 yak 中通过 java.MarshalJavaObjects 调用,是 java.ParseJavaObjectStream 的逆操作

可选参数

参数名类型说明
res...JavaSerializable一个或多个 Java 序列化对象

返回值

序号类型说明
r1[]byteJava 序列化字节流

示例

s = java.NewJavaString("hello")
b = java.MarshalJavaObjects(s)
assert len(b) > 0, "marshaled bytes should not be empty"

NewJavaArray

NewJavaArray(j *JavaClassDesc, values ...*JavaFieldValue) *JavaArray

创建一个 Java 数组对象(TC_ARRAY),承载同类型元素的字段值序列

在 yak 中通过 java.NewJavaArray 调用

必填参数

参数名类型说明
j*JavaClassDesc数组的类描述对象(描述元素类型)

可选参数

参数名类型说明
values...*JavaFieldValue零个或多个数组元素字段值

返回值

序号类型说明
r1*JavaArrayJava 数组序列化对象

示例

// 该示例为示意性用法:构造一个 int 数组对象
desc = java.NewJavaClassDesc("[I", []byte{0,0,0,0,0,0,0,1}, 0x02, java.NewJavaClassFields(), nil, nil)
arr = java.NewJavaArray(desc, java.NewJavaFieldIntValue(1), java.NewJavaFieldIntValue(2))
println(arr.TypeVerbose)

NewJavaClassFields

NewJavaClassFields(fields ...*JavaClassField) *JavaClassFields

创建一个 Java 类字段描述集合,用于聚合多个字段描述

在 yak 中通过 java.NewJavaClassFields 调用

可选参数

参数名类型说明
fields...*JavaClassField零个或多个字段描述对象

返回值

序号类型说明
r1*JavaClassFieldsJava 类字段描述集合对象

示例

// 该示例为示意性用法:构造字段描述集合
f = java.NewJavaClassField("id", 0x49, nil)
fields = java.NewJavaClassFields(f)
println(len(fields.Fields))

NewJavaObject

NewJavaObject(class *JavaClassDesc, classData ...*JavaClassData) *JavaObject

创建一个 Java 对象(TC_OBJECT),由类描述与类数据组成,是反序列化攻击载荷的核心结构

在 yak 中通过 java.NewJavaObject 调用

必填参数

参数名类型说明
class*JavaClassDesc对象所属的类描述对象

可选参数

参数名类型说明
classData...*JavaClassData零个或多个类数据(字段值与块数据)

返回值

序号类型说明
r1*JavaObjectJava 对象序列化对象

示例

// 该示例为示意性用法:构造一个 Java 对象并序列化
desc = java.NewJavaClassDesc("com.example.Foo", []byte{0,0,0,0,0,0,0,1}, 0x02, java.NewJavaClassFields(), nil, nil)
obj = java.NewJavaObject(desc)
println(len(java.MarshalJavaObjects(obj)) > 0)