richardartoul/molecule

GitHub: richardartoul/molecule

Molecule 提供了一个流式、零分配的 Go protobuf 解析接口,让开发者在性能关键路径上能够精确控制字段解析与内存分配。

Stars: 417 | Forks: 17

[![GoDoc](https://pkg.go.dev/github.com/richardartoul/molecule.svg)](https://pkg.go.dev/github.com/richardartoul/molecule) [![C.I](https://static.pigsec.cn/wp-content/uploads/repos/cas/2a/2a44ebb2294c01676e19eed14adc6cea930435b1ac09f01b83d80f1ec8c274bf.svg)](https://github.com/richardartoul/molecule/actions) # Molecule Molecule 是一个 Go 库,用于以高效且零分配的方式解析 protobuf。其 API 设计略微借鉴了[这个优秀的](https://github.com/buger/jsonparser) Go JSON 解析库。 该库目前处于 alpha 阶段,API 可能会发生更改。当前的 API 属于相当底层的接口,但未来可能会添加额外的辅助工具,以使某些操作更加易用。 ## 设计初衷 Go 中标准的 `Unmarshal` protobuf 接口使得在解析 protobuf 时难以手动控制内存分配。此外,通常我们只需要访问单个 protobuf 中的部分字段。这些问题导致 protobuf 很难被应用在性能关键的路径上。 该库试图通过引入流式的、零分配的接口来解决这些问题,该接口允许用户完全控制需要解析哪些字段,以及如何/何时分配对象。 当然,其缺点是 `molecule` 比标准的 protobuf 库更难使用(也更容易被误用),因此建议仅在性能至关重要的情况下才使用它。它并不能作为 `proto.Unmarshal()` 的通用替代品。建议用户在尝试使用该库之前先熟悉 [proto3 编码](https://developers.google.com/protocol-buffers/docs/encoding)。 ## 功能特性 1. 通过流式、零分配的 API 反序列化所有 protobuf 基本类型。 2. 支持以流式处理的方式遍历 protobuf 消息。 3. 支持以流式处理的方式遍历已打包(packed)的 protobuf 重复字段(数组)。 ## 不支持的内容 1. Proto2 语法(部分功能可能会起作用,但未经过任何测试)。 2. 未使用 "packed"(打包)编码的重复字段(尽管理论上可以使用该库来解析它们,但目前没有任何专门的辅助工具)。 3. Map 字段。使用该库的 API *应该* 能够解析 Map,但过程会有点繁琐。我计划在确定合理的 API 后为其添加更好的支持。 4. 可能还有许多其他未涵盖的内容。 ## 示例 [godocs](https://pkg.go.dev/github.com/richardartoul/molecule) 中包含许多可运行的示例。 ## 致谢 该库很大程度上只是对他人工作成果的轻量级封装: 1. 其接口设计受到这个 [jsonparser](https://github.com/buger/jsonparser) 库的启发。 2. 与 protobuf 流交互的 codec 提取自这个 [protobuf 反射库](https://github.com/jhump/protoreflect)。为了减少依赖项,代码是手动 vendor(本地化依赖)的,而不是直接导入的。 ## 依赖 `molecule` 核心库没有任何外部依赖。不过,`go.sum` 文件中确实包含了一些由测试包引入的依赖项,但是当使用该库时,这些依赖项*不应该*会被传递性地引入。
标签:EVTX分析, Go语言, Protobuf, 开发库, 日志审计, 程序破解, 解析器, 零内存分配