디컴파일 · 디스어셈블
Decompilation / Disassembly
디컴파일이란?
- 기계어를 사람이 읽는 형태로 되돌리기
- 결과는 원본이 아닌 추정 재구성본
- 배포한 코드는 남도 읽을 수 있다
개발자가 쓴 소스 코드는 컴파일이라는 과정을 거쳐 컴퓨터가 실행하는 기계어로 바뀝니다. 이 과정에서 변수 이름, 주석, 함수를 나눈 의도 같은 사람을 위한 정보는 대부분 버려집니다. 디스어셈블은 기계어를 명령어 단위의 어셈블리어로 한 줄씩 옮기는 일이고, 디컴파일은 그 명령어 묶음을 분석해 조건문과 반복문이 보이는 고급 언어 형태로 다시 짜 맞추는 일입니다. 결과물은 원본이 아니라 '이런 코드였을 것'이라는 추정 재구성본이고, 그래서 흔히 의사코드라고 부릅니다.
비유하자면 번역본을 다시 원문 언어로 되돌리는 것과 비슷합니다. 뜻은 상당 부분 살아나지만 원작자의 문체와 단어 선택까지 똑같이 돌아오지는 않습니다. 디컴파일된 코드에서 함수 이름이 FUN_00401a20처럼 의미 없는 기호로 나오는 이유가 여기에 있습니다. 최근에는 AI가 이런 결과물을 읽고 '이 함수는 비밀번호를 검사하는 것으로 보입니다'처럼 이름과 설명을 붙여 주는 단계까지 와서, 분석 속도가 크게 빨라졌습니다.
실무에서 디컴파일 결과를 볼 일이 생긴다면 읽는 요령은 단순합니다. 함수 이름이나 변수 이름보다 어떤 파일을 열고, 어디로 데이터를 보내고, 어떤 조건에서 멈추는지를 먼저 봅니다. 동작의 뼈대가 거기서 드러나기 때문입니다. 요즘은 이 결과를 AI에 붙여 넣고 '이 코드가 하는 일을 업무 용어로 설명해 줘'라고 묻는 방식이 가장 빠른 출발점입니다.
모든 프로그램이 똑같이 읽히는 것도 아닙니다. 자바·.NET·자바스크립트처럼 중간 형태로 배포되는 프로그램은 원본에 꽤 가깝게 되살아나는 반면, C·C++로 만든 프로그램은 훨씬 거칠게 나옵니다. 특히 웹 서비스의 자바스크립트는 누구나 브라우저에서 내려받을 수 있어서, 화면 코드에 넣은 API 키나 관리자 주소는 숨겨진 것이 아닙니다. 바이브 코딩으로 사내 도구를 만드는 부서가 늘면서 이 점을 모른 채 비밀값을 화면 코드에 넣는 사고가 자주 나옵니다. 분석을 어렵게 만드는 난독화 기법도 있지만 늦추는 효과일 뿐 완전히 막지는 못합니다.
| 구분 | 디스어셈블 | 디컴파일 |
|---|---|---|
| 결과물 | 어셈블리어(명령어 단위) | 의사코드(C 비슷한 고급 언어) |
| 읽기 난도 | 전문가용 | 개발자라면 대략 읽힘 |
| 정확도 | 기계어와 1:1 대응 | 구조를 추정해 재구성 |
1960년대 컴퓨터 기종을 바꿀 때 소스가 없는 옛 프로그램을 새 기종으로 옮기기 위해 처음 쓰였습니다. 2019년 미국 국가안보국(NSA)이 내부에서 쓰던 분석 도구 Ghidra를 오픈소스로 공개하면서, 고가의 상용 도구 없이도 누구나 쓸 수 있는 기술이 됐습니다.
가상의 사례로 살펴보겠습니다. 임직원 390명 규모의 식품 유통사 A사 마케팅팀은 바이브 코딩으로 고객 문의를 AI가 분류해 주는 사내 웹 도구를 2주 만에 만들어 쓰고 있었습니다. 외부 협력사도 볼 수 있게 인터넷에 열어 둔 상태였습니다.
- 보안 점검을 맡은 IT팀 윤 대리가 브라우저 개발자 도구로 이 페이지의 자바스크립트를 내려받아 읽어 보니, AI 서비스 결제 계정의 키가 그대로 들어 있었습니다.
- 마케팅팀 서 과장은 '코드는 화면 뒤에 있으니 안 보이는 줄 알았다'고 했고, 윤 대리는 브라우저로 전달되는 코드는 전부 공개된 것과 같다고 설명했습니다.
- 사용 기록을 확인해 보니 지난 한 달 요청 가운데 약 18%가 사내에서 보낸 적 없는 호출이었고, 윤 대리는 그 자리에서 키를 폐기하고 새 키를 발급했습니다.
- 새 판에서는 AI 호출이 사내 서버를 거치도록 바꿔 키를 서버에만 두었고, 협력사 접속도 로그인을 거쳐야만 열리도록 구조를 바꿨습니다.
- 이후 마케팅팀은 직접 만든 웹 도구를 외부에 열기 전 IT팀의 화면 코드 비밀값 점검을 거치기로 했고, 첫 분기에 같은 문제 두 건을 공개 전에 잡아냈습니다.