到目前为止,我看了两种方式。两者在误报或误报方面都不能说服我:


使用字符串:如何检索用于编译给定ELF可执行文件的GCC版本?
使用链接器PE标头中的version字段:我可以通过检查DLL本身来判断使用哪个版本的Visual Studio构建DLL吗? / gcc?

例如,是否存在某些字符串,标头值,节,导入等可以使它们彼此区分?确切的编译器版本和使用的编译器标志无关紧要...

我也不希望出现恶意可执行文件。

评论

也许有帮助:reverseengineering.stackexchange.com/questions/16060/…

我宁愿不要依赖外部工具(该工具可能已过期或可能不包含适当的签名)。另外,我不需要确切的版本,只要是gcc或VS,就不需要更一般的信息。

您可以看一下丰富的标题

什么是富标头?

ntcore.com/files/richsign.htm

#1 楼

有一个工具要塞:peid。 peid所使用的格式也是用于检测编译器和运行时打包程序(修改修改程序的程序)的事实上的标准格式。虽然peid似乎不再被积极开发,但是您可以在网上找到最新的peid第三方签名文件。

当然,通过查看peid签名,您可以看到它们用于标识编译器的内容。主要是进入点的代码,即甚至调用了main()或WinMain()之前运行的指令。

评论


对于64位二进制文​​件,这似乎对我不起作用,无法将其识别为PE文件

– jrh
12月3日13:34

#2 楼

虽然不是确定使用GCC还是MSVC(Visual Studio)的确定方法,但Rich标头的存在确实确定是否使用了Microsoft的link.exe(MS VC工具集的链接器)。 (注意:较新的Visual Studio也支持使用clang进行构建)

我得到它官方上没有文档记录,但可以说它是最公开和最有文档记录的未记录PE结构。

Link.exe总是插入Rich标头,没有办法告诉它不要。甚至在visualstudio.com上都要求添加一个开关以将其删除,但官方的回应是,目前尚无办法:https://developercommunity.visualstudio.com/idea/740443/add-linker-option-to-strip -rich-stamp-from-exe-hea.html。即使包含“开发人员隐私”,他们也可能永远不会删除此标头,因为所包含的信息与构建环境相关(通常无法个人识别),并且当前是松散链接恶意软件归因的一种非常流行的方法。 >
相反,MinGW,GCC等不会插入此标头。还可以解析和处理标头):值。

#3 楼

除了PE检测工具(如PEiD,Detase it easy等)外,GCC和MSVC还具有一些特殊的代码模式,例如,GCC使用MOV inst而不是PUSH inst来将值压入堆栈。

#4 楼

最好的启发式方法是代码。我会创建一个hello world测试文件,并使用我感兴趣的标识编译器进行编译。

将它们加载到IDA的免费版本中(如果有,请添加到Pro),然后检查入口点的说明。在入口点匹配编译器代码无疑是正确的选择。您可能必须尝试使用​​同一编译器的几个版本,以确保选择匹配的代码是一致的。

#5 楼

如果您使用WinDbg,一个简单的方法可能就是在每个代码页中简单地搜索0x00400000(或任何图像基址)。但显然,这似乎是习惯(不必要?)引用图像标题的习惯。例如,可以在由GCC编译的Simutrans版本120.2.2 r8163中找到以下代码:

