programing

Windows DLL 파일을 테스트하여 32비트인지 64비트인지 확인하려면 어떻게 해야 합니까?

randomtip 2023. 5. 21. 15:14
반응형

Windows DLL 파일을 테스트하여 32비트인지 64비트인지 확인하려면 어떻게 해야 합니까?

특정 디렉토리의 모든 DLL 파일이 특정 빌드 유형이라고 주장하는 테스트 스크립트 또는 프로그램을 작성하려고 합니다.

이를 SDK 빌드 프로세스가 끝날 때 건전성 검사로 사용하여 64비트 버전에 32비트 DLL 파일이 없는지 확인하고 그 반대의 경우도 마찬가지입니다.

DLL 파일을 보고 유형을 쉽게 확인할 수 있는 방법이 있습니까?

이 솔루션은 xp32와 xp64 모두에서 작동해야 합니다.

대략적인 방법은 각 DLL의 Visual Studio 도구에서 헤더 옵션을 사용하여 덤프빈을 호출하고 적절한 출력을 찾는 것입니다.

dumpbin/down my32bit.dll
PE 서명을 찾았습니다.
파일 형식: DLL
파일 헤더 값14C 기계(x86)섹션 수 1개45499E0A 날짜 스탬프 2006년 11월 02일 03:28:10기호 테이블에 대한 0 파일 포인터기호 0개선택적 헤더의 E0 크기2102 특성실행 파일32비트 워드머신DLL
선택적 헤더 값10B 매직 # (PE32)

이 출력에서 폴이 언급한 14C 값을 포함하여 32비트 DLL이라는 몇 가지 단서를 볼 수 있습니다.스크립트에서 찾기 쉬울 것입니다.

Cygwin(또는 MobaXTerm, Git Bash for Windows, WSL, 또는...)이 설치되어 있으면 DLL에서 '파일' 유틸리티를 사용할 수 있습니다.

file <filename>

이는 다음과 같은 출력을 제공합니다.

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

코리상세

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

개요는 PE 파일 형식에 대한 MSDN 문서를 참조하십시오.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의 서명을 확인하여 나중에 변경될 사항이 있는지 확인하는 것이 좋습니다.

이미지 사용머리글 읽기 도움말...

이미지를 사용할 수도 있습니다.API가 이를 수행하도록 도와줍니다. LoadImage로 DLL을 로드하면 IMAGE_NT_HEADERS 구조에 대한 포인터를 포함하는 LOADDED_IMAGE 구조를 얻을 수 있습니다.ImageUnload를 사용하여 LOADED_IMAGE의 할당을 해제합니다.

...또는 이 거친 Perl 스크립트를 조정합니다.

다음은 작업을 수행하는 대략적인 Perl 스크립트입니다.파일에 DOS 헤더가 있는지 확인한 다음 IMAGE_DOS_HEADER에서 PE 오프셋 60바이트를 파일로 읽어 들입니다.

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

Dependency Walker는 (거의) 모든 것을 말해줍니다.http://www.dependencywalker.com/

"설치"하지 않습니다. 가져오기만 하면 압축을 풀고 Exec을 실행할 수 있습니다.모든 x32 또는 x64 윈도우 모듈/응용 프로그램에 사용할 수 있습니다.

제 기억으로는 dll 모듈과 appl 이후의 모든 종속성을 보는 것은 매우 간단합니다.는 완전한 x64, x32(x86) 또는 각각의 일부인지 확인할 수 있는 종속성의 합입니다.

모듈이 구축된 CPU의 유형은 "CPU" 열에 있습니다.대부분의 64비트 aps는 여전히 32비트 ap/ball x86을 제외하고 각각의 일부입니다.

괴짜/프로그래머들을 위한 아름다운 프로그램이며 무료입니다.

저는 그것을 정확히 수행하는 매우 간단한 도구를 썼습니다 - 그것은 PE 디스트럭터라고 불립니다.

DLL 파일을 로드하고 부팅하기만 하면 됩니다.

여기에 이미지 설명 입력

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

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

이전 32비트 버전은 다음 사이트에서 사용할 수 있습니다.
https://dl.dropbox.com/u/31080052/pedeconstructor.zip

언급URL : https://stackoverflow.com/questions/495244/how-can-i-test-a-windows-dll-file-to-determine-if-it-is-32-bit-or-64-bit

반응형