#解码器 #反汇编器 #armv7 #armv8

无 std yaxpeax-arm

为 yaxpeax 项目提供的 arm 解码器

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解析器实现

Download history 1619/week @ 2024-04-27 1381/week @ 2024-05-04 2058/week @ 2024-05-11 1389/week @ 2024-05-18 963/week @ 2024-05-25 1093/week @ 2024-06-01 983/week @ 2024-06-08 1168/week @ 2024-06-15 1086/week @ 2024-06-22 897/week @ 2024-06-29 639/week @ 2024-07-06 1796/week @ 2024-07-13 541/week @ 2024-07-20 822/week @ 2024-07-27 511/week @ 2024-08-03 564/week @ 2024-08-10

2,620 每月下载量
9 个crate中(5 个直接使用)

0BSD 许可证

1MB
16K SLoC

yaxpeax-arm

crate documentation

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 反汇编器一样快,如 capstonebad64。更多全面的基准测试将陆续进行。

非常小?

与解码速度类似,编译后的 yaxpeax-arm 的大小尚未进行详细分析,但至少是 yaxpeax-x86 的 20%,armv7armv8 代码完全独立 - 只使用一个架构应允许消除另一个架构的代码。 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 检查清单

  • 支持 SVESVE2
  • 支持按版本解码标志,以便解码 armv4、armv5 或 armv7 指令
  • 完全支持 should_is_must 以控制如何进行严格解码
  • 如果需要,完全支持将 unpredictable 编码报告为 DecodeError::Unpredictable
  • 彻底测试 armv7 和 armv8 指令与其他解码器的兼容性
    • 现有的 thumb 测试套件是从枚举 thumb 指令派生出来的,但缺少一些

! 注意用户!

  • armv7 NEON 支持尚不存在

架构说明

寄存器名称

来自 infocenter.arm.com

名称 映射到 含义
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