00401002:    lea     esi,[esi]
00401009:    lea     edi,[edi]
00401010:    sub     esp,1Ch
00401013:    xor     eax,eax
00401015:    cmp     word ptr [image00400000 (00400000)],5A4Dh  <--- reference to the MS-DOS Stub
0040101e:    mov     dword ptr [image00400000+0x59c7ec (0099c7ec)],1
00401028:    mov     dword ptr [image00400000+0x59c7e8 (0099c7e8)],1
00401032:    mov     dword ptr [image00400000+0x59c7e4 (0099c7e4)],1
0040103c:    mov     dword ptr [image00400000+0x59c490 (0099c490)],1
00401046:    je      image00400000+0x10b0 (004010b0)
00401048:    mov     dword ptr [image00400000+0x4b8008 (008b8008)],eax
0040104d:    mov     eax,dword ptr [image00400000+0x59c7f8 (0099c7f8)]
00401052:    test    eax,eax
00401054:    je      image00400000+0x10a0 (004010a0)
00401056:    mov     dword ptr [esp],2
0040105d:    call    image00400000+0x2c0c38 (006c0c38)
00401062:    mov     dword ptr [esp],0FFFFFFFFh
00401069:    call    image00400000+0x2a2ef0 (006a2ef0)
0040106e:    mov     edx,dword ptr [image00400000+0x59c808 (0099c808)]
00401074:    mov     dword ptr [image00400000+0x59de98 (0099de98)],eax
00401079:    mov     dword ptr [image00400000+0x59de9c (0099de9c)],eax
0040107e:    mov     eax,dword ptr [image00400000+0x59e6fc (0099e6fc)]
00401083:    mov     dword ptr [eax],edx
00401085:    call    image00400000+0x2a2be0 (006a2be0)
0040108a:    cmp     dword ptr [image00400000+0x3d0708 (007d0708)],1
00401091:    je      image00400000+0x1100 (00401100)
00401093:    xor     eax,eax
00401095:    add     esp,1Ch
00401098:    ret
00401099:    lea     esi,[esi]
004010a0:    mov     dword ptr [esp],1
004010a7:    call    image00400000+0x2c0c38 (006c0c38)
004010ac:    jmp     image00400000+0x1062 (00401062)
004010ae:    xchg    ax,ax
004010b0:    mov     edx,dword ptr [image00400000+0x3c (0040003c)]
004010b6:    cmp     dword ptr image00400000 (00400000)[edx],4550h
004010c0:    lea     ecx,image00400000 (00400000)[edx]
004010c6:    jne     image00400000+0x1048 (00401048)
004010c8:    movzx   edx,word ptr [ecx+18h]
004010cc:    cmp     dx,10Bh
004010d1:    je      image00400000+0x1112 (00401112)
004010d3:    cmp     dx,20Bh
004010d8:    jne     image00400000+0x1048 (00401048)
004010de:    cmp     dword ptr [ecx+84h],0Eh
004010e5:    jbe     image00400000+0x1048 (00401048)
004010eb:    mov     edx,dword ptr [ecx+0F8h]
004010f1:    xor     eax,eax
004010f3:    test    edx,edx
004010f5:    setne   al
004010f8:    jmp     image00400000+0x1048 (00401048)
004010fd:    lea     esi,[esi]
00401100:    mov     dword ptr [esp],offset image00400000+0x2a2e70 (006a2e70)
00401107:    call    image00400000+0x2a2e60 (006a2e60)
0040110c:    xor     eax,eax
0040110e:    add     esp,1Ch
00401111:    ret
00401112:    cmp     dword ptr [ecx+74h],0Eh
00401116:    jbe     image00400000+0x1048 (00401048)
0040111c:    mov     ecx,dword ptr [ecx+0E8h]
00401122:    xor     eax,eax
00401124:    test    ecx,ecx
00401126:    setne   al
00401129:    jmp     image00400000+0x1048 (00401048)
0040112e:    xchg    ax,ax
00401130:    sub     esp,2Ch
00401133:    mov     eax,dword ptr [image00400000+0x59c7e0 (0099c7e0)]
00401138:    mov     dword ptr [esp+10h],offset image00400000+0x4b8000 (008b8000)
00401140:    mov     dword ptr [esp+8],offset image00400000+0x4b8010 (008b8010)
00401148:    mov     dword ptr [esp+4],offset image00400000+0x4b8014 (008b8014)
00401150:    mov     dword ptr [esp],offset image00400000+0x4b8018 (008b8018)
00401157:    mov     dword ptr [image00400000+0x4b8000 (008b8000)],eax
0040115c:    mov     eax,dword ptr [image00400000+0x3d06cc (007d06cc)]
00401161:    mov     dword ptr [esp+0Ch],eax
00401165:    call    image00400000+0x2c0c40 (006c0c40)
0040116a:    add     esp,2Ch
0040116d:    ret


