并不是真的与芯片相关,但是希望我会从这里得到一些指导。
我有很多代码,但是我不知道它打算使用什么处理器。是否有可用的工具可以帮助我识别代码类型?哪些统计方法可以帮助您?字节分配?配对分布等?马尔可夫链也许?
并不是真的与芯片相关,但是希望我会从这里得到一些指导。
我有很多代码,但是我不知道它打算使用什么处理器。是否有可用的工具可以帮助我识别代码类型?哪些统计方法可以帮助您?字节分配?配对分布等?马尔可夫链也许?
Answers:
尝试通过GNU文件运行它。如果有任何标准标头,它将选择它。
例如。
jrt@lin:~/src$ file foo
foo: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped
这是一个非常有趣的问题。那里有数以百万计的指令集,但是只有少数非常常用的指令集。
我要看的第一件事是来源和预期用途。如果您怀疑它是在美国设计的,则主要针对的是带有英语数据表的处理器。如果是在亚洲设计的,那么它们将用于大量制造设备的许多处理器是美国工程师很少看到的。甚至欧洲也有一些处理器比其他处理器更普遍。
然后,我将研究代码的大小和功能(假设您知道代码在某种程度上做了什么)。如果只有几兆字节的代码,您可以为大多数嵌入式8位处理器打折,然后开始寻找带有外部存储器的大型设备。如果小于或等于几千字节,则您应该专注于更小,更便宜的设备。如果功能很简单,它甚至可能是四位处理器的代码。
在这一点上,值得研究一下内存结构。至少可能有一个程序部分和一个数据部分。如果它是一个二进制文件(与intel十六进制或motorola的记录相反),那么您对某些数据块放置在内存中的位置一无所知。十六进制编辑器可能会显示一些模式。如果确实采用十六进制或s记录格式,则可能会有更多有关它打算使用的处理器的内存结构的信息。一些处理器在程序存储器位置0复位,另一些在最高存储器位置复位。该程序可能在单独的存储位置中包含EEPROM初始值。如果要用于安全处理器(用于银行业务),它甚至可能具有用于奇数存储位置的安全密钥。
根据编程语言的不同,您可能还有一些其他线索。如果它是用C或类似的过程语言编程的,则函数几乎总是从一系列指令开始,以将某些寄存器保存到堆栈中(多次推送),然后在返回大量pop之前从堆栈中返回原始值。如果您可以进行某种模式识别,则会在整个过程中找到许多这样的序列,并且可以确定哪些指令最有可能是推/弹出指令,返回等,这可能会使选择范围缩小。
如果它是一个带有中断的嵌入式设备,则它可能具有一个中断向量表,该表看起来像是一堆跳转到一个大块中的不同存储位置上,可能在方便的位置(例如地址0x ??? 0)。 。跳转表在其他地方也可以用于其他用途,但是如果您可以找到看起来相同的指令序列(除了要跳转的地址是什么),则可以推断出跳转指令的外观,然后再缩小范围您的选择下降。
到那时,我将从最常见的处理器体系结构开始,看看是否有任何关联。x86,arm,mips,8051,avr,pic,powerpc,Z80、68k,6502等等等。有一些常用的处理器和指令集的列表-至少在英语国家中-可能会有所帮助。
我不知道有任何自动化工具可以帮助解决此问题,但是MAME模拟了许多处理器体系结构,一种可能的方法是通过许多处理器运行代码,并观察寄存器,以查看是否有点击的内容您了解设计。
如果它是使用C或Pascal之类的语言编译的,则可能需要某些标准的二进制序列。例如,对于C,几乎所有函数都以将堆栈指针保存为“框架”或“链接”指针的方式开头。对于任何给定的处理器,通常只有几种方法可以执行此操作。因此,您可以通过查找这些序列的X二进制来回答“处理器X的此代码”。
就是说,我有些运气,仅使用直方图就可以区分8088、6502和68000二进制。任何给定的处理器都有一定的法律指令操作码,这些操作码的使用频率通常比平均使用频率高。使用足够大的二进制数据块,您可以开始查看某些趋势。但是,由于给定二进制文件中的所有操作数都倾向于不与给定处理器类型相关联,因此这变得很困难,这实际上只会在直方图数据中产生噪声。同样,即使是同一处理器的两个不同程序,其直方图也可能明显不同。尽管如此,它仍可以为您提供起点。