基于ARM7TDMI架构的嵌入式软件逆向工程分析方法
来源:用户上传
作者:高洪涛 杨栋翔 李明程 程春
摘要:软件逆向工程对于国外先进技术引进、恶意代码检测等有重要意义。随着嵌入式技术的高速l展,以ARM架构微处理器为核心的嵌入式系统在国防、通信、自动控制等关键领域得到了普遍应用。本文以某型航空发动机数据采集单元(DCU)的二进制程序逆向为例,阐述了一种基于ARM7TDMI架构的嵌入式软件逆向分析流程和方法。结果显示,本方法可以对DCU软件的全部子函数和全局变量功能进行有效逆向分析,可以作为功能分析及维护保障的重要依据。
关键词:ARM7TDMI;逆向工程;嵌入式软件;二进制
Keywords:ARM7TDMI;reverse engineering;embedded software;binary
0 引言
随着嵌入式系统的飞速发展,在嵌入式领域占据主导地位的ARM架构微处理器在国防电子、电力系统、工业自动化、汽车电子、医疗设备、无线通信等国家关键领域都有十分广泛的应用。 ARM微处理器采用RISC(精简指令集)架构,具有体积小、成本低、能效比高等特点。如图1所示,2003年以前,ARM架构主要包括ARM7TDMI、ARM9E、ARM11等系列。2003年之后,ARM架构主要分为A系列、R系列和 M系列,A系列主要用于顶级主控,如手机、平板电脑的应用处理器;R系列主要用于实时高性能场景,如车辆控制等;M系列主要用于低端应用领域,如消费电子等。
鉴于ARM架构在各个领域的广泛应用,针对ARM架构进行逆向分析具有重要的价值和意义。在民用领域,逆向分析可以帮助检测恶意代码,找出隐藏的后门软件以避免系统被攻击;在军事领域,逆向分析有助于快速学习并引进国外的军事工业技术,发展我国的国产化装备。软件逆向工程按照工程实践,可以分为两类:一类是从已知的软件系统的源码出发,生成对应的系统结构及设计原理、算法思想的文档;另一类软件逆向的研究对象是二进制,即没有源代码的逆向分析。二进制逆向工程按照程序的结构特点,又可以分为结构化二进制逆向和非结构化二进制逆向。前者的研究对象是具有规范的文件格式、包含了程序动态执行与静态分析相关的程序信息,如PE、ELF文件等;后者的研究对象是仅包含数据和指令的固件代码,如bin、hex格式的芯片内置程序等[1]。二进制逆向工程是目前研究的重点。
公开资料显示,目前国内ARM逆向工程的研究重点主要在工具层面,如赵亚新等基于芯片的JTAG接口分析固件的运行机制[2]。解放军信息工程大学蒋烈辉团队在开发ARM的反汇编自动化工具方面做了大量工作,将ARM指令集转为高级语言[3,5];井靖等提出了嵌入式软件的动静态分析机制,以帮助逆向分析软件的调用关系和完整性等[4]。此外,为了方便脱离硬件环境对固件代码进行分析和调试,鲍庆国引入了QEMU技术进行仿真模拟[5]。然而,这些工作只能将二进制文件转为代号或地址表达的高级语言,无法真正解析函数或变量的具体含义。
本文使用目前最流行的逆向分析软件IDA Pro,将二进制文件转换为ARM指令集的汇编语言,在此基础上,以某型发动机数据采集单元(DCU)为研究对象,阐述一种ARM架构嵌入式软件的逆向分析方法,从ARM框架代码入手,结合DCU的已知功能情况,依次逆向分析各个子函数和全局变量的实际含义。
1 ARM7TDMI架构
ARM7系列包括ARM7TDMI、ARM7TDMI-S、ARM720T和扩充了Jazelle的ARM7EJ-S等内核。ARM7TDMI内核支持32位寻址范围,其命名规则为:
● T:支持高密度16位的Thumb指令集;
● D:支持片上调试;
● M:支持64位乘法;
● I:支持EmbededICE观察硬件;
● S:ARM7TDMI的软核版本,编程模型与ARM7TDMI一致。
ARM处理器使用流水线增加处理器指令流的速度,可以同时进行几个操作。ARM7TDMI的流水线分3级,分别是取值、译码和执行。ARM7TDMI处理器使用了冯诺依曼结构进行存储器访问,指令和数据共用一条32位总线,只有装载、存储和交换指令可以对存储器中的数据进行访问。
ARM7TDMI支持7种处理器模式,分别为用户模式、FIQ模式、IRQ模式、管理模式、中止模式、未定义模式和系统模式。各模式的定义和关系如表1所示。
ARM7TDMI具有37个寄存器,包括31个通用的32位寄存器和6个状态寄存器。ARM各模式下可以访问的寄存器如表2所示。
根据各寄存器的作用范围和特点,从ARM7TDMI的汇编代码可以直接进行如下逆向分析工作。
1)栈空间操作分析:寄存器R13通常作为栈指针(SP),当使用R13时,通常是在操作栈空间的内容。
2)子函数调用分析:寄存器R14称为链接寄存器(LR),当要调用子函数时,其用于保存当前函数的下一条指令地址,子函数执行完毕后,将LR寄存器的内容放入R15(PC),返回原函数。因此,汇编语句中有BX LR的地方,一般情况下可以视作子函数的结尾标志。
3)函数传入参数分析:R0~R7可以作为子函数的传入参数,当一个函数中直接使用R0~R7寄存器的内容时,该函数可以视为有传入参数的函数。若R0在函数中第一次使用时是被赋值,则该函数的传入参数肯定是void类型。
4)分支跳转分析:对于BL分支指令,返回指令应为MOV PC,R14或实现类似功能的语句,通过判断该语句可以找到分支结束的标志。
5)中断响应函数分析:针对中止、FIQ、IRQ等异常模式,当退出异常模式时,应有SUBS PC,R14或实现类似功能的语句,通过查找这个语句,可以找到整个代码的中断响应函数。
nlc202207061804
转载注明来源:https://www.xzbu.com/1/view-15435511.htm