约束:
我正在对未知来源的二进制固件映像进行反向工程,该映像在无法物理访问的设备上运行。也就是说,我无法拆开该设备,甚至无法使用其功能框图,也无法通过目视检查或询问对象的创建者来识别微处理器。从字面上看,唯一可用的是二进制映像。
问题:
我的问题是:鉴于这些限制,可以使用哪些工具或理论方法通过检查二进制来识别处理器的指令集?
到目前为止的研究:
我当然试图将反汇编程序用于各种流行的ISA,例如ARM,x86和MIPS。我也进行了文献搜索以查找研究论文,但什么都没发现。是瑞萨M16C的代码。“

评论

这些都是严格的限制。当您提到“它在无法物理访问的设备上运行”时,是否表示您知道它可以在什么设备上运行?这是嵌入式设备吗?您是否可以从那个角度考虑运行固件的设备所支持的底层架构?

#1 楼

这很难执行。在没有任何初始信息的情况下,您将不得不使用模式匹配和概率逼近法进行启发式研究。供我自己用于工作,并且计划在某天(不久后)分享)。它可以工作,但还不够成熟,无法扔到丛林中。我的方法如下:如果可能的话,检测二进制格式的数据结构,使用多种指令集编码(ARM,x86,MIPS等)分解二进制代码块,然后进行启发式评估(使用不良和其他东西:) )更接近...

但是有趣的是,您的问题之前已经在这里提出过,并且给出了一种有趣的方法并将其视为答案。它使用与生物学类似的方法来确定系统发育距离。

评论


与另一个问题的链接最有趣。我不知道为什么我的搜索找不到它。谢谢!

–爱德华
2014年6月2日14:49

别客气。如果您想对这个问题有任何见解,我仍然可以联系。虽然我不能共享我的工具,但很高兴能帮助您研究一种方法:D

– Yaspr
2014年6月2日15:32

#2 楼

本演示文稿提供了一种方法。

标题:用于自定义虚拟机的二进制程序的反向工程

作者:Alexander Chernov和Katerina Troshina



二进制程序的初始标记。识别数据段和代码段。可能会使用有关
程序目的的先前信息,甚至可能使用某些文档提示。在此步骤中,将标识代码的入口点(或几个入口点)。
通过识别子程序边界来重建子程序结构。标识子例程返回(RET)指令。很自然地希望
代码段中的最后一条指令是返回指令。 RET指令通常
分隔子例程,因此我们可以预期,在许多(甚至大多数)情况下,CALL指令应该在RET指令之后立即通过控制。
使用以下假设来识别无条件跳转(JMP)指令
:代码执行从某个固定的地址开始。
识别呼叫指令。呼叫说明与无条件跳转相似。通过研究初始化代码,可以识别出多个CALL指令候选对象,
,并且在对整个代码进行验证后仍保留一个候选对象。 br />在指令的位编码处,并检查它是否可能相对于下一个指令字有一个
偏移量。这样,就可以确定相对跳转,
调用和条件跳转的候选对象。
通过观察用于内存复制操作的加载-存储模式来识别内存的加载和存储指令。
关于虚拟机寄存器结构和寄存器宽度的观察。此VM可能有多少个寄存器,以及有多宽
是吗
通过与已确定的条件跳转配对来进行算术和逻辑运算的观察。