如何理解 exe/dll 是用 C++/.Net/Java 还是其他任何语言编写的。我尝试使用 Dependency walker,但无法获得所需的信息。
如何知道用哪种语言/技术程序(.exe)编写的?
逆向工程
拆卸
视窗
二元分析
静态分析
可执行
2021-06-26 00:31:10
4个回答
在许多情况下,可以识别用于编译代码的编译器,并从中识别出原始语言。
大多数语言实现都包含某种运行时库来实现语言的各种高级操作。例如,C具有它实现文件I的CRT / O操作(fopen
,fread
,Delphi有其编译器助手等)string
类型(串联,分配等),ADA具有各种低级别的功能,以确保安全性的语言等。通过比较程序代码和候选编译器的运行时库,您可能会找到匹配项。
IDA 在FLIRT 技术中实现了这种方法。通过使用签名,IDA 能够确定大多数用于 DOS 和 Windows 的主要编译器。在 Linux 上这有点困难,因为它没有编译器二进制文件的单一提供者,因此必须为每个发行版制作签名。
但是,即使不求助于运行时库代码,也可以识别所使用的编译器。许多编译器使用非常不同的习语来表示各种操作。比如我猜到毒曲病毒使用的编译器是Visual C++,后来证实了。
- .NET 可以通过导入来识别,您可以使用依赖项warker 看到它 - 检查是否有一个导入
mscorlib.dll
是 .net 框架的核心库。 - C++ 可以通过以下方式识别
- 查看程序集 - 它使用此调用约定。
- PEid可以显示有关使用的编译器和运行时的部分信息。通常,它为此使用签名列表。
- Detect It Easy - 此工具仍在维护中,并具有非常有趣的功能。
马可Pontello的论坛报软件通常能识别什么是用于编译文件。
Java 字节码文件可以通过它们的幻数来标识:0xCAFEBABE
在文件的开头。此外,标准命名约定是让这些文件的名称以.class
.
但是,@hexafraction 在评论中警告说:“Java 类文件在打包到 .exe PE 中时不会看到它们的幻数或文件扩展名,除非它们被解包(假设它们只是首先被打包,而不是重新编译为机器码)”
其它你可能感兴趣的问题