Как определить, является ли файл EXE или DLL? - PullRequest
13 голосов
/ 10 июня 2011

Если у вас испортились расширения файлов, как вы можете отличить исполняемый файл от DLL?

Кажется, у них обоих есть точки входа и все ...

Ответы [ 5 ]

6 голосов
/ 10 июня 2011

, если кому-то интересно, это код на 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;

            }
        }
    }
6 голосов
/ 10 июня 2011

Эта информация находится в заголовке PE.Чтобы просмотреть его, вы можете открыть его с помощью PE Explorer, такого как NTCore CFF Explorer , и открыть поле «Характеристики» заголовка файла, где вы можете найти, является ли это DLL или исполняемым файлом.1004 *enter image description here

5 голосов
/ 10 июня 2011

Посмотрите на в этой статье для хорошего объяснения переносимого исполняемого файла на windows.

А затем посмотрите на раздел о заголовке PE.Кроме того, код в C показывает способ открытия и проверки PE-файла с помощью Win32.Эта информация, которую вы ищете, хранится в IMAGE_FILE_HEADER .В частности, в поле Characteristics, которое будет включать флаг IMAGE_FILE_DLL 0x2000, если это dll.

Это должно дать вам достаточно информации для создания небольшой утилиты, которая определяет кучу файлов, если этото, что вы ищете.

Наиболее важные фрагменты кода для справочных целей, скопированы из статьи выше и отредактированы для удаления посторонних деталей / обработки ошибок.

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);
}
2 голосов
/ 10 июня 2011
dumpbin *.* | grep "File Type"

У меня работает. Я точно не помню, что использовать, если у вас не установлен grep, но я советую вам это сделать.

0 голосов
/ 10 июня 2011

Возьмите OllyDbg и откройте в нем EXE / DLL.Поднимите карту памяти, нажав большую кнопку М в верхней части.Прокрутите вниз, пока не найдете PE-заголовок модуля, который соответствует вашей программе.Дважды щелкните, чтобы открыть его в дамп памяти.Прокрутите вниз до того места, где вы видите подпись PE (вероятно, 0xF8 от базы изображений), и если это DLL, то у характеристик будет флаг DLL.Характеристики должны быть в нескольких шагах от подписи PE.

...