PEiD 等工具如何找出编译器及其版本。

逆向工程 视窗 恶意软件 聚乙烯 可执行
2021-06-25 06:46:12

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

我正在分析一个可执行文件。其中显示:Borland Delphi 3.0 在此处输入图片说明

但是部分名称为 .text .rsrc。这通常不是由 Borland Delphi 编译器生成的。 在此处输入图片说明

我猜文件版本信息被修改了。

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

1个回答

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

通常,检测器执行非常简单的检查,以检测基于预设字节掩码的编译器/链接器/保护器/等。掩码由字节序列和通配符组合而成,通配符通常表示一个幻数、一段代码或提供有关文件信息的字符串。

为了更好地理解它,让我们看看不同检测器对 Borland 3.0 的不同检测。

代号

[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.xml/Signatures/IMAGE_FILE_MACHINE_I386.xml 中找到CFF 资源管理器的签名数据库,尽管它可能在您的安装中有所不同。您也可以在此处在线查找 阅读此 PDF以获取有关签名以及如何在CFF Explorer 中使用的更多技术信息

轻松检测:

Detect It Easy是更复杂、更丰富和更准确的检测器(在我看来),它使用“脚本”来检测程序的类型。DIE的检测算法比其他算法更复杂,并且不只使用字节掩码来检测编译器/链接器/打包器等。
您可以以下签名中看到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$$$$$$$$5d4555c3")))
    {
        bDetected=1;
    } */

    return result(bShowType,bShowVersion,bShowOptions);
}

您可以在其Github 存储库中阅读有关Detect it Easy 的更多信息


请记住,大多数情况下,二进制文件中表示文件类型的字节可以被替换,而不会损害程序的功能。甚至还有很多像GcPHPseudoSignerDotFix FakeSigner这样的程序试图欺骗像上面提到的 Packer Detectors。一些检测器实际上可能会在看起来像猫捉老鼠的游戏中检测到这些反检测器中的一些。

以下是 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