我想对大量二进制文件进行快速分析并确定每个二进制文件的语言。
是否有独立的 cli 工具可以检测二进制文件是用哪种编程语言编写的?
逆向工程
程序分析
2021-06-27 09:50:26
2个回答
除了Christian所说的,我想提一下radare的rabin2工具。输出肯定不是完美的。但是,它会给你一个想法(或某种预测,试一试!)。
你可以做:
rabin2 -I a.out | grep lang
它会输出:
$ rabin2 -I a.out | grep lang
lang c++
这里-Iflag 提取二进制信息。
我不知道有任何这样的工具。事实上,制作一个也不是那么容易,因为可执行文件不直接识别使用哪种语言来制作它。
请记住,计算机只能理解机器码。更复杂的是,可以使用多种语言来创建一个可执行文件。
那么可以做到吗?嗯,在某种程度上。它可以像这样工作:
- 某些语言需要特定的库集。这些可用于识别语言,如 Visual C++ 的 VCRUNTIME*.DLL。但是它不会捕获动态加载。
- 不同的语言使用不同的模式/代码组织,这些模式/组织可以被识别/指纹(即,您的高级语言中的对象可能以某种方式编译)
- 不同的编译器优化和表现不同。我确信可以对编译后的代码进行指纹识别。现在,随着新版本编译器的发布,这些指纹必须针对不同的优化级别进行相应的更新。
这不会是一个完美的解决方案,对于试图混淆其工作方式的代码,如恶意软件,我怀疑它很难自动识别。
区分汇编语言/编译器可能非常困难(即 FASM 中的 x64 汇编与 NASM 中的 x64)。
某些(非常)高级语言的自包含可执行文件通常更容易识别。如果不是语言本身,至少是平台(即 .NET 或 JVM)。