내가 읽은 모든 실행 파일은 MZ [중복] 헤더로 시작됩니다.

내가 읽은 모든 실행 파일은 MZ [중복] 헤더로 시작됩니다.

처음에는 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의 이니셜입니다.

원천DOS MZ 실행 파일 - Wikipedia

이 서명은 나중에 해당 하위 항목(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는 분할 실행 파일이라고도 합니다.

원천새로운 실행 파일 - Wikipedia

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의 여러 변형을 계속 지원합니다.

원천휴대용 실행 파일 - Wikipedia

So는 MZ16, 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 및:

예:

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와 유사)도 포함되어 있습니다.

관련 정보