如何识别女巫 CPU 运行程序集

逆向工程 艾达 拆卸 机器码
2021-06-29 19:07:52

我有大约 300 字节的二进制机器码。

我不知道代码是针对哪个指令集的,所以我无法用 IDA 打开它。

有没有什么工具可以帮助识别指令集?

2个回答

有多种工具可以识别文件中的操作码。

  1. binwalk

    如果您的 blob 是一个存档并混合了多个文件,或者一开始没有幻数,那么尝试binwalk使用以下选项运行它(有关更多详细信息,请参阅binwalk 的文档):

    #> binwalk --opcodes myfile.bin
    

    如果你使用 IDA,你也可以使用这个binwalk IDA 插件

    Binwalk IDA 插件菜单

    Binwalk IDA 插件的结果

  2. file

    如果您的文件有一些幻数,那么最简单的方法是对其运行 a file该程序可识别许多不同的文件格式并显示有关每种格式的大量信息。

    #> file myfile.bin
    

您可能会尝试使用cpu_rec,它声称能够通过分析原始二进制数据(70 种架构)来识别各种架构。

cpu_rec 是一种识别任意二进制文件中的 cpu 指令的工具。它可以用作独立工具,也可以用作binwalk的插件

工具的使用方法

作为 binwalk 模块

-%使用 binwalk 时添加标志

要有耐心。等待几分钟的结果是意料之中的。在我的笔记本电脑上,该工具需要 25 秒和 1 Gb 的 RAM 来为 70 种架构创建签名,然后对二进制文件的分析每 Mb 需要一分钟。如果您希望该工具更快,您可以删除一些架构,如果您知道您的二进制文件不是其中之一(通常在固件中找不到 Cray 或 MMIX)。

作为独立工具

只需运行该工具,将要分析的二进制文件作为参数该工具将尝试匹配整个文件的架构,然后检测与 CPU 架构对应的最大二进制块;通常这是正确的答案。

如果结果不令人满意,-v在参数前加上两次会使该工具变得非常冗长;这在向语料库添加新架构时很有帮助。

如果安装了https://github.com/LRGH/elfPriority,那么该工具还会从ELF、PE、Mach-O或COFF文件中提取文本部分,并输出该部分对应的架构;从完整的二进制文件构建语料库时,也可以使用提取文本部分的可能性。

选项-d后跟一个目录,转储该目录中的语料库;使用此选项可以重建默认语料库。

例子

将该工具作为 binwalk 模块运行通常会导致:

shell_prompt> binwalk -% corpus/PE/PPC/NTDLL.DLL corpus/MSP430/goodfet32.hex

Target File:   .../corpus/PE/PPC/NTDLL.DLL
MD5 Checksum:  d006a2a87a3596c744c5573aece81d77

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             None (size=0x5800, entropy=0.620536)
22528         0x5800          PPCel (size=0x4c800, entropy=0.737337)
335872        0x52000         None (size=0x1000, entropy=0.720493)
339968        0x53000         IA-64 (size=0x800, entropy=0.491011)
342016        0x53800         None (size=0x22000, entropy=0.727501)

Target File:   .../corpus/MSP430/goodfet32.hex
MD5 Checksum:  4b295284024e2b6a6257b720a7168b92

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             MSP430 (size=0x5200, entropy=0.472185)
20992         0x5200          None (size=0xe00, entropy=0.467086)

我们可以注意到,在分析过程中,PPC/NTDLL.DLL 一个小块被识别为IA-64这是一个错误的检测,因为 IA-64 架构具有类似于数据段的统计特性。

如果熵值大于0.9,很可能是加密或压缩的数据,因此cpu_rec的结果应该是没有意义的。

默认语料库中的已知架构
68HC08 68HC11 8051 Alpha ARcompact ARM64 ARMeb ARMel ARMhf AVR AxisCris Blackfin Cell-SPU CLIPPER CompactRISC Cray Epiphany FR-V FR30 FT32 H8-300 HP-Focus HP-PA i860 IA-64 IQ2000 M32C M32R M68k M88k MCore Mico32 MicroBlaze MIPS16 MIPSeb MIPSel MMIX MN10300 Moxie MSP430 NDS32 NIOS-II OCaml PDP-11 PIC10 PIC16 PIC18 PIC24 PPCeb PPCel RISC-V RL78 ROMP RX S-390 SPARC STM8 Stormy16 SuperH TILEPro TLCS-90 TMS320C2x TMS320C6x V850 VAX Visium WE32000 X86-64 X86 Xtensa Z80 #6502#cc65