windows - 파일 - 윈도우10 32비트 64비트 확인




Windows DLL 파일이 32 비트인지 64 비트인지 판별하려면 어떻게합니까? (4)

피투성이 세부 정보

DLL은 PE 실행 형식을 사용하며 파일에서 해당 정보를 읽는 것이 너무 까다 롭지 않습니다.

개요 는 PE 파일 형식에 대한 MSDN 문서를 참조하십시오. MS-DOS 헤더를 읽은 다음 IMAGE_NT_HEADERS 구조체를 읽어야합니다. 여기에는 다음 값 중 하나를 포함하는 Machine 구성원에 필요한 정보가 들어있는 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 를 사용하여 LoadImage DLL을로드하면 IMAGE_NT_HEADERS 구조체에 대한 포인터를 포함하는 LOADED_IMAGE 구조체가 생성됩니다. ImageUnload를 사용하여 LOADED_IMAGE의 할당을 해제합니다.

...이 거친 Perl 스크립트를 수정하거나

여기에 일을 끝내는 펄 스크립트가 있습니다. 파일에 DOS 헤더가 있는지 확인한 후 IMAGE_DOS_HEADER에서 60 바이트의 PE 오프셋을 파일로 읽습니다.

그런 다음 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);

이 질문에는 이미 답변이 있습니다.

주어진 디렉토리에있는 모든 DLL 파일이 특정 빌드 유형임을 주장하는 테스트 스크립트 나 프로그램을 작성하고 싶습니다.

SDK의 빌드 프로세스 마지막 단계에서 64 비트 버전에 일부 32 비트 DLL 파일이 있거나 그 반대로 설치되어 있지 않은지 확인하기 위해 위와 같이 사용합니다.

DLL 파일을보고 형식을 결정하는 쉬운 방법이 있습니까?

해결책은 xp32와 xp64 모두에서 작동해야합니다.


드문 경우지만 각 DLL의 Visual Studio 도구에서 헤더 옵션을 사용하여 dumpbin을 호출하고 적절한 출력을 찾습니다.

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)

이 출력에서 ​​Paul이 언급 한 14C 값을 포함하여 32 비트 DLL이라는 몇 가지 단서를 볼 수 있습니다. 스크립트에서 쉽게 찾을 수 있어야합니다.


필자는 PE Deconstructor라고하는 매우 간단한 도구를 작성했습니다.

단순히 파일을 실행하고 DLL 파일을로드하십시오.

위의 예제에서로드 된 DLL은 32 비트입니다.

여기에서 다운로드 할 수 있습니다 (필자는 64 비트 버전의 ATM 만 컴파일했습니다).
http://files.quickmediasolutions.com/exe/pedeconstructor_0.1_amd64.exe

이전 버전의 32 비트 버전을 사용할 수 있습니다.
http://dl.dropbox.com/u/31080052/pedeconstructor.zip


Cygwin을 설치했다면 (나는 여러 가지 이유로 강력하게 추천한다.) DLL에서 'file'유틸리티를 사용할 수있다.

file <filename>

그러면 다음과 같은 결과가 나옵니다.

icuuc36.dll: MS-DOS executable PE  for MS Windows (DLL) (GUI) Intel 80386 32-bit






32bit-64bit