PEiD和CFF Explorer等工具如何找到编译器及其版本。

我正在分析一个可执行文件。其中显示:Borland Delphi 3.0


但该节的名称为.text .rsrc。 Borland Delphi编译器通常不会生成该文件。


我想文件版本信息已修改。

但是这些工具如何找出编译器版本?

#1 楼

许多Compiler和Packer检测器的签名数据库,有时甚至是其源代码,都是免费提供的,您实际上可以以明文形式阅读签名。

通常,检测器会执行非常幼稚的检查,以基于预设的字节掩码检测编译器/链接器/保护器/等。掩码是由一系列字节和通配符组合而成的,通常代表一个魔术数字,一段代码或一个字符串,提供有关文件的信息。 Borland 3.0通过不同的检测器。

PEiD:

[Borland Delphi v3.0]
signature = 50 6A ?? E8 ?? ?? FF FF BA ?? ?? ?? ?? 52 89 05 ?? ?? ?? ?? 89 42 04 E8 ?? ?? ?? ?? 5A 58 E8 ?? ?? ?? ?? C3 55 8B EC 33 C0
ep_only = true


为了检测Borland Delphi v3.0,PEiD正在搜索以下序列二进制文件的入口点中的字节。 '??'是通配符,用于忽略这些位置中的字节,因为它们在不同的二进制文件中可能不相同。


您可以在此处找到PEiD的数据库。


CFF资源管理器:

<ENTRY>
    <NAME>Borland Delphi v3.0</NAME>
    <COMMENTS />
    <ENTRYPOINT>506A??E8????FFFFBA????????528905????????894204E8????????5A58E8????????C3558BEC33C0</ENTRYPOINT>
    <ENTIREPE />
</ENTRY>


尽管签名的格式可能看起来与PEiD的格式不同,但它实际上与前面的示例相同。


通常,您可以在以下路径C:\ Users \ Public \ Documents \ Explorer
Suite \ Signatures \ IMAGE_FILE_MACHINE_I386中找到CFF Explorer的签名数据库。 xml或/Signatures/IMAGE_FILE_MACHINE_I386.xml中,尽管它在您的安装中可能有所不同。您也可以在这里在线找到它。阅读此PDF以获取有关
签名以及如何在CFF Explorer中使用签名的更多技术信息。


Detect It Easy:

Detect It Easy是更复杂,更丰富,更准确的检测器(我认为),它使用“脚本”来检测程序的类型。 DIE的检测算法比其他方法更复杂,并且不仅仅使用字节掩码来检测Compiler / Linker / Packer / etc。
您可以在以下签名中看到DIE如何检测Borland Delphi。

Borland Delphi的签名太长,因此在这里我将展示另一个签名示例,即NTKrnl Protector的签名:

// DIE's signature file

init("protector","NTkrnl Protector");

function detect(bShowType,bShowVersion,bShowOptions)
{
    if(PE.compareEP("68........e8")&&(PE.nLastSection>=1))
    {
        if(PE.getNumberOfImports()==1)
        {
            if(PE.getNumberOfImportThunks(0)==2)
            {
                if((PE.getImportFunctionName(0,0)=="LoadLibraryA")&&(PE.getImportFunctionName(0,1)=="GetProcAddress"))
                {
                    if(PE.isSignatureInSectionPresent(1,"'http://www.ntcore.com  '"))
                    {
                        sVersion="0.1";
                        bDetected=1;
                    }
                    else if(PE.isSignatureInSectionPresent(1,"'http://www.ntkrnl.com'"))
                    {
                        sVersion="0.15";
                        bDetected=1;
                    }
                    /* if(bDetected)
                    {
                        var nFind=PE.findString(PE.section[1].FileOffset,PE.section[1].FileSize,"Version ");
                        if(nFind!=-1)
                        {
                            sVersion=PE.getString(nFind,20);
                            var aVersion=sVersion.match(/Version ?(.*?) /);
                            sVersion=aVersion[1];
                        }
                    } */
                }

            }
        }
    }
    /*if(PE.compareEP("68........e8........c3")&&(PE.compareEP("68########60e8$$$$$$$d4555c3")))
    {
        bDetected=1;
    } */

    return result(bShowType,bShowVersion,bShowOptions);
}



您可以阅读有关在Github存储库中轻松检测它的更多信息。请记住,在大多数情况下,代表文件类型的二进制字节可以是替换而不损害程序功能。甚至还有许多程序,例如GcPH,PseudoSigner和DotFix FakeSigner,它们都试图像上面提到的那样欺骗Packer Detector。一些探测器实际上可能在看似猫捉老鼠的游戏中探测到其中的一些反探测器。

下面是PEiD如何检测Delphi 3.0的PseudoSigner的示例:

[PseudoSigner 0.1 [Borland Delphi 3.0]
signature = 55 8B EC 83 C4 90 90 90 90 68 ?? ?? ?? ?? 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
ep_only = true


评论


一个不错的答案,那里有一个附加的msvc编译器版本可以通过标头中嵌入的RICH签名检测到,您可能会在此找到有关daniel pistellis的文章

– blabb
17年8月11日在8:56