처음에는 DOS(16비트) 실행 파일과 Windows(32/64비트) 실행 파일을 구별하는 프로그램을 만들려고 했습니다.
나는 실행 파일이 처음 2바이트를 기준으로 분류될 수 있다는 다른 답변을 읽었습니다. (MZ/...)
하지만 수동으로 몇 가지 실행 파일(16비트 및 32/64비트 모두)을 비교해 보니 모두 MZ로 시작하는 것으로 나타났습니다.
이유가 있는 걸까요, 아니면 제가 뭔가 잘못하고 있는 걸까요?
16비트 실행 파일은 내가 어셈블리에서 작성하고 TASM을 사용하여 컴파일했으며 32/64비트 실행 파일은 내 컴퓨터의 시스템 파일에서 가져왔습니다.C:\Windows\System32
실행 파일을 구별하는 더 정확한 방법이 있습니까?
답변1
나는 그들이 모두 다음과 같이 시작했다는 것을 알았습니다.MZ
MZ
실제로 파일의 특징적인 서명입니다 .exe
.
DOS MZ 실행 파일 형식은 DOS에서 .EXE 파일에 사용되는 실행 파일 형식입니다.
파일은 파일 시작 부분("매직 넘버")에 있는 ASCII 문자열 "MZ"(16진수: 4D 5A)로 식별할 수 있습니다. "MZ"는 MS-DOS의 주요 개발자 중 한 명인 Mark Zbikowski의 이니셜입니다.
이 서명은 나중에 해당 하위 항목(NE 및 PE 포함)으로 확장되었습니다.
새 실행 파일(NE 또는 NewEXE로 약칭)은 DOS MZ 실행 파일 형식의 후속인 16비트 .exe 파일 형식입니다. Windows 1.0-3.x, 멀티태스킹 MS-DOS 4.0,[1] OS/2 1.x 및 Windows NT 버전 5.0(Windows 2000)까지의 OS/2 하위 집합에서 사용되었습니다. NE는 분할 실행 파일이라고도 합니다.
PE(Portable Executable) 형식은 32비트 및 64비트 버전의 Windows 운영 체제에서 사용되는 실행 파일, 개체 코드, DLL 및 기타 파일 형식입니다. PE 형식은 Windows OS 로더가 래핑된 실행 코드를 관리하는 데 필요한 정보를 캡슐화하는 데이터 구조입니다. 여기에는 연결을 위한 동적 라이브러리 참조, API 내보내기 및 가져오기 테이블, 리소스 관리 데이터 및 TLS(스레드 로컬 스토리지) 데이터가 포함됩니다. NT 운영 체제에서는 PE 형식이 EXE, DLL, SYS(장치 드라이버) 및 기타 파일 형식에 사용됩니다. EFI(Extensible Firmware Interface) 사양에는 PE가 EFI 환경의 표준 실행 파일 형식이라고 명시되어 있습니다.
Windows NT 운영 체제에서 PE는 현재 IA-32, IA-64, x86, x86-64(AMD64/Intel 64), ARM 및 ARM64 명령어 세트 아키텍처(ISA)를 지원합니다. Windows 2000 이전에는 Windows NT(및 PE)가 MIPS, Alpha 및 PowerPC ISA를 지원했습니다. PE는 Windows CE에서 사용되기 때문에 MIPS, ARM(Thumb 포함) 및 SuperH ISA의 여러 변형을 계속 지원합니다.
So는 MZ
16, 32, 64비트 .exe
서명에 사용되며 16비트와 32/64비트 프로그램을 구별하는 데 사용할 수 없습니다.
그렇다면 16비트 프로그램과 32/64비트 프로그램을 어떻게 구별합니까?
Windows는 기존 DOS 실행 파일 형식을 여러 번 확장했으므로 '최신' Windows 실행 파일을 보면 시작 부분 바로 근처에 MZ(또는 실행 파일이 반대 비트 순서를 사용하는 시스템용인 경우 ZM)가 있을 수 있습니다. . 이는 간단히 MZ 형식으로 알려진 두 번째 DOS 실행 파일 형식의 헤더를 지정합니다.
그 외에도 '이 프로그램은 DOS 모드에서 실행할 수 없습니다.'라는 문구와 함께 명백한 횡설수설을 보게 될 것입니다. 그 횡설수설은 실제로 사용자에게 해당 프로그램을 DOS에서 실행할 수 없다는 메시지를 인쇄하는 매우 간단한 DOS 프로그램입니다.
그 다음에는 NE, LX, LE 또는 PE의 네 쌍의 문자 중 하나로 시작할 수 있는 실제 실행 파일의 헤더가 있습니다. 이들 중 하나와 위에서 언급한 메시지가 표시되지 않으면 16비트 DOS 응용 프로그램입니다.
원천Windows에서 바이너리가 16비트인지 확인하는 방법, 답변오스틴 헤멜가른
또한 Unix file
명령(Cygwin 및Linux용 Windows 하위 시스템:
예:
C:\Program Files\GnuWin32\bin>file "C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE" C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE; PE32 executable for MS Windows (GUI) Intel 80386 32-bit
나는 그것이 16비트 실행 파일일 때 MS-DOS나 Win 3.X 실행 파일과 같은 것을 의미한다고 믿습니다.
원천해결 방법: 16/32/64비트 .exe 파일을 구별하는 팁이나 도구는 무엇입니까? | 기술 지원 담당자
위 링크에는 사용할 수 있는 소스 코드(C와 유사)도 포함되어 있습니다.