1个不稳定版本
使用旧Rust 2015
0.1.4 | 2018年3月18日 |
---|
#2720 在 解析器实现
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"));
资源
依赖项
~2MB
~45K SLoC