我在Simutrans中搜索了图像基址并得到以下结果:

0:000> s -d 00401000 L?003cd38c 0x00400000
00401018  00400000 05c75a4d 0099c7ec 00000001  ..@.MZ.......... <--- relevant
004010b8  00400000 00004550 00008a8d 80750040  ..@.PE......@.u. <--- relevant
005b50e0  00400000 04788908 01044783 0000e281  ..@...x..G......
006a3170  00400000 8d10fa83 4000009f c4458900  ..@........@..E.
006a31d0  00400000 85e8d389 81fffffd 8168f4fe  ..@...........h.
006a32b0  00400000 d0480f00 29c4458b 89d001ca  ..@...H..E.)....
006a32d0  00400000 810cc683 8168f4fe 7c820f00  ..@.......h....|
006a3a28  00400000 0672b70f 1802448d 2074f685  ..@...r..D....t 
006a3ae4  00400000 efeb0c75 0026748d 8301eb83  ..@.u....t&.....
007cf75c  00400000 0049004f 007e0288 007e0290  ..@.O.I...~...~.
009a3378  00400000 00400040 00400080 004000ff  ..@.@.@...@...@.
009a49a0  00400000 00400040 00400080 004000ff  ..@.@.@...@...@.
009a5248  00400000 00400040 00400080 004000ff  ..@.@.@...@...@.
009a5dd8  00400000 00400040 00400080 004000ff  ..@.@.@...@...@.
009e3ea0  00400000 004014c0 005a8000 005e005c  ..@...@...Z.\.^.
009e3ef4  00400000 00000000 00000000 abababab  ..@.............
0:000> s -d 00401001 L?003cd38c 0x00400000
0043b53d  00400000 0c2444c7 00000000 08244489  ..@..D$......D$.
006a3179  00400000 0fc44589 00011984 20fa8300  ..@..E......... 
006a383d  00400000 0b745a4d 891cc483 5f5e5bd8  ..@.MZt......[^_ <--- relevant
006a3851  00400000 ffff46e8 74c085ff 003ca1e7  ..@..F.....t..<.
006a38b5  00400000 03745a4d 56c3d089 0000b853  ..@.MZt....VS... <--- relevant
006a38e1  00400000 0000eb81 b70f0040 548d0670  ..@.....@...p..T
006a3925  00400000 03745a4d b8c3d089 00400000  ..@.MZt.......@. <--- relevant
006a3931  00400000 fffe66e8 74c085ff 003ca1ef  ..@..f.....t..<.
006a3955  00400000 8b535a4d 7408244c 5bd0890e  ..@.MZS.L$.t...[ <--- relevant
006a3971  00400000 fffe26e8 74c085ff 003ca1e4  ..@..&.....t..<.
006a39c5  00400000 03745a4d b8c3d089 00400000  ..@.MZt.......@. <--- relevant
006a39d1  00400000 fffdc6e8 b8c085ff 00400000  ..@...........@.
006a39dd  00400000 89d0450f f689c3d0 0027bc8d  ..@..E........'.
006a39f5  00400000 03745a4d 569066c3 0000b853  ..@.MZt..f.VS... <--- relevant
006a3a91  00400000 fffd06e8 74c085ff 003ca1e6  ..@........t..<.
006a3aa5  00400000 0080808b c0850040 b70fd174  ..@.....@...t...
007dfa85  00400000 00448000 003f0000 00000000  ..@...D...?.....
007fffe1  00400000 003f0000 ffffc000 1641dfff  ..@...?.......A.
009e0045  00400000 00000000 11001000 953e16a5  ..@...........>.


在查看与所有相关结果的反汇编时,我大多看到以下指令:

cmp word ptr [image00400000 (00400000)],5A4Dh


我已经在其他EXE中看到了类似的内存引用,但是我还没有看到Visual Studio产生这种代码(并且我对由Visual Studio和没有看到这些特定的内存引用),所以我想说的是,如果您看到类似上面的代码,则几乎可以肯定是在处理由GCC编译的EXE。