Как я могу протестировать файл Windows DLL, чтобы определить, являются ли это 32 бита или 64 бита? [дубликат]

Я пришел, чтобы ответить сам.

Если это может кому-нибудь помочь:

Я добавил в свой MainWindow.cs:

public delegate void updateNetworkButtonDelegate(string message);
public void updateNetworkButton(string message)
{
    if (!test_btn.Dispatcher.CheckAccess())
    {
        test_btn.Dispatcher.Invoke(new updateNetworkButtonDelegate(updateNetworkButton), message);
    }
    else
    {
       test_btn.Content = message;
    }
}

}

Я изменил свой TcpClient, чтобы передать Главное окно в параметре:

 public static void StartClient(MainWindow mw)

, тогда я мог бы обновить свою кнопку с помощью:

mw.updateNetworkButton (response);

255
задан Peter Mortensen 6 January 2017 в 13:09
поделиться

3 ответа

Окровавленные детали

А, DLL использует формат исполняемых файлов PE, и это не слишком хитро для чтения той информации из файла.

Посмотрите этот статья MSDN о Формате файла PE для обзора. Необходимо прочитать заголовок MS-DOS, затем читать структура IMAGE_NT_HEADERS . Это содержит структура IMAGE_FILE_HEADER , которая содержит информацию, в которой Вы нуждаетесь в участнике Машины, который содержит одно из следующих значений

  • IMAGE_FILE_MACHINE_I386 (0x014c)
  • IMAGE_FILE_MACHINE_IA64 (0x0200)
  • IMAGE_FILE_MACHINE_AMD64 (0x8664)

, Эта информация должна быть при фиксированном смещении в файле, но я все еще рекомендовал бы пересечь файл и проверить подпись заголовка MS-DOS и IMAGE_NT_HEADERS, чтобы быть уверенным, что Вы справляетесь с любыми будущими изменениями.

Использование ImageHelp для чтения заголовков...

можно также использовать ImageHelp API, чтобы сделать, это - загружает DLL LoadImage, и Вы доберетесь структура LOADED_IMAGE , которая будет содержать указатель на структуру IMAGE_NT_HEADERS. Освободите LOADED_IMAGE с ImageUnload.

... или адаптируются, этот грубый сценарий

Perl Вот грубый сценарий Perl, который сделал задание. Это проверяет, что файл имеет заголовок DOS, затем читает смещение PE из 60 байтов IMAGE_DOS_HEADER в файл.

Это затем ищет на запуск части PE, читает подпись и проверяет его и затем извлекает значение, которым мы интересуемся.

#!/usr/bin/perl
#
# usage: petype <exefile>
#
$exe = $ARGV[0];

open(EXE, $exe) or die "can't open $exe: $!";
binmode(EXE);
if (read(EXE, $doshdr, 64)) {

   ($magic,$skip,$offset)=unpack('a2a58l', $doshdr);
   die("Not an executable") if ($magic ne 'MZ');

   seek(EXE,$offset,SEEK_SET);
   if (read(EXE, $pehdr, 6)){
       ($sig,$skip,$machine)=unpack('a2a2v', $pehdr);
       die("No a PE Executable") if ($sig ne 'PE');

       if ($machine == 0x014c){
            print "i386\n";
       }
       elsif ($machine == 0x0200){
            print "IA64\n";
       }
       elsif ($machine == 0x8664){
            print "AMD64\n";
       }
       else{
            printf("Unknown machine type 0x%lx\n", $machine);
       }
   }
}

close(EXE);
106
ответ дан phuclv 23 November 2019 в 02:46
поделиться

Сырой путь состоял бы в том, чтобы назвать dumpbin с опцией заголовков от инструментов Visual Studio на каждом DLL и искать соответствующий вывод:

dumpbin /headers my32bit.dll

PE signature found

File Type: DLL

FILE HEADER VALUES
             14C machine (x86)
               1 number of sections
        45499E0A time date stamp Thu Nov 02 03:28:10 2006
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
            2102 characteristics
                   Executable
                   32 bit word machine
                   DLL

OPTIONAL HEADER VALUES
             10B magic # (PE32)

Вы видите пару подсказок в том выводе, что это - DLL на 32 бита, включая 14C оценивают того Paul упоминания. Должно быть легко искать в сценарии.

163
ответ дан Jeremy 23 November 2019 в 02:46
поделиться

Если Вы имеете установленный Cygwin (который я настоятельно рекомендую по ряду причин), Вы могли использовать утилиту 'файла' на DLL

file <filename>

, который даст вывод как это:

icuuc36.dll: MS-DOS executable PE  for MS Windows (DLL) (GUI) Intel 80386 32-bit
109
ответ дан user2441511 23 November 2019 в 02:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: