Resource Hacker: 실행 파일 안에서 코드가 아닌 절반을 고치는 도구
요약
Resource Hacker 는 윈도우 실행 파일이 품고 있는 리소스 구역을 열어 대화상자, 아이콘, 메뉴, 문자열 테이블, 버전 정보를 읽고 고치고 꺼내고 한꺼번에 바꿔 넣을 수 있게 해 준다.
추천- 이름
- Resource Hacker
- 버전
- 5.2.8
- 요금
- 무료
- 오픈소스
- 비오픈소스
- 운영체제
- Windows
- 업데이트
- 2026-10-06 20:13
윈도우 프로그램에서 코드가 아닌 절반
대화상자란 제목이 붙은 사각형 안에 고정된 글 몇 줄, 입력 칸 세 개, 버튼 두 개가 올라가 있는 물건이다. 그 안에서 실행 중에 계산되는 것은 거의 없다. 각 컨트롤이 어디에 놓이는지, 버튼에 무슨 글자가 찍히는지, 어떤 글꼴을 쓰는지, 탭 키가 어떤 순서로 칸을 넘어가는지, 처음에 어디로 포커스가 들어가는지 — 모두 미리 정해져 실행 파일 안의, 기계어 명령 옆에 있으면서 한 번도 실행되지 않는 구역에 들어 있다. 제목 표시줄의 아이콘, 시작 화면의 비트맵, 창 위쪽의 메뉴, 키 조합을 명령에 연결하는 표, 그리고 프로그램이 읽힐 때 화면의 모든 이름표를 공급하는 문자열 테이블도 같은 자리에 있다.
이 구조 덕분에 프로그램은 다시 컴파일하지 않고도 다른 언어로 옮겨질 수 있고, 소스를 한 줄도 본 적 없는 사람이 겉모습을 바꿀 수 있다. Resource Hacker 는 바로 그 구역을 위한 열람기이자 편집기다. 실행 파일을 가리키면 리소스 디렉터리를 따라가며 내용을 나무 모양으로 펼친다. 아이콘, 비트맵, 커서, 대화상자, 메뉴, 문자열 테이블, 버전 정보, 응용 프로그램 매니페스트, 그리고 사람이 읽을 만한 형태가 없는 날것의 이진 덩어리까지. 추측은 없고 다시 만들어내지도 않는다. 링커가 거기 넣어 둔 것이 그대로 보인다.

네 가지 동작, 그리고 네 번째가 가장 과소평가된다
첫 번째는 읽기다. 손대기 전에 그냥 한 번 훑어보는 값이 있다. 이 나무는 다른 방식으로는 묻기 어려운 것들을 답해 준다. 이 프로그램에 대화상자가 실제로 몇 개인지, 아무도 쓰지 않는 언어의 문자열 테이블이 남아 있는지, 그 아이콘 묶음이 여러 크기를 모은 것인지 아니면 하나뿐인데 시스템이 억지로 늘려 쓰고 있는지.
두 번째는 고치기다. 텍스트, 아이콘, 비트맵, 대화상자 배치 전체까지 그 자리에서 바꿀 수 있다. 컴파일러를 건드리지 않고 프로그램의 겉면을 바꾸는 일이다. 대화상자에는 컨트롤을 끌어다 놓고 크기를 조절하는 화면이 있고, 메뉴와 문자열 테이블, 버전 정보에는 서식이 있다. 이진 리소스는 바이트 단위로 덧댈 수 있는데, 정답인 경우는 드물고 유일한 방법인 경우는 가끔 있다.
세 번째는 꺼내기다. 아이콘도 비트맵도 커서도 파일로 내보낼 수 있고, 이것만으로도 많은 사람에게 이 도구를 남겨 둘 이유가 된다. 오래전에 버려진 프로그램에 박혀 있는 아이콘은 세상에 남은 마지막 한 장인 경우가 흔하다. 꺼내기는 리소스를 뜯어 구조를 살피고 고친 판을 다시 넣는 절차이기도 하다.
네 번째가 이 도구를 호기심의 대상에서 매주 쓰는 물건으로 바꾼다. 한꺼번에 처리하기다. 리소스를 더하고 지우고 바꿔 넣는 것은 각각 다른 동작인데, 서로 얽힌 실행 파일 묶음 전체에 같은 일을 하는 것이 한 번 하는 것과 크게 다르지 않다. 같은 프로그램의 빌드를 여러 개 유지하는 사람에게 이것은 반나절과 커피 한 잔의 차이다.
대화상자를 고친다는 것의 실제 의미
화면에서 끌어다 놓는 편집은 손에 익는다. 너무 익어서 진짜 제약을 가린다. 대화상자의 배치는 픽셀이 아닌 단위로 잡힌다. 어떤 언어의 이름표를 기준으로 폭을 계산한 칸은 다른 언어의 더 긴 이름표를 잘라낸다. 자리를 만들려고 옮긴 컨트롤은 원래부터 빠듯했던 이웃과 겹치기도 한다. 화면 글자를 바꾸는 사람은 나중에 크기를 다시 맞출 각오를 해야 하고, 결과를 한 가지 배율에서만 확인하면 안 된다. 대화상자 단위는 절대 좌표처럼 굴지 않는다.
이 도구는 서식 뒤에 있는 리소스 스크립트도 드러낸다. 같은 변경을 여러 대화상자에서 반복해야 할 때 이 점이 중요해진다. 글자를 고치는 편이 컨트롤을 끄는 것보다 빠르고, 스크립트는 배치의 구조를 그림판이 주지 못하는 방식으로 보여 준다. 동시에 편집 화면이 무엇을 만들어 내는지에 대한 솔직한 모습이기도 하다. 서식은 리소스 정의 위에 얹힌 한 겹이지 그 대체물이 아니다.

