Ghidra Download비공식 다운로드 및 설치 가이드
한국어
GHIDRA 디컴파일러 가이드

Ghidra 디컴파일러 사용법

Ghidra 디컴파일러는 선택한 기계어 함수를 C와 비슷한 의사 코드로 바꿉니다. 매개변수, 조건문, 반복문, 함수 호출을 빠르게 이해할 수 있지만 결과는 복원된 원본 소스가 아니라 분석 해석입니다. 중요한 결론은 반드시 Listing의 명령어와 함께 검증해야 합니다.

공식 디컴파일러 문서
수준초급~중급
방식정적 분석
Ghidra12.1.2
확인일2026년 7월 30일
핵심 답변

Ghidra 디컴파일러가 하는 일과 복원할 수 없는 것

Ghidra는 명령어, 제어 흐름, 호출 규약, 심볼, 자료형을 분석해 하나의 함수를 읽기 쉬운 의사 코드로 표현합니다. 분기, 반복, 인자 사용, 반환값, 호출자와 피호출자 관계를 찾을 때 특히 유용합니다.

출력은 원래의 C 또는 C++ 소스가 아닙니다. 컴파일 과정은 이름과 고수준 자료형을 제거하고, 식을 합치며, 작업 순서를 바꾸고, 함수를 인라인 처리합니다. 변수 이름과 자료형, 식은 가설로 취급하고 같은 주소의 Listing과 주변 참조에서도 설명되는지 확인하세요.

이 페이지는 디컴파일러에 집중합니다. 프로젝트 생성, 파일 가져오기, 자동 분석, 코드 브라우저 기본부터 필요하다면 Ghidra 초보자 튜토리얼을 먼저 읽으세요.

올바른 관점

의사 코드는 기계어 동작을 읽기 쉽게 만든 지도이며 원본 소스를 증명하는 자료가 아닙니다.

시작

Decompiler를 열고 Listing과 동기화하기

자동 분석이 끝난 뒤 코드 브라우저에서 프로그램을 엽니다. 패널이 보이지 않으면 Window > Decompiler를 선택합니다. 리스팅 또는 심볼 트리에서 정의된 함수를 선택하면 해당 함수의 의사 코드가 표시되고 현재 명령어에 대응하는 문장이 강조됩니다.

무작정 스크롤하지 말고 고유 문자열, 가져온 API 호출, 내보낸 심볼, 오류 메시지, 알려진 진입점처럼 신뢰할 수 있는 기준에서 시작하세요. 참조를 따라 호출 함수를 열고 백그라운드 분석과 디컴파일이 끝날 때까지 기다립니다.

함수가 없다는 메시지가 나오면 디스어셈블리와 참조가 경계를 뒷받침할 때만 함수를 정의합니다. 프로세서 언어나 이미지 베이스가 틀렸다면 먼저 가져오기 설정을 수정해야 합니다.

  1. 1

    기준점 선택

    설명하려는 동작과 연결된 문자열, 심볼, 가져오기 항목 또는 주소를 찾습니다.

  2. 2

    참조 따라가기

    참조하는 함수를 열고 리스팅, 심볼 트리, 디컴파일러가 같은 위치인지 확인합니다.

  3. 3

    분석 완료 기다리기

    완료 후 입력값, 호출, 조건, 메모리 쓰기, 반환값 순서로 읽습니다.

디컴파일할 함수를 선택하는 Ghidra CodeBrowser 공식 화면
공식 화면: CodeBrowser에서 Listing, 심볼, 디컴파일러 문맥을 함께 볼 수 있습니다.
해석

Ghidra 의사 코드를 과신하지 않고 읽는 방법

먼저 반환형, 매개변수, 호출 규약으로 이루어진 함수 시그니처를 읽습니다. param_1, local_18, FUN_00401230, undefined8 같은 이름은 원본 식별자가 아니라 Ghidra에 충분한 근거가 없다는 뜻입니다. 각 값이 어디서 생성되고 어떻게 변하며 어디서 사용되는지 추적하세요.

