#java-class #class #java #jvm #bytecode

jbcrs-basic

一个用于读取和写入Java类文件的库

1个不稳定版本

使用旧Rust 2015

0.1.4 2018年3月18日

#2720解析器实现

Unlicense

97KB
2.5K SLoC

JBcRs-basic

JBcRs是一个库,用Rust编写,用于支持读取和写入Java类文件。

这个库还没有完成,但某些功能已经实现

  • 基本解析:类文件以较为原始的方式解析
    • 你可以访问常量池。名称、描述符等以 u16 表示,必须手动对池进行索引。解析时不会进行索引验证。
    • 使用bitflags crate解码访问标志,以提供更好的体验。
    • 始终解析属性。这可能会改变,因为它允许攻击者构建无效的调试属性,这些属性在执行代码时并不起重要作用,解析整个类文件可能不起作用,因为会返回错误。
  • 基本写入:类文件以解析的方式写入。

入门

首先,将此库作为依赖项添加到您的Cargo.toml中

[dependencies]
jbcrs_basic = "0.1.4"

我们想从字节数组中解析一个类,并打印其版本、访问标志和名称。当然,您可以使用std::fs::File或zip库,但这不是本教程的目的。

extern crate jbcrs_basic;

use jbcrs_basic::*;

// You got the bytes from any possible source.
let bytes: &[u8] = [0xCA, 0xFE, 0xBA, 0xBE];

// After parsing the class file,
// you will get the constant pool
// and the class itself.
// You don't have to annotate the types here.
let (constant_pool, class): (Pool, Class) = parse(bytes)
    .expect("could not parse class file");

// Print its major and minor version:
println!("version: {}.{}", class.major_version, class.minor_version);

// Access Flags can be printed human readable
println!("access: {:?}", class.access_flags);

// Printing the name requires us to use the constant pool.
println!("name: {}", constant_pool.get_class_name(class.name).expect("could not get class name"));

资源

Java虚拟机规范(Java SE 9)

依赖项

~2MB
~45K SLoC