#1 楼
(将我对类似问题的SO答案重新发布)在许多情况下,可以标识用于编译代码的编译器,并由此确定原始语言。
大多数语言实现都包含某种运行时库,以实现该语言的各种高级操作。例如,C具有实现文件I / O操作的CRT(
fopen
,fread
等),Delphi具有其string
类型(串联,赋值等)的编译器帮助器,ADA具有各种低级功能以确保语言安全和以此类推。通过比较程序代码和候选编译器的运行时库,您也许可以找到匹配项。IDA在FLIRT技术中实现了这种方法。通过使用签名,IDA能够确定DOS和Windows的大多数主要编译器。在Linux上,这有些困难,因为它没有单一的编译器二进制提供程序,因此必须为每个发行版都进行签名。可以识别所使用的编译器。许多编译器使用非常不同的惯用法来表示各种操作。例如,我能够猜出用于Duqu病毒的编译器是Visual C ++,后来被证实。
#2 楼
.NET可以通过import来标识,您可以使用依赖项warker来查看-。检查是否存在
mscorlib.dll
的导入,它是.net框架的核心库。 可以通过查看程序集来识别C ++,它使用此调用约定。
PEid可以显示有关编译器和运行方式的部分信息。时间被使用。通常,它为此使用签名列表。
Detect It Easy-此工具仍在维护中,并且具有非常有趣的功能。
评论
由于某些原因,我无法取消对PEID的操作。 Windows Defender会将其删除为恶意软件。
–c00000fd
18年1月5日在22:23
#3 楼
Marco Pontello的TrID软件通常可以识别用于编译文件的内容。评论
注意:免费,仅供非商业用途
–托马斯·韦勒(Thomas Weller)
2014年1月5日在21:08
您有使用指南吗?我已经下载了主程序,但是找不到单独包装所需的定义数据库?我看到了定义在网站上的位置,但是我还无法弄清楚如何下载它们。
–mattyb
17年4月6日在18:06
def下载就在主程序下载下
– Avery3R
17年4月14日在22:28
#4 楼
Java字节码文件可以通过其魔幻数字标识:文件开头的0xCAFEBABE
。同样,标准的命名约定是将这些文件的名称以.class
结尾。 .exe PE,除非它们已解压缩(假设它们只是被打包,而不是重新编译为机器代码)” 评论
将Java类文件打包到.exe PE中时,它们的幻数或文件扩展名将不可见,除非将它们解包(假定它们只是放在首位,而不是重新编译为机器代码)
– Nanofarad
2014年9月4日在17:35
#5 楼
Stud_PE(免费)扫描许多PE文件(.EXE和.DLL)的签名。#6 楼
您可以通过查看PE标头来检测.net程序集。请阅读CLR规范和PE / COFFEE规范以获取详细信息。Java使用它自己的类文件格式。我不太熟悉它,但是应该可以肯定地对类文件进行标识。
本地语言开发主要是关于启发式的。诸如调用约定,序言,结语等之类的东西。分解的递归下降以及惯用语识别器可能会使源编译器识别。例如,GCC和类生成非常独特的代码。
#7 楼
(公然插件)protectionid(pid.gamecopyworld.com)报告编译器信息(在配置中将其打开)
要这样做,它是一堆复杂的事情
检查字节码
检查导入(mscoree.dll,msvcr * .dll等)
检查入口点代码
检查mz存根
检查链接器版本
以及其他一些内容
示例输出
扫描- > C:\ ProtectionID.source \ problematic.files \ solved \ detected \ Agile.NET
文件类型:32位Exe(子系统: Win GUI / 2),大小:7680(01E00h)字节
[文件启发式]->标记:00000100000001001101000000110000(0x0404D030)
[入口节熵]: 5.25(第0节)“ .text” |大小:0x1288(4744)个字节
[DllCharacteristics]->标志:(0x8540)-> ASLR | DEP | NOSEH | TSA
[ImpHash]-> f34d5f2d4577ed6d9ceec516c1f5a744
[SectionCount] 3(0x3)| ImageSize 0x8000(32768)个字节
[VersionInfo]产品名称:AgileUnpackMe
[VersionInfo]产品版本:1.0.4999.25574
[ VersionInfo]文件描述:AgileUnpackMe
[VersionInfo]文件版本:1.0.4999.25574
[VersionInfo]原始文件名:AgileUnpackMe.exe
[VersionInfo ]内部名称:AgileUnpackMe.exe
[VersionInfo]法律版权:版权所有2013
[Debug Info](记录1 of 1)(文件偏移量0x1414)
特性:0x0 | TimeDateStamp:0x522C69AD | MajorVer:0 / MinorVer:0->(0.0)
Type:2(0x2)-> CodeView |大小:0x57(87)
AddressOfRawData:0x3230 | PointerToRawData:0x1430
CvSig:0x53445352 | SigGuid A75CE0F5-0D67-4FC4-A2C612B95C81F742
年龄:0x6 | Pdb:c:\ AgileUnpackMe \ AgileUnpackMe \ obj \ x86 \ Debug \ AgileUnpackMe.pdb
[!]检测到AgileDotNet
[CompilerDetect]-> .NET
[。] .Net信息-> v 2.5 | x86托管(/ platform:x86)|标志:0x00000003->
COMIMAGE_FLAGS_ILONLY | COMIMAGE_FLAGS_32BITREQUIRED |
[。]入口点(令牌):0x06000006
[。] MetaData RVA:0x00002184 |大小:0x00000C0C(3084)
[。] MetaData->版本1.1-> v2.0.50727
[。]标志:0x0 |数据流:0x5(5)
扫描时间:0.156秒[00000009Ch(156)刻度] [539扫描完成]
评论
通常,用于生成可执行文件的编译器会在其自身上留下一些显式字符串。尝试查看可执行文件中剩余的多余部分。其次,如果没有显式标记,则可以通过识别用于生成汇编器的ABI来推断原始语言(可能是编译器)。值得记住的是,程序可以用多种语言编写,然后转换或导出为二进制文件。
Mandiant的Red Curtain具有此功能,想知道您是否可以逆转他们在那做的事情吗?