从原始二进制代码中识别处理器类型?


19

并不是真的与芯片相关,但是希望我会从这里得到一些指导。

我有很多代码,但是我不知道它打算使用什么处理器。是否有可用的工具可以帮助我识别代码类型?哪些统计方法可以帮助您?字节分配?配对分布等?马尔可夫链也许?


7
您能给我们原始十六进制的前200个字节吗?
2010年

这是一个有趣的问题。您要入侵哪种设备?
DavidEGrayson

1
您可以尝试将其喂给几个不同的反汇编程序,然后看看会发生什么。
JustJeff 2011年

2
我将以100个字节命名该代码!= P
JustJeff

好问题。但是可能更适合StackOverflow。
sharptooth 2012年

Answers:


16

尝试通过GNU文件运行它。如果有任何标准标头,它将选择它。

例如。

jrt@lin:~/src$ file foo
foo: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped

试过了。GNU文件说它是“数据”。
心理学家,2010年

3
你能张贴一些吗?试图用“字符串”在其中搜索ASCII吗?
Toby

9

这是一个非常有趣的问题。那里有数以百万计的指令集,但是只有少数非常常用的指令集。

我要看的第一件事是来源和预期用途。如果您怀疑它是在美国设计的,则主要针对的是带有英语数据表的处理器。如果是在亚洲设计的,那么它们将用于大量制造设备的许多处理器是美国工程师很少看到的。甚至欧洲也有一些处理器比其他处理器更普遍。

然后,我将研究代码的大小和功能(假设您知道代码在某种程度上做了什么)。如果只有几兆字节的代码,您可以为大多数嵌入式8位处理器打折,然后开始寻找带有外部存储器的大型设备。如果小于或等于几千字节,则您应该专注于更小,更便宜的设备。如果功能很简单,它甚至可能是四位处理器的代码。

在这一点上,值得研究一下内存结构。至少可能有一个程序部分和一个数据部分。如果它是一个二进制文件(与intel十六进制或motorola的记录相反),那么您对某些数据块放置在内存中的位置一无所知。十六进制编辑器可能会显示一些模式。如果确实采用十六进制或s记录格式,则可能会有更多有关它打算使用的处理器的内存结构的信息。一些处理器在程序存储器位置0复位,另一些在最高存储器位置复位。该程序可能在单独的存储位置中包含EEPROM初始值。如果要用于安全处理器(用于银行业务),它甚至可能具有用于奇数存储位置的安全密钥。

根据编程语言的不同,您可能还有一些其他线索。如果它是用C或类似的过程语言编程的,则函数几乎总是从一系列指令开始,以将某些寄存器保存到堆栈中(多次推送),然后在返回大量pop之前从堆栈中返回原始值。如果您可以进行某种模式识别,则会在整个过程中找到许多这样的序列,并且可以确定哪些指令最有可能是推/弹出指令,返回等,这可能会使选择范围缩小。

如果它是一个带有中断的嵌入式设备,则它可能具有一个中断向量表,该表看起来像是一堆跳转到一个大块中的不同存储位置上,可能在方便的位置(例如地址0x ??? 0)。 。跳转表在其他地方也可以用于其他用途,但是如果您可以找到看起来相同的指令序列(除了要跳转的地址是什么),则可以推断出跳转指令的外观,然后再缩小范围您的选择下降。

到那时,我将从最常见的处理器体系结构开始,看看是否有任何关联。x86,arm,mips,8051,avr,pic,powerpc,Z80、68k,6502等等等。有一些常用的处理器和指令集的列表-至少在英语国家中-可能会有所帮助。

我不知道有任何自动化工具可以帮助解决此问题,但是MAME模拟了许多处理器体系结构,一种可能的方法是通过许多处理器运行代码,并观察寄存器,以查看是否有点击的内容您了解设计。


“甚至欧洲也有一些处理器比其他处理器更普遍。” 生活在欧洲,这从未发生过。你能举个例子吗?
stevenvh 2012年

@stevenvh由于有Acorn和Sinclair公司,基于6502和Z80的嵌入式系统非常受欢迎。当然,ARM处理器始于Acorn Computers。
亚当·戴维斯

5

想法:您知道源代码的年龄吗,即,源代码的创建时间/年份大约是多少?

如果足够老,可能会为您提供有关它为哪个处理器编写的线索。您可以使用它的年龄/年份,并确定在那个时间段内最受欢迎的处理器,然后尝试在这些处理器上加载/执行hex文件。

再考虑一下,考虑到最近20年中处理器的大量普及,这可能是一针见血的技术,但效果不是很好。


4

许多个月前,当周围没有太多不同的处理器内核时,我通过频率分析几次识别出Z80代码。因为Z80 CDcall subroutineC9现在是的机器代码return from subroutine(我永远不会忘记),而这些通常是最常出现的代码。但是,这需要您熟悉机器代码级别的指令集。拥有手工组装经验会有所帮助(有很多帮助,我仍然可以倒数十六进制来计算偏移量)。


3

如果该文件用于12位或14位PIC,则每对字节将是12位或14位字,通常先存储LSB,然后清除两个或四个最高有效位。


1

如果它是使用C或Pascal之类的语言编译的,则可能需要某些标准的二进制序列。例如,对于C,几乎所有函数都以将堆栈指针保存为“框架”或“链接”指针的方式开头。对于任何给定的处理器,通常只有几种方法可以执行此操作。因此,您可以通过查找这些序列的X二进制来回答“处理器X的此代码”。

就是说,我有些运气,仅使用直方图就可以区分8088、6502和68000二进制。任何给定的处理器都有一定的法律指令操作码,这些操作码的使用频率通常比平均使用频率高。使用足够大的二进制数据块,您可以开始查看某些趋势。但是,由于给定二进制文件中的所有操作数都倾向于不与给定处理器类型相关联,因此这变得很困难,这实际上只会在直方图数据中产生噪声。同样,即使是同一处理器的两个不同程序,其直方图也可能明显不同。尽管如此,它仍可以为您提供起点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.