17 个版本
| 0.3.0 | 2024 年 6 月 25 日 |
|---|---|
| 0.2.5 | 2024 年 3 月 10 日 |
| 0.2.4 | 2023 年 11 月 2 日 |
| 0.2.3 | 2022 年 1 月 2 日 |
| 0.0.3 | 2020 年 3 月 15 日 |
#150 在 解析器实现
2,620 每月下载量
在 9 个crate中(5 个直接使用)
1MB
16K SLoC
yaxpeax-arm
yaxpeax-arm 为 armv7、v7/thumb、v7/thumb2 和 aarch64/a64 指令集提供解码器实现。
解码的入口点是 armv7::InstDecoder(《code>ARMv7::Decoder::default())或 armv8::InstDecoder(《code>ARMv8::Decoder::default())。两个解码器的默认模式都是解码 ARM 模式。默认模式会尽可能宽松地进行解码,甚至在可能的情况下尝试为 UNPREDICTABLE 模式生成某种指令。对于 armv7 及以下版本,default_thumb 会生成一组类似宽松的规则,但用于解码 thumb/thumb2 指令。
ARMv7 和 thumb 模式的指令解码为相同的结构:armv7::Instruction。这不会引入歧义,如果您必须区分 thumb 和非 thumb 的来源,armv7::Instruction::thumb 将反映解码器在解码目标指令时的状态。此外,armv7::Instruction::w 报告指令是否是宽(32 位)thum 指令。
对于所有 ARMv7 指令,armv7::Instruction::s() 报告指令是否会更新状态标志。如果 s 出错,则表示解码器存在错误,请报告。
特性
#[无 std]- 非常快
- 非常小?
#[无 std]
yaxpeax-arm 支持在 no_std 环境中使用。要在 no_std 环境中构建 yaxpeax-arm,请将 default-features = false 添加到 crate 的依赖项行。这将禁用 std 功能,并移除 yaxpeax-arm 可选提供的与 std 的小部分集成。
非常快
yaxpeax-arm 尚未进行彻底的基准测试,但初步测试表明,它的速度至少与其他高质量的 arm 反汇编器一样快,如 capstone 或 bad64。更多全面的基准测试将陆续进行。
非常小?
与解码速度类似,编译后的 yaxpeax-arm 的大小尚未进行详细分析,但至少是 yaxpeax-x86 的 20%,armv7 和 armv8 代码完全独立 - 只使用一个架构应允许消除另一个架构的代码。 yaxpeax-arm 仅在几秒钟内以发布模式编译。
稳定性
0.1 和 1.0 版本是功能完整性稳定性的重要指标。以下列出了将 yaxpeax-arm 认为稳定的具体指南。
0.1 检查清单
- 支持
NEON(ARMv8 中支持 SVE 之前的 SIMD!) - 调整
yaxpeax-arch,以便min_length可以根据InstDecoder的模式而变化- 目前
min_length总是 4,这对于Thumb模式是不正确的。相反,选择 "2" 对于ARM模式将是明显错误的。
- 目前
- 解决所有树内 TODO
1.0 检查清单
- 支持
SVE和SVE2 - 支持按版本解码标志,以便解码 armv4、armv5 或 armv7 指令
- 完全支持
should_is_must以控制如何进行严格解码 - 如果需要,完全支持将
unpredictable编码报告为DecodeError::Unpredictable - 彻底测试 armv7 和 armv8 指令与其他解码器的兼容性
- 现有的 thumb 测试套件是从枚举 thumb 指令派生出来的,但缺少一些
! 注意用户!
- armv7 NEON 支持尚不存在
架构说明
寄存器名称
| 名称 | 映射到 | 含义 |
|---|---|---|
| r0-r15 | r0-r15 | 这些是寄存器! |
| a1-a4 | r0-r3 | 参数、结果或临时寄存器 |
| v1-v8 | r4-r11 | 变量寄存器 |
| sb | r9 | 静态基寄存器 |
| fp | r11 | 栈指针 |
| ip | r12 | 过程调用寄存器 |
| sp | r13 | 堆栈指针 |
| lr | r14 | 链接寄存器 |
| pc | r15 | 程序计数器 |
* fp 在 ARM 文档中似乎没有明确引用,且映射到 r11 看起来是操作系统(Windows/Linux?)的约定。
依赖项
~1.5MB
~31K SLoC