Подтвердить что ты не робот

Как определить, является ли файл EXE или DLL?

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

У них обоих есть точки входа и все...

4b9b3361

Ответ 1

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

И затем посмотрите раздел о 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

Эта информация находится в заголовке PE. Чтобы просмотреть его, вы можете открыть его с помощью PE-проводника, такого как NTCore CFF Explorer и открыть поле Characterics в заголовке файла, где вы можете найти, является ли это DLL или исполняемым файлом.

enter image description here

Ответ 3

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

            }
        }
    }

Ответ 4

dumpbin *.* | grep "File Type"

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

Ответ 5

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