기타 개발

실행파일(.exe) 소스 코드 추출 하기 -2-

Drider 2026. 5. 23. 14:54

1. exe 내의 소스 코드를 본다?

 

 

실행 파일(.exe)은 이미 컴파일되어 기계어로 변환된 상태이기 때문에, 작성자가 처음에 쓴 원본 소스 코드(C++, Rust, Go 등)를 100% 그대로 완벽하게 복구하는 것은 불가능에 가깝다.

하지만 역공학(Reverse Engineering) 도구를 사용하여 코드를 분석하거나 비슷한 수준의 소스 코드로 복원할 수는 있다. 프로그램이 어떤 언어/프레임워크로 제작되었느냐에 따라 방법이 달라진다.


1. 프로그램 종류 파악 (블로그 -1- 글 참조)

먼저 해당 .exe 파일이 무엇으로 만들어졌는지 확인.

  • 도구: Detect It Easy (DIE) 또는 Exeinfo PE
  • 이 도구들을 사용하면 해당 파일이 .NET(C#), C++, Python, Delphi 등 무엇으로 만들어졌는지 알려준다.

2. 언어별 소스 코드 보기 (디컴파일)

① C#, VB.NET (가장 복구율이 높음)

이 언어들은 중간 언어(MSIL)를 사용하기 때문에 거의 원본에 가까운 소스 코드를 얻을 수 있다.

  • 도구: dnSpy, ILSpy
  • 방법: 프로그램을 실행하고 .exe 파일을 끌어다 놓으면 클래스, 함수, 변수명까지 상세히 볼 수 있다.

② Java (JAR을 EXE로 만든 경우)

  • 도구: jd-gui, jadx
  • 방법: Java 코드로 복원해 주며 가독성이 매우 좋다.

③ Python (PyInstaller 등으로 만든 경우)

  • 도구: pyinstxtractor, uncompyle6 또는 decompyle3
  • 방법: .exe에서 파이썬 바이트코드(.pyc)를 추출한 뒤, 이를 다시 .py 소스 파일로 변환한다.

④ Native 언어 (C, C++, Rust, Go, Delphi 등)

가장 어려운 경우. 코드가 완전히 기계어로 번역되어 소스 코드가 존재하지 않고, 어셈블리어로 변환된다.

  • 디컴파일러(그나마 소스 형태로 보여줌):
    • Ghidra: NSA(미국 국가안보국)에서 만든 무료 오픈소스 도구. C 언어 형태로 코드를 재구성해주는 강력한 'Decompiler' 기능을 갖추고 있다.
    • IDA Pro: 업계 표준이지만 고가다. (무료 버전인 IDA Free도 존재)
  • 디버거(실행 과정을 분석): x64dbg, OllyDbg

3. 웹 기반 기술 (Electron, NW.js 등)

최근 Discord나 Slack처럼 웹 기술로 만든 프로그램은 소스 코드가 내부에 묶여 있다.

  • 도구: asar (Node.js 패키지 관리 도구)
  • 방법: app.asar 같은 파일의 압축을 풀면 JavaScript, HTML, CSS 소스 코드를 직접 볼 수 있다.

주의사항 (중요)

  1. 난독화(Obfuscation): 개발자가 코드를 읽기 어렵게 꼬아 놓았다면(난독화 처리), 소스를 봐도 a, b, c 같은 의미 없는 변수명만 가득하여 로직 파악이 매우 힘들 수 있다.
  2. 저작권 및 법적 문제: 다른 사람의 프로그램을 역공학하여 소스 코드를 탈취하거나 수정하는 행위는 저작권법 위반  영업비밀 침해 등으로 법적 처벌을 받을 수 있다. 오직 교육용이나 보안 점검 목적으로만 본인의 환경에서 사용하시길 바란다.
  3. 보안: 신뢰할 수 없는 .exe를 분석할 때는 악성코드 감염 위험이 있으므로, 가상 머신(VMWare, VirtualBox) 환경에서 작업하는 것을 권장한다.

 

 

2. qwer.exe파일 이라면?

*qwer.exe는 학습을 위해 설정한 가상의 프로그램.

 

이 파일은 Rust(러스트) 언어로 작성되었으며 64비트 Windows용 Native EXE 파일.

특히 가장 고무적인 부분은 하단의 Embedded PDB (release) 문구. 보통 릴리즈용 프로그램은 보안을 위해 디버그 정보를 삭제(Strip)하지만, 이 파일은 함수 이름 등 분석에 결정적인 정보가 포함되어 있을 가능성이 크다고 봄.

이런 기술 스택의 파일을 분석(소스 코드 가시화)하는 방법은 다음과 같다.


1. 현실적인 목표

Rust는 C/C++와 마찬가지로 '네이티브 언어'. 따라서 작성자가 쓴 .rs 소스 코드를 그대로(1:1) 완벽하게 복구하는 도구는 존재하지 않는다. 대신 기계어를 사람이 읽기 쉬운 C언어 형태(의사 코드)나 어셈블리어로 바꿔서 로직을 파악해야 한다.


2. 추천 도구 및 방법

① Ghidra (가장 추천 - 무료)

미국 NSA에서 개발한 오픈소스 리버스 엔지니어링 도구.

  • 장점: 강력한 Decompiler 기능이 있어 기계어를 C언어와 비슷한 코드로 변환해 줌.
  • 분석 포인트:
    • 이 파일은 PDB(디버그 데이터) 정보가 들어있으므로, Ghidra로 불러왔을 때 함수 이름(예: main, print_hello 등)이 깨지지 않고 보일 확률이 매우 높음.
    • Rust는 이름 맹글링(Name Mangling)이 심한데, 최신 Ghidra는 이를 어느 정도 해석해 준다.

  Rust 전용 분석 도구 (보조)

  • Ghidra-Rust: Ghidra에서 Rust 특유의 타입 시스템이나 라이브러리를 더 잘 인식하게 해주는 확장 스크립트들이 GitHub 등에 공개되어 있다.

기드라 프로젝트 창
기드라 화면

3. 분석 시나리오

  1. Ghidra를 다운로드 한다. (해당 깃허브에서.)
  2. Ghidra 포터블 폴더를 압축 해제하고 실행(.bat) 한다. (기드라는 반드시 JDK(JAVA) 21 버전 이상이 설치되어 있어야 한다. 가령 CMD 창만 뜨고 실행이 안되면, JDK 21 이상 설치 여부를 확인할 것.)
  3. 프로젝트를 생성하고 해당 프로젝트에 분석할 qwer.exe파일을 Import 한다.
  4. 분석(Analysis) 옵션을 돌린다. (우측 하단의 파란색 게이지로 진행상황을 퍼센티지로 알려준다. 오래 걸릴 수도 있다. 가령, 수 시간이 소요될 수도 있다.)
  5. Symbol Tree에서 src main 등의 키워드를 검색한다.
    • 1편의 DIE 결과에서 Embedded PDB라고 되어 있으므로, 원본 소스 파일의 경로(예: C:\Users\Documents\project\src\main.rs)나 함수들이 이름 그대로 나타날 가능성이 매우 크다.
  6. 오른쪽 Decompiler 창에서 복구된 로직을 분석한다.

4. 난관 (주의사항)

  • 컴축(Generic Packer): DIE 결과 중간에 Packer: Generic... compressed라는 내용이 있었다. 만약 이 프로그램이 실행 시 압축을 푸는 방식(Packer)이 적용되어 있다면, 곧바로 디컴파일이 안 될 수 있다. 이 경우 실행시킨 뒤 메모리에서 덤프를 뜨거나 언패킹 과정을 먼저 거쳐야 한다. (하지만 Detect It Easy의 휴리스틱 진단이라 실제로는 압축이 아닐 수도 있다.)
  • Rust 표준 라이브러리: Rust는 아주 간단한 프로그램도 표준 라이브러리가 크게 들어간다. 처음에 함수가 수만 개 보여서 당황할 수 있는데, 제작자가 직접 만든 로직은 전체 중 아주 작은 일부분이므로 '사용자 정의 함수' 위주로 찾아야 한다.

결론:
이 파일은 PDB 데이터가 포함된 Rust 프로그램이므로, Ghidra를 사용하면 원래 소스 코드의 흐름(함수명, 주요 로직 등)을 상당히 구체적으로 파악할 수 있는 상태다.

 

 

이번 편은 기드라로 qwer.exe를 임포트하는 걸 알아봤다.

다음 편에선 이제 기드라가 분석한 qwer.exe의 소스 코드를 분석하는 것을 알아보자.