假设我有一个无法执行的二进制文件(例如,它在我没有的设备上运行),但我可以反汇编它。我可以获得有关架构的文档。(在我的例子中是 MIPS 小端。)但是二进制文件的导入很少,字符串也很少,等等,所以它看起来真的很紧凑。
我怎样才能静态地解压它?(编辑:我的意思是,在无法访问原始设备的情况下打开它。)
假设我有一个无法执行的二进制文件(例如,它在我没有的设备上运行),但我可以反汇编它。我可以获得有关架构的文档。(在我的例子中是 MIPS 小端。)但是二进制文件的导入很少,字符串也很少,等等,所以它看起来真的很紧凑。
我怎样才能静态地解压它?(编辑:我的意思是,在无法访问原始设备的情况下打开它。)
在过去我见过的 30 多个嵌入式设备固件中,我很少看到它们使用任何专有的东西。通常它只是 gzip/LZMA 或他们使用的类似压缩(尽管有时带有修改或剥离的标头)。
因此,作为第一步,我会尝试使用binwalk 之类的方法来搜索已知的压缩算法。如果这没有帮助,请尝试查找加密常量的工具,例如Find Crypt或Sign search。这仅在加密是软件实现时才有效。如果它是一个更复杂的设备,比如机顶盒,带有硬件加速解密引擎和用于存储密钥的 OTP 内存,那么如果没有运行时访问,你就不走运了(除非它们极大地搞砸了从OTP 到解密引擎)。
最后,您可以尝试找出它们是否使用某些专有算法,并使用QEMU或gxemul模拟该算法,或者用高级语言编写自己的解压缩器。
在The Ida Pro Book 中,Chris Eagle 演示了一个名为ida-x86emu的插件的使用,该插件可用于通过模拟 IDA 数据库中的执行来静态解压二进制文件。看看这个; 它是开源的,而且很容易使用。
几种可能的方式:
识别包装工
识别算法
弄脏你的手
通过暴力破解的懒惰方法:像ApLib这样的一些算法没有任何头文件和参数(甚至没有大小):该算法只需要一个指向压缩缓冲区的指针,所以有时只是盲目地在二进制文件的任何偏移量上尝试就足够了,并检查我们是否得到了一个不错的解压缩缓冲区(不是太小,不是很大+充满 00)。
我的一般答案是“通过模拟针对打包二进制文件的自修改操作”。因此,例如,这将包括消除大多数封隔器所隐藏的压缩。这样做将需要“静态跟踪”通过加壳器的执行流程,其代码可能会进行自我修改。
该解释适用于传统的打包方式,其中二进制文件的部分仅被压缩/加密。可能需要更复杂的解包策略,例如我的论文“解包虚拟化混淆器” 1 中所述。