LibreCode의 심장부: 작동 원리 심층 분석
이제 프로젝트의 내부 기술을 구체적인 세 가지 기둥으로 나누어 깊이 파헤쳐 보겠습니다.
1. 웹뷰가 없는 100% 네이티브 Avalonia UI
Avalonia UI는 .NET 생태계에서 ‘크로스플랫폼 WPF’라고 불릴 정도로 고성능과 유연성을 자랑하는 기술입니다. HTML/CSS/JavaScript로 화면을 그리는 일렉트론과 달리, Avalonia는 운영체제의 그래픽 API(DirectX, Metal, OpenGL)를 직접 호출하여 화면의 픽셀을 렌더링합니다.
덕분에 타이핑 지연(Latency)이 극도로 낮고, 대용량 로그 파일이나 수만 줄의 바이너리 헥스(Hex) 코드를 스크롤할 때도 버벅임이 발생하지 않습니다. 메모리 점유율 측면에서도 압도적인 차이를 보입니다.
아래의 클래스 다이어그램은 LibreCode의 내부 모듈이 어떻게 객체지향적으로 분리되어 관리되는지 보여줍니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
classDiagram
class CORE_MainApplication {
-SessionManager session
-ConfigLoader config
+InitializeNativeUI()
+RestoreState()
}
class UI_Workspace {
-FileExplorer explorer
-CodeEditor editor
-TerminalPanel terminal
+RenderAccelerated()
}
class AI_Copilot {
-OllamaConnector ollama
-VectorDatabase localDB
+EmbedCodeChunks()
+GenerateResponse()
}
class RE_Toolkit {
-ILDecoder il_decoder
-HexViewer hex
+BypassAntiDebug()
}
CORE_MainApplication --> UI_Workspace
UI_Workspace --> AI_Copilot
UI_Workspace --> RE_Toolkit
에디터는 세션 지속성(Session Persistence)을 자체적으로 관리합니다. 프로그램을 껐다 켜도 열려 있던 탭, 작업 중이던 파일, 프로젝트 폴더, 우측 패널의 상태, 심지어 AI와의 채팅 내역까지 이전 상태 그대로 즉시 복원됩니다.
2. 코드를 완벽하게 이해하는 로컬 RAG 파이프라인
단순히 프롬프트를 로컬 언어 모델에 전달하는 것만으로는 훌륭한 AI 에디터가 될 수 없습니다. 수백 개의 파일로 이루어진 프로젝트 구조를 AI가 파악해야만 의미 있는 코드 작성이 가능하죠. LibreCode는 이를 RAG(Retrieval-Augmented Generation, 검색 증강 생성) 아키텍처로 해결합니다.
과정은 다음과 같이 진행됩니다.
- 인덱싱(Indexing): 프로젝트 폴더를 열면 백그라운드에서 소스 코드들을 일정 크기의 조각(Chunk)으로 잘게 나눕니다.
- 임베딩(Embedding): 나누어진 코드 조각들을 Ollama(예: nomic-embed-text 모델)를 이용해 수학적 벡터(숫자 배열)로 변환하고 로컬 데이터베이스에 저장합니다.
- 질의(Querying): 사용자가 “사용자 인증 로직이 어디 있지?”라고 물으면, 이 질문 역시 벡터로 변환합니다.
- 유사도 검색(Cosine Similarity): 질문 벡터와 가장 거리가 가까운(관련성 높은) 코드 조각 5~10개를 데이터베이스에서 찾습니다.
- 생성(Generation): 찾아낸 코드 조각을 프롬프트에 숨겨서 LLM(예: Llama 3.2)에 전달하여 정확한 답변을 받아냅니다.
이 흐름을 시퀀스 다이어그램으로 시각화하면 그 구조가 더욱 명확해집니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
sequenceDiagram
participant Developer as 개발자
participant IDE as LibreCode UI
participant Indexer as 코드 인덱서
participant VectorDB as 로컬 벡터 DB
participant Ollama as Ollama (로컬 LLM)
Developer->>IDE: "현재 라우팅 로직의 버그를 고쳐줘"
IDE->>Indexer: 질문 컨텍스트 분석 시작
Indexer->>Ollama: 질문 텍스트 임베딩 요청
Ollama-->>Indexer: 텍스트 벡터 반환
Indexer->>VectorDB: 코사인 유사도 검색 (관련 코드 청크 추출)
VectorDB-->>Indexer: 최적의 코드 스니펫 3개 반환
Indexer-->>IDE: [코드 스니펫 + 사용자 질문] 병합
IDE->>Ollama: 최종 프롬프트 추론 요청
Ollama-->>IDE: 수정된 코드 및 해설 반환
IDE-->>Developer: 에디터 내 결과 출력
이러한 로컬 인덱싱 구조를 지탱하는 데이터 모델 간의 관계는 아래와 같이 구성됩니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
erDiagram
LOCAL_WORKSPACE {
string path
string active_branch
}
SOURCE_DOCUMENT {
string file_name
string extension
}
TEXT_CHUNK {
int start_line
int end_line
string content
}
VECTOR_EMBEDDING {
string model_name
float[] array_data
}
LOCAL_WORKSPACE ||--o{ SOURCE_DOCUMENT : "포함"
SOURCE_DOCUMENT ||--o{ TEXT_CHUNK : "파싱 및 분할"
TEXT_CHUNK ||--|| VECTOR_EMBEDDING : "벡터화"
사용자는 ‘Custom rules(사용자 지정 규칙)’를 설정하여 “항상 TypeScript를 사용해라”, “함수형 프로그래밍 스타일을 선호해라” 같은 전역 지침을 영구적으로 AI에게 주입할 수도 있습니다.
3. 해커와 리버서를 위한 전문가급 리버싱 툴킷
LibreCode를 다른 모든 에디터와 차별화하는 가장 강력한 무기가 바로 ‘리버싱(역공학) 툴킷’입니다. 일반적인 IDE에서는 볼 수 없는 이 기능은 악성코드 분석가나 보안 전문가들이 환호할 만한 심층적인 시스템 제어를 제공합니다.
Managed 환경 (.NET) 역공학 및 회피
.NET으로 컴파일된 프로그램은 IL(Intermediate Language)이라는 중간 언어로 번역됩니다. 분석을 피하려는 악성 앱들은 내부적으로 Debugger.IsAttached, IsDebuggerPresent, CheckRemoteDebuggerPresent 같은 API를 호출하여 디버거가 붙어 있는지 감시합니다.
LibreCode는 이러한 IL 코드를 실시간으로 디코드하고 스캔하여 감시 로직을 찾아냅니다. 그리고 ‘Evasion(회피)’ 탭을 통해 관리되는 .NET 검사 로직이 항상 “디버거가 연결되지 않음”을 반환하도록 강제하는 Harmony 패치(런타임 코드 조작 기법)를 자동으로 생성해 줍니다.
Unmanaged 환경 (ELF) 및 WASM 역공학
리눅스 환경의 C/C++ 프로그램(ELF)은 ptrace(PTRACE_TRACEME)나 /proc/self/status의 TracerPid 값을 읽어 디버거를 탐지합니다. LibreCode는 이러한 네이티브 호출을 탐지하고, rdtsc 명령어 기반의 타이밍 체크 로직이나 가짜 procfs(프로세스 파일 시스템)를 덮어씌워 탐지를 무력화하는 ‘Evasion Playbook’을 생성합니다.
또한 웹어셈블리(WASM) 바이너리의 경우 자바스크립트 호스트 환경에서 디버거 문자열이나 타이밍을 속이는 방법론을 제시하며, 크롬 개발자 도구 프로토콜(CDP)을 통한 라이브 브라우저 디버깅까지 에디터 내에서 처리합니다.
이러한 안티 디버깅(Anti-Debugging) 탐지 및 우회 흐름은 다음과 같은 상태 전이 구조를 갖습니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
stateDiagram-v2
[*] --> Target_Binary_Loaded
Target_Binary_Loaded --> Deep_Scanning : IL 또는 메모리 스캔
Deep_Scanning --> Evasion_Needed : 안티 디버깅 로직 발견
Deep_Scanning --> Safe_Execution : 탐지 로직 없음
Evasion_Needed --> Generating_Patch : Harmony 패치 / 후킹 코드 생성
Generating_Patch --> Applying_Detour : 메모리 상에 우회 로직 덮어쓰기
Applying_Detour --> Safe_Execution : 디버거 탐지 무력화 완료
Safe_Execution --> Live_Debugging_Active
Live_Debugging_Active --> [*]
애초에 LibreCode의 내부 디버거는 인터프리터(해석기) 방식으로 동작하므로, 실제 운영체제 수준의 디버거 프로세스를 타겟에 붙이지 않습니다. 따라서 타겟 프로그램은 ‘구조적으로’ 디버거의 존재를 눈치챌 수 없습니다. 진정한 의미의 스텔스 분석 환경입니다.