如何判断文件是EXE还是DLL?

时间:2011-06-10 16:15:21

标签: dll executable file-extension portable-executable

如果你的文件扩展名搞砸了,你怎么能告诉一个可执行文件除了DLL?

他们似乎都有切入点和一切......

5 个答案:

答案 0 :(得分:6)

此信息位于PE标头中。要查看它,可以使用PE浏览器(例如NTCore CFF Explorer)打开它,然后打开文件头的Characterics字段,在那里可以找到它是DLL还是可执行文件。

enter image description here

答案 1 :(得分:6)

如果有兴趣的话,这是C#中的代码,测试32位PE文件。

 public static class PECheck
    {

        public static bool IsDll(Stream stream)
        {

            using (BinaryReader reader = new BinaryReader(stream))
            {

                byte[] header = reader.ReadBytes(2); //Read MZ
                if (header[0] != (byte)'M' && header[1] != (byte)'Z')
                    throw new Exception("Invalid PE file");

                stream.Seek(64 - 4, SeekOrigin.Begin);//read elf_new this is the offset where the IMAGE_NT_HEADER begins
                int offset = reader.ReadInt32();
                stream.Seek(offset, SeekOrigin.Begin);
                header = reader.ReadBytes(2);
                if (header[0] != (byte)'P' && header[1] != (byte)'E')
                    throw new Exception("Invalid PE file");

                stream.Seek(20, SeekOrigin.Current); //point to last word of IMAGE_FILE_HEADER
                short readInt16 = reader.ReadInt16();
                return (readInt16 & 0x2000) == 0x2000;

            }
        }
    }

答案 2 :(得分:5)

查看this article以获取有关Windows上可移植可执行文件的详细说明。

然后查看关于PE头的部分。此外,代码在C中显示了使用Win32打开和检查PE文件的方法。您要查找的信息存储在IMAGE_FILE_HEADER中。特别是在Characteristics字段中,如果它是dll,则会包含标记IMAGE_FILE_DLL 0x2000

这应该为您提供足够的信息来创建一个小实用程序,以确定一堆文件,如果这是您正在寻找的。

用于参考目的的最相关的代码位,从上面的文章复制并编辑以删除无关的细节/错误处理。

void DumpFile(LPWSTR filename)
{
    HANDLE hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

    HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);

    LPVOID lpFileBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);    

    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)lpFileBase;

    PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pDosHeader + (DWORD)pDosHeader->e_lfanew);

    if ((pNTHeader->FileHeader.Characteristics & IMAGE_FILE_DLL))
         printf("dll"); 
    if ((pNTHeader->FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE))
         printf("exe"); 
    else 
         printf("????");

    UnmapViewOfFile(lpFileBase);
    CloseHandle(hFileMapping);
    CloseHandle(hFile);
}

答案 3 :(得分:2)

dumpbin *.* | grep "File Type"

适合我。如果你没有安装grep,我不完全记得要使用什么,但我建议你这样做。

答案 4 :(得分:0)

抓住OllyDbg并在其中打开EXE / DLL。单击顶部的大M按钮打开内存映射。向下滚动,直到找到与您的程序对应的模块的PE头。双击以在内存转储中打开它。向下滚动到您看到PE签名的位置(可能是图像库中的0xF8),如果它是DLL,则Features将在其上显示DLL标志。从PE签名中可以看出一些特征。