REA 역공학 도구 기반 DWG 캐드파일 분석, 캐드 뷰어 및 모델러 도구 Web App 개발기
역공학 도구 REA를 Claude Code에 MCP로 연결해 AutoCAD DWG 바이너리 구조를 분석하고, 그 결과를 바탕으로 한글을 정확히 표시하는 Rust 기반 CAD 웹 뷰어를 한 시간 남짓 만에 개발한 과정입니다. 같은 방식으로 만든 PE Dependency 분석 웹앱과 3D 솔리드 모델러 웹앱도 함께 소개합니다. (출처: 한국건설기술연구원 강태욱 박사)
개발 배경 — 역공학 MCP와 AI 에이전트로 만드는 CAD 웹 앱
이 글은 역공학 도구 REA(Reverse Engineering Agents) 를 설치하고, 이를 이용해 AutoCAD DWG 바이너리 파일 구조를 분석한 뒤, 그 결과를 바탕으로 CAD 웹 뷰어를 바이브 코딩으로 개발한 과정을 정리한 것입니다. 윈도우 실행 파일 분석기로 잘 알려진 Dependency 도구와 3D 솔리드 모델러도 같은 방식으로 역공학해 웹 기반 도구로 만든 결과를 함께 소개합니다.
DWG 뷰어 개발의 테스트 대상은 연구원 본관동 평면도 DWG 파일 2종입니다. 하나는 AutoCAD 2004 포맷(AC1018), 다른 하나는 2010 포맷(AC1024)이며, 둘 다 한글 텍스트와 한글 SHX 빅폰트를 사용합니다. 전체 작업은 Claude Code에 프롬프트를 주는 방식으로 진행했고, 분석부터 웹 앱 개발, 테스트까지 한 시간 남짓 걸렸습니다.
결과물 | 내용 | 개발 시간 |
|---|---|---|
DWG CAD 웹 뷰어 | DWG 구조 분석 결과를 반영한 Rust 웹 뷰어, 한글 CP949·MTEXT 처리 | 한 시간 남짓 |
PE Dependency 웹앱 | exe·dll 의존성 트리 분석과 대시보드 | 약 30분 |
3D 솔리드 모델러 웹앱 | 스케치, 구속조건, 3차원 모델링, 파라메트릭 수정 | 2~3시간 미만 |
REA란
REA는 Ghidra, JADX 같은 역공학 엔진을 MCP(Model Context Protocol) 서버로 묶어, Claude Code 같은 LLM 에이전트가 바이너리 분석을 직접 수행할 수 있게 해 주는 도구입니다. 네이티브 바이너리 디컴파일(exe, dll 등), 안드로이드 APK 분석, 일렉트론·자바스크립트 번들 분석, 펌웨어 추출 등 200개가 넘는 분석 도구를 제공합니다. 분석 결과에는 증거(Evidence) 가 함께 붙어 나오므로, LLM이 지어낸 내용인지 실제 바이너리에서 확인된 내용인지 구분할 수 있습니다.
설치 방법 (윈도우)
관리자 권한 없이 모두 포터블로 설치했습니다.
- JDK 21 설치(Ghidra 실행용) — Temurin 포터블 zip을 받아 압축 해제
- Ghidra 12.x 설치 — NSA 깃허브 릴리스에서 zip을 받아 압축 해제
- (안드로이드 분석용, 선택) jadx-headless-mcp JAR 다운로드 — REA가 요구하는 버전과 sha256이 일치해야 합니다
- 환경 변수 설정 —
JAVA_HOME,GHIDRA_INSTALL_DIR,REA_JADX_MCP_JAR - Claude Code에 MCP 서버 등록
claude mcp add rea -- cmd.exe /d /c npx -y rea-agents@latest mcp
등록 후 doctor 명령으로 Ghidra, JADX 프로바이더가 healthy인지 확인하면 됩니다. npx 첫 실행은 패키지 다운로드 때문에 타임아웃될 수 있는데, 이 경우 앱을 재시작하면 연결됩니다.
DWG 파일 구조 분석 — 설계구조 및 데이터구조
사용한 프롬프트
분석과 개발에 사용한 프롬프트는 대략 다음과 같습니다.
이 폴더 아래의 dwg 파일을 REA로 분석해 구조를 파악해줘. 헤더 필드, 섹션 구조, 한글 텍스트 인코딩, 폰트(.shx 빅폰트/.ttf)를 확인하고 바이트 증거와 함께 문서로 정리해줘. 확인 안 된 항목은 추정으로 표시할 것.
그 결과를 활용해 Rust 웹 앱 개발 실행해. 한글 텍스트가 정확히 표시되어야 해.
이런 식으로 중간중간 결과를 확인하고 방향을 잡아 주는 하네스(harness) 방식으로 진행합니다. 처음부터 완벽한 컨텍스트와 목표(Goal)를 주는 편이 좋지만, 이 정도 규모의 도구는 적절히 피드백을 주면서 개발해도 큰 무리가 없습니다.
분석 방법 — 바이트 증거와 교차 검증
REA에 DWG 파일을 등록해 sha256 무결성 증거를 확보하고, 파일 헤더를 바이트 단위로 분석했습니다. 다만 윈도우용 Ghidra 백엔드는 PE 등 실행 파일 위주여서 DWG 같은 raw 데이터 이미지의 바이트 읽기는 지원하지 않았습니다. 이 부분은 자체 분석 스크립트와 LibreDWG(dwg2dxf) 교차 검증으로 보완했습니다.
확인된 DWG 구조
- 파일 헤더 고정 필드 — 버전 문자열(AC1018/AC1024), 썸네일 주소(0x0D), 코드페이지(0x13), SummaryInfo 주소(0x20)
- 코드페이지 — 필드 값 40 = ANSI_949(한국어 CP949). DXF 변환 결과의
$DWGCODEPAGE로 교차 확인 - 썸네일 블록 — 16바이트 센티널 + BMP DIB 데이터. 추출해서 웹 뷰어 미리보기로 활용
- 한글 인코딩 규칙 — R2004 이하는 CP949 바이트, R2007 이상은 내부 유니코드(DXF 변환 시 UTF-8)
- 텍스트 스타일 — romans.shx + whgtxt.shx 같은 SHX 빅폰트 조합과 HY울릉도M, HY견고딕 등 한글 TTF
- MTEXT — 인라인 서식 코드(
{\fHYwulM|b0|i0;...})가 섞여 있어 표시 전에 제거 필요
분석 결과는 바이트 증거와 함께 보고서로 정리했고, 이 보고서가 이후 웹 앱 개발의 설계 근거가 되었습니다.
주요 구현과정 — Rust 한글 지원 CAD 웹 뷰어
구성과 처리 파이프라인
cargo 워크스페이스로 구성하고, DWG 헤더 파서·DXF 파서·MTEXT 서식 제거를 담당하는 라이브러리 크레이트와 axum 웹 서버 크레이트로 나눴습니다. 처리 파이프라인은 다음과 같습니다.
- DWG 업로드
- 자체 헤더 파싱 — 버전, 코드페이지, 썸네일
- LibreDWG
dwg2dxf사이드카 변환 - 자체 DXF 파싱
- 평탄화된 엔티티 JSON 생성
- HTML 캔버스 렌더링
핵심은 한글 처리
한글 처리가 이번 개발의 핵심이었습니다. DXF의 $ACADVER를 보고 AC1018 이하는 encoding_rs의 EUC-KR 디코더로, AC1021 이상은 UTF-8로 분기합니다. MTEXT 서식 코드는 파서 단계에서 제거합니다. 도면의 원본 폰트(whgtxt.shx 등 셰이프 폰트)는 라이선스와 포맷 문제로 재현하지 않고 Noto Sans KR 웹폰트로 대체했는데, 실명 표기 용도로는 충분합니다.
CAD 사용자에게 익숙한 UX
뷰어 UX는 CAD 사용자에게 익숙한 구성으로 만들었습니다.
- 파일·보기 메뉴바
- 레이어 패널 — 검색 필터, 표시 토글, 색상 피커로 레이어 색 즉시 변경
- 휠 확대·축소와 드래그 이동, 커서 위치의 도면 좌표 표시
- 다크·라이트 모드, 한국어·영어 UI 전환
단위 테스트로 고정한 항목
단위 테스트 16개로 다음 항목을 고정했습니다.
- CP949 디코딩 — 본관동 1층평면도, 레이어명 구조기둥
- MTEXT 서식 제거 — 실제 도면 샘플
- INSERT 블록 전개
- 실파일 헤더 검증
성능 및 효과 — AutoCAD와 비교한 결과
개발을 마친 뷰어로 기준 도면을 열어 AutoCAD 화면과 나란히 비교했습니다. 기준이 된 DWG 파일을 거의 완벽하게 파싱·처리해 렌더링하는 것을 확인할 수 있습니다.
개발 중 만난 문제
바이브 코딩이라고 해도 중간마다 하네스가 필요하고, 간단한 디버깅은 피할 수 없었습니다. 기록해 둘 만한 문제는 다음과 같습니다.
문제 | 원인과 해결 |
|---|---|
빌드 실패 | 윈도우 GNU 러스트 툴체인에서 raw-dylib을 쓰는 최신 windows-sys 크레이트가 dlltool 오류를 냄 → tokio를 1.38로 고정해 해결 |
변환 실패 | LibreDWG의 C 도구들이 260자가 넘는 출력 경로에서 WRITE ERROR로 실패 → 짧은 임시 경로를 사용해 해결 |
치수 지오메트리 흩어짐 | DIMENSION 엔티티의 group 10(정의점)을 블록 삽입점으로 잘못 해석해 치수가 수천만 단위 밖으로 흩어짐 → 치수의 익명 *D 블록은 원점에 그대로 전개하는 것이 맞음 |
화면 맞춤 실패 | 실무 도면에는 본 도면에서 수천만 단위 떨어진 쓰레기 지오메트리가 흔함 → 화면 맞춤을 min/max 대신 좌표 백분위수 트리밍으로 계산 |
같은 방식으로 만든 도구 — Dependency 웹앱과 3D 솔리드 모델러
PE Dependency 웹앱
개발자들 사이에서 유명한 윈도우 실행 파일 분석기 Dependency 도구도 앞의 프로세스와 같은 방식으로 웹앱 버전을 만들었습니다. 주요 exe, dll 같은 컨텍스트를 바이브 코딩 도구에 입력하고, 프롬프트로 개발을 지시했습니다. 원본 실행 파일이 300KB 이하여서 30분 정도면 개발이 끝났습니다.
웹 기반으로 exe, dll 파일을 입력받아 내부 구조를 분석하고, 의존성 트리와 관련 이슈를 분석한 뒤 대시보드 차트로 알기 쉽게 정리해 줍니다. 원본 도구가 윈도우에서만 실행되고 의존성 트리 위주로 보여 줬던 것에 비해, 웹 버전에서는 여러 기능을 더할 수 있습니다.
- 탐색기 — 의존성 트리, 모듈별 임포트·익스포트 함수, 전체 모듈 목록
- 대시보드 — 모듈·의존 간선·미해석 모듈 개요, 검색 순서 하이재킹 표면, 해석되지 않은 모듈, 모듈 출처 분포, ASLR·DEP·CFG 완화 기능 적용 현황, Fan-in·Fan-out 상위 모듈, 아키텍처·깊이 분포
- 한국어·영어 UI 전환
소스: github.com/mac999/loadscope
3D 솔리드 모델러
3D 솔리드 모델링 도구도 잘 알려진 모델러를 참고해 같은 방식으로 개발했습니다. 하네스를 포함한 전체 개발 시간은 2~3시간 미만입니다. 웹 기반 도구이면서도 유명 상용 모델러와 큰 차이가 없는 UX를 경험할 수 있습니다.
다음 영상은 이렇게 개발한 모델러로 스케치 → 구속조건 설계 → 3차원 모델링 → 파라메트릭 수정 → 최종 완성까지 진행하는 과정을 보여 줍니다.
남은 개선점과 정리
REA 같은 역공학 MCP와 LLM 에이전트를 결합하면, 바이너리 포맷 분석부터 그 결과를 반영한 앱 개발까지 하나의 대화 흐름 안에서 처리할 수 있습니다. 이번 DWG 뷰어 작업은 분석, 개발, 테스트, 렌더링 검증까지 한 시간 남짓 걸렸습니다.
다만 다음은 여전히 사람이 챙겨야 할 몫입니다.
- 분석 결과를 그대로 믿기보다 LibreDWG 같은 검증된 도구와 교차 확인하는 과정
- 중간 이슈를 확인하고 목표까지 가도록 이끌어 줄 테스트케이스 작성
남은 과제도 있습니다. 솔리드 모델러의 어셈블리 등 나머지 기능은 시간이 더 필요한 부분이라 차후 작업으로 남겨 두었고, 도면 원본의 SHX 셰이프 폰트는 웹폰트로 대체한 상태입니다.
레퍼런스
- REA (rea-agents): npmjs.com/package/rea-agents
- Ghidra: github.com/NationalSecurityAgency/ghidra
- LibreDWG: gnu.org/software/libredwg
- SolidCraft: github.com/tangency-labs/solidcraft
- ODA, Open Design Specification for .dwg files
출처
이 글은 한국건설기술연구원 강태욱 박사의 블로그 글 「REA 역공학 도구 기반 DWG 캐드파일 분석, 캐드 뷰어 및 모델러 도구 Web App 개발기」(Daddy Makers, 2026년 10월 17일)를 AI LAB 형식에 맞게 정리한 것입니다. 본문의 이미지와 영상은 모두 원문에서 가져왔습니다.