使用字符串:如何检索用于编译给定ELF可执行文件的GCC版本?
使用链接器PE标头中的version字段:我可以通过检查DLL本身来判断使用哪个版本的Visual Studio构建DLL吗? / gcc?
例如,是否存在某些字符串,标头值,节,导入等可以使它们彼此区分?确切的编译器版本和使用的编译器标志无关紧要...
我也不希望出现恶意可执行文件。
#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。
评论
也许有帮助:reverseengineering.stackexchange.com/questions/16060/…我宁愿不要依赖外部工具(该工具可能已过期或可能不包含适当的签名)。另外,我不需要确切的版本,只要是gcc或VS,就不需要更一般的信息。
您可以看一下丰富的标题
什么是富标头?
ntcore.com/files/richsign.htm