이번 편은 이제 본격적으로 기드라를 이용해
qwer.exe(학습을 위한 가상의 프로그램)의 소스를 분석해 보자.


기드라(Ghidra)의 1Symbol Tree -> Imports 목록은
이 프로그램이 윈도우 운영체제에서 어떤 ‘도구 박스(API)’들을 빌려 쓰고 있는지를 보여주는 지도와 같다.
현재 나열된 DLL들을 통해 qwer.exe가 기술적으로 어떤 공력을 들였는지 분석해 보자.
(2Listing 창은 해당 프로그램의 어셈블리 코드, 3Decomplier 창은 C언어 스타일로 번역된 소스 코드가 출력된다.)
1. 보안 및 기술 유출 방지 관련
- BCRYPT.DLL / BCRYPTPRIMITIVES.DLL (핵심 발견!)
- 이것은 윈도우의 차세대 암호화 표준(Cryptography Next Generation) API다.
- 의미: 프로그램 내부의 중요한 데이터(사용자 패스워드, 라이선스 정보, 혹은 암호화된 저장 데이터)를 처리할 때 매우 강력한 하드웨어 수준의 암호화 기술을 사용하고 있다는 뜻이다.
- 적용: 단순히 글을 저장하는 게 아니라, "사용자들의 문서를 암호화하여 보호한다"는 기능을 구현하려면 프로젝트(Rust)에서 ring이나 bcrypt 라이브러리를 통해 이 기능을 호출할 수 있다.
2. 네트워크 및 데이터 연동
- WS2_32.DLL (Winsock)
- 네트워크 통신을 담당하는 라이브러리다.
- 의미: 서버와 통신을 하여 실시간 동기화, 업데이트 체크, 또는 온라인 인증을 수행하고 있음을 보여줍니다.
3. 프로그램 구동 환경 (C Runtime)
- API-MS-WIN-CRT-로 시작하는 다수의 파일들
- 이것들은 C Runtime (CRT) 라이브러리들.
- 의미: 앞서 분석했듯이 이 앱은 Microsoft Visual C++ 컴파일러를 통해 빌드되었다. 이 파일들은 메모리 관리(HEAP), 수학 계산(MATH), 문자열 처리(STRING), 입출력(STDIO) 등 프로그램 작동의 가장 기초적인 체력을 제공한다.
4. UI 및 윈도우 관리
- ADVAPI32.DLL / USER32.DLL / GDI32.DLL / SHELL32.DLL
- 윈도우의 기본 창(Window)을 만들고, 메뉴를 띄우고, 마우스/키보드 입력을 처리하고, 파일을 여는 창을 띄울 때 사용하는 고전적인 라이브러리들.
- DWMAPI.DLL
- 바탕화면 창 관리자(Desktop Window Manager).
- 의미: 프로그램의 창 디자인에서 투명 효과, 부드러운 애니메이션 등 윈도우의 최신 UI 효과를 활용하고 있다는 뜻.
5. 컴파일 특징 (Rust의 흔적)
- 일반적인 C++ 앱은 목록이 더 길고 복잡할 때가 많은데, 현재 목록은 꽤 정갈하고 필수적인 것들 위주로 되어 있다. 이는 Rust(Tauri) 기반으로 빌드될 때 나타나는 전형적인 '정적 링크(Static Linking)' 특성과도 일맥상통한다. 불필요한 DLL을 줄여 '가볍게' 유지하려고 노력한 흔적이다.
개발자로서 "무엇을 얻어야 하나?"
이 목록에서는 이러한 영감을 얻을 수 있겠다.
- "나도 보안은 윈도우 표준(BCRYPT)을 써야겠다": 사용자들에게 문서를 절대 해킹당하지 않는다는 신뢰를 주기 위해 윈도우/맥 표준 암호화 기능을 사용하는 것이 좋다.
- "파일 하나(Single File)에 다 뭉쳐 있구나": 위 라이브러리들을 제외한 모든 실제 소스 코드는 외부 DLL이 아니라, 그 20MB짜리 qwer.exe 안에 압축되어 들어 있다.
- "생각보다 특별한(희귀한) 기술은 없다": 오히려 윈도우 표준 기술들을 매우 충실히 따르고 있다. 이는 안정성을 최우선으로 했다는 증거.
5. 동적 로드(Dynamic Loading) 라이브러리
- 목록에 있는 것들은 프로그램이 켜질 때 "반드시 필요해!"라며 선언된 것들이다.
- 하지만 어떤 라이브러리들은 프로그램이 작동하는 도중(예: 인쇄를 할 때, 특수한 이미지 효과를 줄 때)에만 잠깐 불러왔다가 닫는다 (LoadLibrary 방식). 이런 것들은 임포트 목록에 평상시 보이지 않는다.
6. 웹뷰(WebView2) 엔진
- 목록에 직접적으로 드러나지 않지만, 타우리 앱이라면 윈도우에 깔린 Edge 브라우저(WebView2) 엔진을 몰래 불러다 쓴다.
- 이 엔진은 프로그램 크기(20MB)에 포함되지 않고 사용자 PC의 윈도우 시스템 폴더 안에 있기 때문에, 프로그램은 아주 적은 메모리와 용량으로도 웹 브라우저 수준의 화면을 보여줄 수 있는 것이다.
7. 이미 알아낸 사실
개략적인 '설계 도면'은 파악.
- 기반 언어: Rust (안정성과 속도, 보안의 핵심)
- 컴파일러: MSVC 14 (윈도우 표준 환경 최적화)
- UI 방식: 웹뷰 기반
- 보안: BCrypt (윈도우 표준 암호화 기술 사용)
- 배포 방식: Single File Bundle + Packer (사용자 편의와 1차적 코드 보호)
기드라(Ghidra)에서 단지 '소스코드'를 얻어내는 관점이라면 이미 할 건 다했다.
하지만, '기드라에서 추가로 분석 해보는 3가지 핵심 정보'가 남아 있다.
8. 프로그램 내부의 "모든 문자열(Strings)" 조사
프로그램이 사용하는 '텍스트 데이터'를 기드라에서 한꺼번에 볼 수 있다.
- 방법: 기드라 상단 메뉴 Search -> For Strings (검색은 창 하단의 Filter란을 이용)
- 여기서 찾아야 할 단서:
- 서버 주소: https://api.qwer... 같은 URL을 찾으면 어떤 백엔드와 통신하는지 확실히 알 수 있다.
- 사용된 오픈소스 명칭: github.com/serialize/... 처럼 Rust 라이브러리(Crate) 주소가 포함된 경우가 많다. "아, qwer.exe는 이 기능엔 이 라이브러리를 쓰는구나"라는 확신을 얻을 수 있다.
- 에러 메시지: "문서를 저장하는 중에 오류가 발생했습니다" 같은 문구를 검색하면, 그 근처에 있는 함수가 '저장 로직'이다.
9. "SQL" 키워드 검색 (데이터 저장 방식의 실체)
qwer.exe가 문서를 어떻게 관리하는지 궁금하다면, 검색창에 sqlite, sql, create table 등을 입력해 보자.
- 만약 검색 결과에 CREATE TABLE manuscripts ... 같은 SQL 쿼리 문구가 나온다면, 이 프로그램의 데이터베이스 설계도(스키마)를 살펴보는 것과 다름없다.
- 이를 통해 "나는 qwer.exe보다 더 효율적인 구조로 설계해야겠다"는 전략을 세울 수 있다.
10. Tauri의 "Command" 목록 (기능 목록표)
Tauri 앱이라면 프론트엔드(JS)가 백엔드(Rust)에 일을 시키는 명령어 이름들이 바이너리에 포함된다.
- 검색에서 tauri::command 혹은 프로그램의 기능명(예: save_file, export_pdf, get_word_count) 등을 찾아보자.
11. 에디터의 핵심 비즈니스 로직 (함수 명단 발견)
함수의 이름들이 그대로 노출되어 있다. qwer.exe가 어떤 기능을 가졌는지 알려주는 '기능 명세서'다.
- 전용 기능들:
- 스트링 1: 문서 전체가 아닌 '변경된 부분(Delta)'만 실시간으로 저장하는 기술을 쓰고 있다. (가벼움의 핵심)
- 스트링 2: 사용자가 이전 글로 되돌릴 수 있는 '스냅샷(백업)' 기능.
- 스트링 3,4: 내부에 AI 분석 또는 맞춤법 검사 모델이 연동되어 있음을 암시.
- 스트링 5: 시점 설정 등도 메타데이터로 관리하고 있다.
12. 데이터 보안 및 비밀번호 관리
- 근거: tauri-plugin-keyring, BCRYPT.DLL, 스트링 7.
- 분석: 사용자 계정 정보나 중요한 문서 데이터를 암호화하기 위해 윈도우의 '키체인(Keyring)' 시스템을 사용하고 있다.
- 참고할 점: "단순한 파일 저장보다, 운영체제가 제공하는 안전한 저장소(Keyring)를 활용하면 보안성을 극대화할 수 있다"는 힌트를 얻을 수 있다.
13. 사용된 오픈소스 라이브러리들
qwer.exe가 직접 짠 게 아니라, 세계적인 개발자들이 만든 라이브러리를 갖다 쓴 흔적들.
- serde: 데이터(JSON 등)를 가공할 때 쓰는 Rust 표준 라이브러리.
- tokio: 비동기 처리를 아주 빠르게 해주는 엔진.
- chrono: 날짜와 시간을 정확하게 계산하는 라이브러리.
- zip-2.4.2: 파일을 압축하거나 내보낼 때(Export) 사용.
- discord_ipc / rpcdiscord: 디스코드 '상태 메시지'에 "OO 님이 글을 쓰는 중입니다"라고 띄워주는 연동 기술.
14. 아주 중요한 단서: 업데이트 방식
- 주소 노출: https://github.com/QWER컴퍼니/qwer.exe/releases/latest/...
- qwer.exe는 깃허브의 'Releases' 기능을 사용해 프로그램을 업데이트하고 있다. 서버 유지비가 들지 않는 아주 가벼운 업데이트 방식이므로 참고하자.
결론: 개발자가 얻을 교훈
- 데이터 관리가 치밀하다. '델타(차이)' 저장 방식과 '시점 설정' 같은 특화 메타데이터를 기획에 넣어야 경쟁력이 있다.
- 보안을 위해 시스템 기능을 쓴다. 윈도우/맥 자체의 보안 저장소(Keyring)와 연동하는 공부를 하자.
15. 서치에서 검색은 어떻게 하나
a. 특정 위치로 이동하여 코드 보기
- 필터링 된 결과 중에서 분석하고 싶은 문자열을 마우스로 더블 클릭.
- 그러면 메인 창인 Listing 창과 Decompiler 창이 해당 문자열이 실제 사용되는 코드 위치로 즉시 이동.
- 여기서 그 문자열을 어떤 함수가 가져다 쓰는지 확인할 수 있다.
b. 문서 에디터 제작을 위해 꼭 검색해봐야 할 키워드
리스트가 너무 방대하므로, 아래 단어들을 필터 칸에 하나씩 넣어보자. qwer.exe의 핵심 설계를 볼 수 있다.
- qwer: 개발자가 직접 정의한 함수나 고유 경로들이 나온다. (qwer.exe 내부 로직)
- command: Tauri에서 프론트엔드와 백엔드가 주고받는 기능 명칭을 다 볼 수 있다. (예: save_command)
- db 또는 sqlite: 데이터를 저장하는 데이터베이스 관련 문구가 있는지 확인.
- font: 윈도우 시스템 폰트를 어떻게 불러오는지 알 수 있는 단서.
- auth: 로그인이나 라이선스 인증 처리를 어디서 하는지 보여준다.
- https://: 통신하는 서버의 주소를 정확히 찾아낼 수 있다.
팁: 검색 결과가 너무 적다면?
만약 검색 결과가 생각보다 적게 나온다면, Search For Strings 메뉴에서 [Minimum Length]를 3 정도로 낮춰서 다시 검색. 더 짧은 단어들까지 모두 찾아낸다.
16. Tauri 2.0(최신 버전) 기반의 강력한 연동
- 단서: tauri-2.9.5, tauri_runtime_wry-2.9.3
- 분석: qwer.exe는 타우리 1.0이 아닌 모바일 지원과 플러그인 시스템이 강화된 최신 2.0 계열을 쓰고 있다.
- 특징: 내부 리스트에 나오는 __TAURI_INTERNALS__.invoke 등은 JavaScript와 Rust가 통신하는 핵심 다리(Bridge)의 실제 작동 코드다.
17. 사용된 핵심 타우리 플러그인 (qwer.exe가 이미 검증한 기능)
qwer.exe가 이미 도입해서 사용 중인 라이브러리들.
- tauri-plugin-fs (파일 시스템): 로컬 PC에 문서를 저장하고 불러올 때 쓴다.
- tauri-plugin-window-state (창 상태): 앱을 껐다 켰을 때 이전에 띄웠던 창 크기와 위치를 그대로 복구하는 기능. (사용자 경험 핵심)
- tauri-plugin-dialog (시스템 창): 파일 열기, 저장, 경고창 등 윈도우 표준 창을 띄울 때 쓴다.
- tauri-plugin-deep-link (딥링크): qwer:// 같은 고유 링크를 누르면 프로그램이 자동 실행되는 기능.
- tauri-plugin-keyring (보안 저장소): 보안의 핵심. 사용자의 비밀번호나 인증 토큰을 운영체제(Windows Credential Manager)의 가장 안전한 구역에 암호화하여 저장 한다.
18. 기술 유출 방지 전략에 대한 반성 (매우 중요)
리스트 하단을 보면 타우리가 내부적으로 사용하는 JavaScript 브릿지 코드(var __TAURI_IIFE__ = ...)가 그대로 노출되어 있다.
- 관찰 결과: qwer.exe 개발팀도 타우리를 썼지만, 내부에 어떤 명령어(Command)들이 오가는지, 어떤 플러그인을 쓰는지 등에 대한 문자열은 완전히 숨기지 못했다.
- 보안 제언:
- 명령어 이름 난독화: Rust 단에서 정의하는 함수명(예: save_file)을 평범한 이름이 아닌 s_f_01 같이 추론 불가능하게.
- Strings 난독화 도구 사용: 빌드 시 cargo-strip 같은 도구를 활용하거나 Rust의 컴파일러 옵션에서 모든 심볼 정보를 확실히 지워야.
- UI 소스 보호: qwer.exe처럼 index.html 관련 경로가 남지 않도록 빌드 설정을 고도화해야.
19. 에디터 엔진의 동작 방식 (Inter-Process Communication)
- 명령어 관찰: 스트링 8
- 분석: 화면(프론트엔드)에서는 명령만 내리고, 실제 파일 처리와 무거운 계산은 모두 Rust(백엔드) 플러그인이 처리하고 있다. 이것이 "가벼운 앱"의 정석.
결론: '정답' 세팅
qwer.exe 분석을 통해 얻은 최상의 스택은 다음과 같다:
- Framework: Tauri 2.0 (Stable)
- Logic Language: Rust (Plugins: fs, dialog, window-state, keyring 필수)
- UI Library: Svelte 5 (리스트에 React 흔적보다 가벼운 Tauri 템플릿 코드들이 더 많으므로 Svelte 추천)
- Security Update: 윈도우 표준 BCrypt와 Tauri keyring 플러그인 조합.
'무슨 부품을 사서 어떻게 조립했는지'는 앵간히 파악했다.
20. 'sql'로 필터링 결과.
a. 분석 결과: 이 앱은 '파일 판별사' 라이브러리를 쓴다.
이 거대한 리스트(application/pdf, image/png, application/zip 등...)는 개발자가 직접 친 코드가 아니다. 러스트의 infer 또는 mime_guess 같은 라이브러리의 흔적.
- 용도: 사용자가 파일을 드래그해서 넣거나, 문서를 다른 형식으로 내보낼 때(Export) 프로그램이 이 파일이 PDF인지, 이미지인지, 혹은 SQLite 데이터베이스 파일인지 정확히 알아내기 위해 사용.
b. '내보내기(Export)' 기능의 다양성
이 목록에는 epub, docx, pdf, rtf 등이 모두 들어 있다.
- 의미: qwer.exe가 사용자 문서를 다양한 포맷(전자책용 ePub, 한글/워드용 Docx)으로 변환해주는 기능을 아주 강력하게 지원하고 있다는 증거.
21. 추가 검색어
데이터를 저장하는 진짜 코드를 찾으려면 필터 칸에 다음 단어들을 입력. 더 소름 돋는 정보를 찾을 수 있다.
- CREATE TABLE 또는 INSERT INTO:
- 이게 나온다면 qwer.exe의 데이터베이스 설계도(어떤 표에 제목과 내용을 넣는지)를 통째로 볼 수 있다.
- SELECT:
- 저장된 문서를 어떻게 불러오는지 보여주는 쿼리문이 나온다.
- 스트링 9:
- 리스트에 잠깐 등장했는데, 이것은 qwer.exe 개발자가 직접 짠 로직의 별명일 가능성이 크다.
- 스트링 10 또는 스트링11:
- qwer.exe 전용 확장자명. 이 글자가 포함된 문자열을 추적하면 파일이 실제로 저장되는 경로 규칙을 알 수 있다.
22. ' serde_json'으로 필터링
serde_json은 Rust에서 데이터를 JSON 형식으로 변환(Serialize)하거나 읽어올 때(Deserialize) 쓰는 가장 대중적이고 표준적인 라이브러리. 이 결과가 대량으로 나왔다는 것은 다음과 같은 강력한 결론을 도출하게 한다.
a. qwer.exe는 SQL(DB) 대신 "JSON 파일"을 쓴다.
qwer.exe은 문서를 복잡한 데이터베이스에 저장하는 대신, 하나의 문서를 하나의 .json 파일(또는 자체 확장자)로 저장하고 있다.
- 구조: 제목, 사용자 설정, 문서 내용 등이 모두 JSON 객체로 정의되어 파일로 관리된다.
- 이유: 개별 파일로 관리하는 것이 클라우드 동기화(속도가 빠름)에 유리하고, 텍스트 위주인 데이터에는 복잡한 SQL보다 JSON이 훨씬 가볍기 때문.
b. "RawValue"의 의미: 최적화된 로직
리스트에 나오는 RawValue는 아주 중요한 단서.
- 분석: 데이터를 다 불러오지 않고, 필요한 부분만 빠르게 골라내거나 가공할 때 쓰는 고도화된 기능. 즉, qwer.exe는 수십만 자의 긴 문서를 다룰 때 메모리를 아끼기 위해 JSON을 매우 효율적으로 처리하고 있다. "가볍다"는 모토를 달성한 기술적 핵심 중 하나.
c. 개발 환경의 흔적 (Github Action 활용)
문자열에 포함된 스트링16 경로는 이 프로그램이 개발자의 PC가 아니라, GitHub Actions 같은 자동화된 빌드 서버에서 만들어졌음을 보여준다.
- qwer.exe 개발팀도 표준적인 Rust 빌드 워크플로우를 그대로 따르는 아주 정석적인 팀임을 알 수 있다.
#참고할 '저장 방식'
qwer.exe의 이 저장 구조(JSON-first)는 "심플하고 매우 가벼운 에디터"에 가장 적합한 모델.
- 데이터 저장: serde와 serde_json 라이브러리를 사용해 데이터를 파일 단위로 저장하는 구조를 만들자.
- 데이터 모델링: 아까 찾았던 스트링12 같은 구조를 Rust에서 만들자. (예: title, content, word_count 등을 필드로 가짐)
- 성능 방어: serde_json은 검증된 기술이므로 긴 문서에서도 버벅이지 않는다. 나중에 기능이 아주 많아지면(사용자 랭킹, 커뮤니티 등) 그때 가서 SQL을 고민해도 늦지 않다.
결론: 기드라 분석 총평
qwer.exe의 해부.
- 골격(Framework): Tauri 2.0 (최신형)
- 근육(Language): Rust
- 신경망(통신): IPC (Tauri Invoke)
- 저장 장소(Data): JSON 기반 로컬 파일 시스템
- 보안 시스템: Windows Keyring + 깃허브 배포 API
23. 'http'로 필터링 결과
http 필터링 결과는 qwer.exe의 통신 및 네트워크 내부 동작 방식을 완전히 보여주고 있다. 특히 주목해야 할 3가지 숨겨진 기술적 단서를 찾아냈다.
a. 웹 에셋(UI) 구동 방식: tiny_http 사용
가장 의외면서 흥미로운 발견은 tiny_http-0.12.0의 등장.
- 의미: Tauri는 보통 OS 내장 웹뷰를 쓰지만, 보안이나 성능상의 이유로 로컬에 아주 작은 '초경량 HTTP 서버'를 띄워 UI 파일을 주고받는 경우가 있다.
- 분석: qwer.exe는 매우 가벼운 tiny_http 라이브러리를 사용하여 사용자의 로컬 환경에서 웹 서버 역할을 하는 로직을 내장했다.
- 힌트: "매우 가벼운" 에디터를 만든다면, qwer.exe처럼 거대한 서버 프레임워크가 아닌, Rust에서 가장 가볍기로 소문난 tiny_http 같은 라이브러리를 통신 도구로 선택하는 것이 좋다.
b. 개발 도구의 흔적: Vite(비트) 사용 확정
- 단서: http://localhost:5173/
- 분석: 5173번 포트는 최신 프론트엔드 빌드 도구인 Vite의 기본 포트.
- 결론: qwer.exe는 Vite + (React/Svelte/Vue) 조합으로 프론트엔드를 개발했다는 뜻. 이 조합은 현재 웹 기술 중 가장 빠르고 가벼운 개발 방식. (Tauri와 함께 Svelte + Vite 스택을 쓰기로 결정한 것이 qwer.exe보다 더 나은 성능을 낼 수 있는 최선의 선택임을 다시 한번 입증.)
c. 고도화된 웹뷰 기능: 커스텀 프로토콜
- 단서: 스트링 13
- 분석: qwer.exe는 프로그램 내에서 일반 웹 주소(http) 외에 자신들만의 고유 주소 체계(스트링14)를 정의해서 쓰고 있다.
- 용도: 로컬 PC에 저장된 이미지나 글꼴을 불러올 때, 보안 정책(CORS)을 피하면서도 성능을 높이기 위해 Tauri의 Custom Asset Protocol 기술을 적극적으로 쓰고 있는 것.
#리버싱의 관점에서 본 "기술 보호의 허점" (매우 중요)
"프로그램의 보안(기술 유출)을 최소화해야 한다"는 관점에서, qwer.exe의 이번 결과를 보면 그 역면교사를 삼을 수 있다.
- 개발 환경 경로 노출: 스트링16 같은 문자열이 실행 파일 안에 그대로 남아 있다. 이는 빌드 시점에 panic = "abort" 설정을 하거나, 바이너리에서 디버그 문자열을 지워주는 strip 설정을 완벽하게 하지 않았다는 뜻.
- 명령어 텍스트 노출: 스트링15 같은 함수 이름이 기드라에서 너무 쉽게 보인다.
- 방어 전략: 에디터를 배포할 때는 다음과 같은 Rust 설정을 적용하여 위와 같은 흔적을 거의 완벽하게 지울 수 있습니다.
- tauri.conf.json에서 빌드 시 strip: true 적용.
- Cargo.toml에서 lto = true, panic = "abort" 설정 (최종 배포 시 경로 노출 방지).
이상으로 qwer.exe라는 가상의 프로그램을 뜯어서 살펴보는 '실행파일(.exe) 소스 코드 추출 하기 3부작'을 마칩니다.

'기타 개발' 카테고리의 다른 글
| 실행파일(.exe) 소스 코드 추출 하기 -2- (0) | 2026.05.23 |
|---|---|
| 실행파일(.exe) 소스 코드 추출 하기 -1- (0) | 2026.05.21 |
| 휴이온 KAMVAS 22 plus '커서중첩' 근본 원인 및 '간편해결책' (5) | 2025.08.14 |
| (휴이온 타블렛) KAMVAS 22 plus 커서 이상 현상 (0) | 2025.03.05 |
| (네트워크) DNS_PROBE_FINISHED_NXDOMAIN 해결 방법 (0) | 2025.03.03 |