如何知道哪些语言/技术程序(.exe)被写入?


36

如何理解exe/dll是用C++/.Net/Java还是其他语言编写的。我试图使用Dependency walker,但无法获得所需的信息。

+1

一般用于构建编译器可执行文件留下一些关于它自己的显式字符尝试查看可执行文件中剩余的额外部分。其次,如果没有显式标签,您将能够通过识别用于生成汇编程序的ABI来推断原始语言(可能还有编译器)。 05 1月. 142014-01-05 09:35:28

  0

值得记住的是,程序可以用多种语言编写,然后转换或导出为二进制文件。 10 1月. 142014-01-10 23:01:54

  0

Mandiant的红色窗帘有这个功能,想知道你是否可以改变他们在那里做的? 22 2月. 142014-02-22 14:46:41

34

(重新发布my SO answer到一个类似的问题)

在许多情况下,可以识别用于编译代码编译器,并从该中,原始语言。

大多数语言实现包括某种运行时库来实现各种语言的高级操作。例如,C具有实现文件I/O操作的CRT(fopenfread等),Delphi为其string类型(连接,赋值等)提供编译器助手,ADA具有各种底层函数以确保语言的安全性和等等。通过比较程序的代码和候选编译器的运行时库,您可以找到匹配项。

IDA在FLIRT technology中实现此方法。通过使用签名,IDA可以确定DOS和Windows的大部分主要编译器。在Linux上这比较困难,因为它没有单独的编译器二进制文件提供程序,因此每个发行版都必须签名。

但是,即使不诉诸运行时库代码,也可能识别使用的编译器。许多编译器使用非常不同的习语来表示各种操作。例如,编译器用于Duqu病毒的I was able to guess是Visual C++,后来是confirmed


7

Marco Pontello的TrID软件通常可以识别用于编译文件的内容。

  0

注意:仅限非商业用途 05 1月. 142014-01-05 21:08:24

  0

您有关于如何使用它的指南吗?我已经下载了主程序,但是无法找到它作为单独软件包所需的定义数据库?我看到了网站上的定义,但我一直无法弄清楚如何下载它们。 06 4月. 172017-04-06 18:06:18

  0

def下载正确在主程序下载 14 4月. 172017-04-14 22:28:32


15
  1. .NET可以通过导入进行标识,您可以使用dependency warker查看 - 检查是否存在导入为.net框架的核心lib的mscorlib.dll
  2. C++可以通过
    1. 查看组件 - 它使用this call convention
    2. PEid可以显示关于使用什么编译器和运行时的部分信息。一般来说,它使用签名列表。
    3. Detect It Easy - 这个工具仍然保持并具有相当有趣的功能。
  0

由于某种原因,我无法打开'PEid'。 Windows Defender将其移除为恶意软件。 05 1月. 182018-01-05 22:23:58


2

Stud_PE(免费)扫描PE文件(.EXEs和.DLLs)的很多签名。


1

您可以通过查看PE标头来检测.net程序集。有关详细信息,请阅读CLR规范和PE/COFFEE规范。

Java使用它自己的类文件格式。我并不太熟悉它,但应该可以积极地确定一个类文件。

母语开发主要是关于启发式。诸如调用约定,序言,epilogues等。反汇编下降,加上成语识别器可能会使源编译器成为可能。例如,GCC和类生成非常独特的代码。


4

Java字节码文件可以通过文件开头的magic number0xCAFEBABE进行标识。另外标准的命名约定是让这些文件的名字以.class结尾。

但是,@hexafraction在评论中警告:“当打包到.exe PE中时,Java类文件的魔术数或文件扩展名不会显示,除非它们是解压缩的(假设它们只是打包在第一名,而不是重新编译成机器代码)”

  0

将Java文件类型文件打包到.exe PE时,它们的幻数或文件扩展名不会显示,除非它们是解压缩的(假设它们只是打包放在第一位,而不是重新编译为机器码) 04 9月. 142014-09-04 17:35:41

+1

@hexafraction thanks编辑 04 9月. 142014-09-04 19:32:20


0

(公然插头)

protectionid(pid.gamecopyworld.com)报道编译器信息(打开它的配置)

做它,它的多层次的东西

检查字节模式

检查进口(mscoree.dll中,msvcr * .DLL等)

检查入口点代码

检查MZ存根

检查链接器版本

和其他一些东西

示例输出

扫描 - > C:\ ProtectionID.source \ problematic.files \解决\检测\ Agile.NET 6.2.0.16.AgileNETUnpackMe \ AgileUnpackMe.exe

文件类型:32位埃克(子系统:运GUI/2),尺寸:7680(01E00h)字节(一个或多个)

[文件启发式] - >标记:00000100000001001101000000110000(0x0404D030)

[入口点部分熵]:5.25(部分#0)”的.text “|大小:0x1288(4744)字节(s)

[DllCharacteristics] - >标志:(0x8540) - > ASLR | DEP | NOSEH | TSA

[ImpHash] - > f34d5f2d4577ed6d9ceec516c1f5a744

[SectionCount] 3段(0x3)| IMAGESIZE为0x8000(32768)字节(S)

[VERSIONINFO产品名称:AgileUnpackMe

[VERSIONINFO]产品版本:1.0.4999.25574

[VERSIONINFO]文件说明:AgileUnpackMe

[VERSIONINFO ]文件版本:1.0.4999.25574

[VERSIONINFO]原始文件名:AgileUnpackMe.exe

[V ersionInfo]内部名称:AgileUnpackMe。EXE

[VERSIONINFO]法律版权所有:版权所有2013

[调试信息](记录1)(文件偏移0x1414)

特性:为0x0 | TimeDateStamp:0x522C69AD | MajorVer:0/MinorVer:0 - >(0.0)

类型:2(0x2) - > CodeView |大小:0x57(87)

AddressOfRawData:0x3230 | PointerToRawData:0x1430

CvSig:0x53445352 | SigGuid A75CE0F5-0D67-4FC4-A2C612B95C81F742

年龄:0x6 | [!] PDB::C \ AgileUnpackMe \ AgileUnpackMe \ OBJ \ 86 \调试\ AgileUnpackMe.pdb

AgileDotNet检测

[CompilerDetect] - > .NET

的.Net信息 - > [] v 2.5 | x86托管(/ platform:x86)|标志:0x00000003 - > COMIMAGE_FLAGS_ILONLY | COMIMAGE_FLAGS_32BITREQUIRED |

入口点(令牌):0x06000006

元数据RVA [] []:0x00002184 |尺寸:0x00000C0C(3084)

MetaData-> 1.1版 - > V2.0.50727

标志[] []:为0x0 |流:0x5的(5)

  • 扫描耗时:0.156秒(s)实施00000009Ch(156)蜱(S)] [539扫描(一个或多个)来完成]