不同ARM架构之间的混淆

逆向工程 拆卸 二元分析 手臂
2021-06-14 14:32:54

我正在尝试开发一个机器学习模型来帮助逆向工程过程。作为第一阶段,我们目前正在尝试训练一个嵌入模型,以了解指令之间的依赖关系和关系。像往常一样,嵌入模型确实需要大量数据才能变得智能。

我们的工作更侧重于基于微控制器的系统,ARMv7-m 和 ARMv6-m 的体系结构对我们的工作最重要。然而,为了找到与这些架构相关的对训练嵌入模型有用的二进制文件,我正在考虑使用 debian 包中的 ARMv7,以便我可以使用已经编译的二进制文件并训练嵌入模型。

但是,这些二进制文件是用 ARMv7-a 架构编译的,据我所知,ARMv7-a 不包括拇指指令集(如果我错了,请纠正我)。有人可以向我解释一下 ARMv7-a 是否在其 ISA 中包含拇指指令?ARMv7-a 培训是否有助于理解 ARMv7-m 和 ARMv6-m 指令之间的关系?如果我使用 ARMv7-a,因为我的目标是与 ARMv7-m 系统一起工作,会不会有问题?

我真的很难理解这些,非常感谢任何帮助或想法。

1个回答

虽然 ARMv7-A 确实包含 ARMv7-M 中使用的 Thumb-2 子集,但 ARMv7-A 二进制文件中实际使用的指令可能与 ARMv7-M 微控制器中使用的指令大不相同。

例如,微控制器很少使用来自 ARMv7-A 的 NEON 浮点或向量指令(Cortex-M4F 具有 FPU,但 IIRC 只有单精度)。相反,有些指令仅在 Cortex-M 中使用,而在 Cortex-A 中不使用(例如访问某些系统寄存器的指令),当然,A 变体支持 M 子集根本不支持的“经典”ARM 指令。ARMv6-M 更加不同,因为它主要使用 16 位 (Thumb-1) 子集,而不是更强大的 Thumb-2。

还有一个区别:Debian 软件包主要包含在 OS 环境中运行的用户模式代码,但微控制器通常运行在“裸机”上运行的单片固件,实现一个简单的状态机或某种具有 OS 功能、中断处理程序和“用户有效负载”任务都组合在同一个二进制文件中。

总结:虽然ARMv7-A 和 ARMv7-M 之间可能存在一些交集,但它们在完全不同的环境中使用,并且在 armv7 Debian 软件包上的培训不太可能在 ARMv7-M 固件上产生好的结果。

PS编译器通常也不同。Linux 软件通常使用 GCC(有时是 Clang)编译,但消费设备固件通常使用商业编译器编译,例如 ARM 自己的 Keil、IAR 或 GHS(Green Hills Software)。