본문 바로가기
모든 이야기 모든 이야기

실행 파일(.exe, .dll)은 텍스트 에디터로 열면 왜 외계어로 보일까? PE(Portable Executable) 헤더와 기계어 바이너리 구조

읽는 시간 약 8분

실행 파일을 텍스트 에디터로 열면 왜 외계어가 보일까

컴퓨터를 사용하다 보면 호기심에 .exe나 .dll 파일을 메모장으로 열어본 경험이 한 번쯤 있을 것입니다. 파일을 여는 순간 화면에는 알 수 없는 기호와 깨진 글자들, 이른바 외계어가 가득 차오릅니다. 왜 이런 현상이 발생하는 것일까요? 이는 컴퓨터가 정보를 처리하는 방식과 인간이 언어를 사용하는 방식의 차이 때문입니다.

우리가 작성하는 문서나 코드는 ‘텍스트’ 기반입니다. 하지만 컴퓨터의 CPU는 텍스트를 직접 이해하지 못합니다. CPU는 0과 1로 이루어진 ‘기계어’만을 이해할 수 있습니다. 실행 파일은 개발자가 작성한 소스 코드를 컴파일러라는 도구를 통해 CPU가 즉시 실행할 수 있는 바이너리 형태로 변환한 결과물입니다. 따라서 텍스트 에디터는 이 바이너리 데이터를 억지로 텍스트로 해석하려고 시도하며, 그 과정에서 의미 없는 문자들이 출력되는 것입니다.

PE 헤더의 역할과 구조 이해하기

윈도우 운영체제에서 실행 파일이나 라이브러리 파일은 PE(Portable Executable)라는 정형화된 형식을 따릅니다. 이 형식은 운영체제가 파일을 메모리에 올리고 실행하기 위해 필요한 일종의 ‘지도’와 같습니다. PE 파일은 크게 세 부분으로 나뉩니다.

  • DOS 헤더: 파일의 가장 앞부분에 위치하며, 아주 오래전 DOS 운영체제와의 호환성을 위해 존재합니다.
  • PE 헤더: 파일의 핵심 정보가 담겨 있습니다. 실행 파일이 어떤 환경에서 돌아가야 하는지, 어떤 라이브러리를 필요로 하는지, 코드 영역은 어디서 시작되는지 등의 정보가 기록되어 있습니다.
  • 섹션 데이터: 실제 실행 코드(Text 섹션), 데이터(Data 섹션), 리소스(Resource 섹션) 등이 저장되는 공간입니다.

우리가 텍스트 에디터로 파일을 열었을 때 맨 앞에 보이는 ‘MZ’라는 두 글자는 바로 DOS 헤더의 시작을 알리는 시그니처입니다. 이는 마크 즈비코프스키(Mark Zbikowski)라는 개발자의 이니셜에서 따온 것으로, 윈도우 실행 파일임을 나타내는 일종의 약속입니다.

바이너리 데이터를 분석하는 실용적인 방법

텍스트 에디터는 바이너리 파일을 읽는 데 적합하지 않습니다. 대신 ‘헥사 에디터(Hex Editor)’라는 도구를 사용해야 합니다. 헥사 에디터는 데이터를 16진수(Hexadecimal) 형태로 보여주어, 파일의 구조를 눈으로 확인할 수 있게 해줍니다. 대표적인 무료 도구로는 HxD, 010 Editor 등이 있습니다.

헥사 에디터 활용 팁

  • 파일 서명 확인: 파일의 확장자가 바뀌어 있어도 헥사 에디터로 앞부분을 보면 실제 파일의 종류(JPEG, PDF, EXE 등)를 파악할 수 있습니다.
  • 문제 해결: 특정 프로그램이 실행되지 않을 때, 파일의 헤더 부분이 손상되었는지 확인하는 용도로 사용할 수 있습니다.
  • 데이터 복구: 실수로 삭제하거나 깨진 파일에서 의미 있는 문자열(문장, 경로, 도메인 주소 등)을 추출해낼 수 있습니다.

흔한 오해와 진실

많은 사람이 바이너리 파일을 텍스트 에디터로 열어보고는 “이걸 수정하면 프로그램을 해킹할 수 있지 않을까?”라고 생각합니다. 하지만 이는 매우 어려운 일입니다. 기계어는 CPU의 명령어 세트와 직접 연결되어 있어, 한 바이트만 잘못 수정해도 프로그램 전체가 멈추거나 충돌합니다. 또한 최신 프로그램들은 디지털 서명과 무결성 검사 기능을 갖추고 있어, 파일이 조금이라도 변조되면 아예 실행되지 않도록 설계되어 있습니다.