진짜 쓸모가 있는 곳
먼저 번역이다. 번역을 염두에 두지 않고 만든 프로그램을 다른 언어로 옮길 때는 대개 문자열 테이블과 대화상자 배치를 직접 만지게 되고, 이 도구는 바로 그 일을 위해 나왔다. 두 번째는 화면 손질이다. 안내 문구의 말투를 바꾸고, 낡은 아이콘을 지금의 것으로 갈고, 원래 만든 사람이 빽빽하게 남겨 둔 배치를 조금 풀어 준다. 세 번째는 게임 개조이며 가장 예측하기 어렵다. 게임 실행 파일은 리소스를 잔뜩 품고 있고, 메뉴와 시작 화면, 화면 그림에 가하는 작은 변경의 상당 부분은 결국 리소스 교체다.
원문이 꼽은 세 부류 — 개발자, 화면 설계자, 기술적으로 더 들어갈 줄 아는 사용자 — 는 정확한 독자층이고, 이들의 공통점은 실력이 아니라 의도다. 이것은 '무엇이라고 쓰게 하고 싶은지 이미 아는 사람이 특정한 한 곳을 바꾸는' 도구다. 탐색용으로는 부적합하다. 리소스 나무는 그 대화상자가 무엇을 위한 것인지 한마디도 알려 주지 않는다.

도구가 강제할 수 없는 규율
여기서 하는 모든 일은 다른 프로그램이 기대어 사는 파일에 곧장 써 넣는 것이다. 실패는 경고 창으로 나타나지 않는다. 다시는 켜지지 않는 프로그램으로 나타난다. 그래서 첫째 규칙은 재미없고 협상의 여지가 없다. 처음 고치기 전에 손대지 않은 원본 사본을 남긴다. 매번, 이번에는 반드시 될 거라고 확신하는 회차까지 포함해서. 사본에서 작업하고 원본을 따로 두는 데는 비용이 들지 않으며 최악의 결과를 통째로 지운다.
둘째 규칙은 고치기 전에 그 리소스를 이해하는 것이다. 대화상자는 그림이 아니라 구조체다. 문자열 테이블에는 번호가 붙어 있고 그 번호는 코드가 가리킨다. 그래서 중간에 한 줄을 끼워 넣으면 그 뒤의 모든 이름표 번호가 밀린다. 셋째 규칙은 작게 시작하는 것이다. 아이콘 하나를 바꾸고 프로그램이 뜨는지 확인한 다음, 정말 중요한 대화상자로 넘어간다. 이 습관들은 화려하지 않지만, 고친 프로그램과 망가진 프로그램의 차이는 고스란히 이것뿐이다.
이것이 아닌 것
개발 환경이 아니고 논리를 이해하는 데도 도움이 되지 않는다. 리소스가 말하는 것은 프로그램이 어떻게 보이는지, 부품이 무엇이라 불리는지다. 동작은 코드 안에 있고 이 도구는 일부러 그곳을 건드리지 않는다. 역컴파일러도 아니다. 이 둘을 헷갈리는 것이 가장 흔한 오해다. 실행 파일에서 대화상자를 뽑아 다른 것을 되돌려 넣는 것은 정당하고 평범한 작업이고, 기계어에서 소스를 복원하는 것은 다른 행위이며 지역에 따라 법적 무게도 다르다. 이 도구는 전자만 다루고 후자에는 다가가지 않는다.
정확히 말하면 범위를 잘 잘라 낸 작은 도구다. 공개된 사양이 있는 파일 형식을 읽고, 내용을 정직하게 보여 주고, 고치게 하고, 물러난다. 욕심이 적다. 그래서 이렇게 오래 쓰인다.

결론
프로그램 화면의 한 단어를 바꿔야 했거나, 아이콘을 갈아야 했거나, 실행 파일이 무엇을 달고 다니는지 보고 싶었던 적이 있다면 질문과 답 사이의 가장 짧은 길이 여기 있다. 화면은 소박하고 설명은 충실하며, 둘러싼 공동체는 같은 실무적인 물음에 오래 답해 왔다. 입장료는 습관 하나다. 먼저 파일을 복사할 것. 그 밖의 나머지는 이 도구가 놀랄 만큼 너그럽다.