그다음 조건, 반복문, 호출, 메모리 접근, 반환 경로를 찾습니다. 호출 함수를 열었다가 탐색 기록으로 돌아오고, 역할을 단정하기 전에 호출자와 참조를 확인합니다. 교차 강조 기능은 의사 코드 식과 실제 명령어 범위를 연결합니다.

최적화는 간단한 원본 식을 복잡하게 보이게 하거나 여러 저수준 연산을 지나치게 깔끔한 코드로 합칠 수 있습니다. 분기 방향, 상수, 부호, 포인터 연산, 부수 효과는 Listing에서 확인합니다.

표시가능한 의미확인할 내용
param_1 / local_10역할이 불명확한 인자 또는 지역 변수사용처, 스택, 호출자
FUN_...이름이 없는 함수호출자, 문자열, 가져오기
undefined4 / undefined8크기는 알지만 형식은 불확실레지스터, 캐스트, 메모리 배치
goto / 이상한 반복문복원된 제어 흐름분기 대상과 함수 그래프
많은 캐스트형식 또는 시그니처 불일치부호, 포인터, 프로토타입
개선

이름, 시그니처, 자료형으로 출력 개선하기

프로젝트에 정확한 사실이 늘어날수록 출력이 좋아집니다. 호출, 문자열, 가져오기, 데이터 흐름이 역할을 뒷받침할 때만 함수 이름을 바꾸세요. 변수는 추측한 업무명이 아니라 책임을 기준으로 이름을 붙이고, 주석에는 의사 코드 반복이 아닌 근거와 불확실성을 기록합니다.

잘못된 시그니처는 모든 호출자에 불필요한 캐스트와 포인터 연산을 퍼뜨립니다. 반환형, 매개변수, 호출 규약을 먼저 수정하세요. 반복되는 오프셋과 상수가 근거를 제공할 때 구조체, 열거형, 배열, 포인터 형식을 적용합니다.

한 번에 하나의 근거 있는 변경만 하고 호출자를 다시 확인하세요. 그럴듯하지만 잘못된 가정을 빠르게 되돌릴 수 있습니다.

  1. 1

    안정된 심볼 이름 변경

    눈에 보이는 근거가 역할을 지지할 때만 설명적인 이름을 사용합니다.

  2. 2

    프로토타입 수정

    지역 변수보다 반환형, 매개변수, 호출 규약, 포인터 깊이를 먼저 고칩니다.

  3. 3

    재사용 자료형 적용

    같은 오프셋과 상수가 여러 함수에서 반복되면 구조체와 열거형을 만듭니다.

  4. 4

    호출자 검토

    새 시그니처가 주변 함수를 명확히 하고 모순을 만들지 않는지 확인합니다.

검증

Listing과 함수 그래프에서 결론 확인하기

Listing은 해석된 명령어와 데이터를 주소별로 보여 주는 근거입니다. 어떤 비교가 분기를 결정하는지, 값의 부호 여부, 호출이 돌아오는 위치, 메모리 쓰기가 검사 전후 언제 일어나는지 확인하세요.

중첩 조건, 조기 반환, 반복문이 복잡하면 함수 그래프를 사용합니다. 참과 거짓 경로를 따라가고 공유 블록을 찾은 뒤 Decompiler로 돌아와 각 경로를 짧은 문장으로 설명합니다.

중요한 발견에는 함수 주소, 결정적인 명령어 또는 블록, 관련 참조, 확신 수준을 기록합니다. 나중에 자료형이 바뀌어 의사 코드 표시가 달라져도 이 근거는 남습니다.

Decompiler 분기를 검증하는 Ghidra 함수 그래프
공식 화면: 함수 그래프는 조건과 반복문 뒤의 제어 흐름 블록을 보여 줍니다.
문제 해결