또 다른 오해는 ‘모든 외계어가 의미 없는 데이터’라는 생각입니다. 사실 헥사 에디터로 열어보면 오른쪽 영역에 ASCII 코드로 해석 가능한 문자열들이 나타납니다. 프로그램 내부에 포함된 오류 메시지, 개발자의 이름, 파일 경로, 웹사이트 주소 등은 암호화되지 않은 상태라면 그대로 읽을 수 있습니다. 정보 보안 분야에서는 이러한 문자열을 추출하여 프로그램의 기능을 유추하는 ‘문자열 분석’을 수행하기도 합니다.

전문가의 관점에서 본 실행 파일 분석

보안 전문가나 리버스 엔지니어링 실무자들은 실행 파일을 분석할 때 헥사 에디터뿐만 아니라 더 정교한 도구들을 사용합니다. PE 구조를 시각적으로 보여주는 ‘PE View’나 ‘CFF Explorer’ 같은 도구는 복잡한 헤더 정보를 표 형태로 깔끔하게 정리해 줍니다.

전문가들은 다음과 같은 단계를 통해 파일을 분석합니다:

    • 정적 분석: 파일을 실행하지 않고 구조와 포함된 문자열, 임포트 함수(프로그램이 사용하는 외부 기능)를 확인합니다.
    • 동적 분석: 가상 환경에서 프로그램을 직접 실행하며 메모리의 변화와 네트워크 통신을 관찰합니다.
    • 디스어셈블 및 디컴파일: 기계어를 어셈블리어로 변환하거나, 더 나아가 C 언어와 유사한 형태로 변환하여 로직을 파악합니다.

일반 독자라면 이러한 도구들을 활용해 보는 것만으로도 컴퓨터가 파일을 어떻게 다루는지 깊이 이해할 수 있습니다. 특히 ‘Dependency Walker’ 같은 도구를 사용하면 해당 프로그램이 윈도우의 어떤 시스템 DLL을 가져다 쓰는지 확인할 수 있어, 프로그램 오류 해결에 큰 도움이 됩니다.

자주 묻는 질문과 답변

Q: 텍스트 에디터로 파일을 열었다가 다시 저장하면 파일이 망가지나요?

A: 네, 그렇습니다. 텍스트 에디터는 파일의 인코딩을 강제로 변환하거나, 줄 바꿈 문자를 삽입하는 등 바이너리 데이터의 형식을 파괴할 가능성이 매우 높습니다. 절대 실행 파일을 텍스트 에디터로 수정하고 저장하지 마세요.

Q: 왜 어떤 파일은 텍스트 에디터로 열면 내용이 보이고 어떤 건 완전히 깨지나요?

A: 파일 내부에 포함된 텍스트 데이터의 비중과 압축/암호화 여부에 따라 다릅니다. 실행 파일이 ‘패킹(Packing)’되어 있다면, 파일 전체가 압축되어 있어 거의 모든 부분이 의미 없는 데이터로 보입니다. 반면 간단한 유틸리티나 설정 파일은 내부 문자열이 그대로 노출되기도 합니다.

Q: PE 헤더를 공부하면 프로그래밍 실력 향상에 도움이 될까요?

A: 직접적인 코딩 실력보다는 운영체제의 동작 원리를 이해하는 데 큰 도움이 됩니다. 프로그램이 메모리에 로드되는 과정과 라이브러리가 연결되는 방식(Linking)을 알게 되면, 메모리 관리나 디버깅 능력이 비약적으로 상승합니다.

비용 효율적인 학습 방법

이 분야를 공부하기 위해 비싼 강의를 들을 필요는 없습니다. 가장 좋은 방법은 직접 실습해보는 것입니다. 윈도우에 기본적으로 포함된 ‘calc.exe(계산기)’나 ‘notepad.exe’를 헥사 에디터로 열어보며 PE 헤더 구조를 인터넷의 무료 강좌와 비교해 보세요. 구글에 ‘PE File Format Specification’이라고 검색하면 마이크로소프트 공식 문서가 나옵니다. 이 문서는 다소 어렵지만, 가장 정확한 교과서입니다.

또한, 리버스 엔지니어링 입문자를 위한 오픈 소스 커뮤니티나 포럼을 활용하세요. ‘Reverse Engineering Stack Exchange’ 같은 곳에서는 전 세계 전문가들이 공유하는 지식을 무료로 얻을 수 있습니다. 호기심을 가지고 작은 파일부터 하나씩 분석해 나가는 과정 자체가 가장 효율적이고 실용적인 학습이 될 것입니다.

seagreen33
함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.

error: Content is protected !!

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.