디컴파일 결과가 잘못되거나 불완전해 보이는 이유

좋지 않은 출력은 분석 정보 부족의 증상일 수 있습니다. 디컴파일러 오류라고 판단하기 전에 프로세서 언어, 컴파일러 사양, 메모리 맵, 이미지 베이스, 함수 경계, 시그니처, 분석기 결과를 점검하세요.

난독화, 패킹, 수작업 어셈블리, 간접 호출, 예외, 강한 최적화, 자기 수정 코드는 복원을 제한합니다. 전체 프로그램에서 깨끗한 소스를 기대하지 말고 하나의 분기, 자료구조, 호출자처럼 질문 범위를 좁히세요.

증상가능한 원인다음 확인
함수 없음경계 미정의참조와 디스어셈블리
의미 없는 명령어언어 또는 베이스 오류가져오기 설정과 메모리 맵
캐스트 과다시그니처 또는 형식 오류프로토타입, 부호, 포인터
호출 누락간접 흐름 또는 분석 공백XRefs와 호출 위치
매우 복잡한 의사 코드최적화 또는 난독화작은 범위와 함수 그래프
연습

20분 반복 연습 절차

직접 만든 프로그램, 오픈 소스 바이너리, 교육용 문제 또는 분석 권한이 있는 파일을 사용하세요. 격리된 환경에서 가져오고 자동 분석을 실행한 뒤 성공 또는 오류 문자열 하나를 찾아 참조를 따라가며 결정 함수를 자신의 말로 설명합니다.

근거 있는 심볼만 이름을 바꾸고 시그니처나 자료형 하나를 수정합니다. 핵심 조건을 Listing과 비교하고 흐름이 복잡하면 함수 그래프를 사용하세요. 결론 한 문장과 이를 뒷받침하는 주소를 남긴 뒤 PyGhidra 자동화로 확장합니다.

세부 기능은 Ghidra 공식 Decompiler 도움말을 참고하세요. Ghidra 설치 가이드로 검증된 최신 버전을 설치하고 업그레이드 전에 프로젝트를 백업하세요.

  • 0~5분: 신뢰할 수 있는 문자열, 가져오기, 심볼 또는 주소 찾기.
  • 5~10분: 입력, 호출, 조건, 쓰기, 반환값 읽기.
  • 10~15분: 근거를 바탕으로 이름, 시그니처 또는 자료형 하나 개선하기.
  • 15~20분: 결정 경로를 검증하고 주소와 결론 기록하기.
자주 묻는 질문

Ghidra 디컴파일러 자주 묻는 질문

Ghidra가 원본 소스 코드를 복원하나요?

아닙니다. 기계어와 분석 정보를 바탕으로 C와 비슷한 의사 코드를 만듭니다. 원래 이름, 주석, 자료형, 정확한 구조는 대부분 사라집니다.

Decompiler 창은 어떻게 여나요?

CodeBrowser에서 프로그램을 열고 패널이 숨겨져 있으면 Window > Decompiler를 선택한 뒤 Listing 또는 Symbol Tree에서 정의된 함수를 선택합니다.

undefined8과 많은 캐스트가 나오는 이유는 무엇인가요?

저장 크기는 알지만 자료형 근거가 부족하거나 함수 시그니처가 잘못됐기 때문입니다. 호출자, 레지스터, 부호, 포인터 깊이, 반복 오프셋을 확인하세요.

Ghidra가 C++도 디컴파일하나요?

C++에서 생성된 네이티브 코드를 분석할 수 있지만 템플릿, 클래스, 예외, 인라인 처리, 최적화, 제거된 심볼 때문에 원본 소스와 차이가 커집니다.

Decompiler와 Listing 중 무엇을 믿어야 하나요?

둘 다 사용하세요. Decompiler는 의도를 빠르게 이해하게 하고 Listing은 분기, 호출, 상수, 메모리 접근, 부수 효과를 주소별로 검증합니다.