
바이너리 또는 앱 번들을 처음 살펴보기: 증거와 함께 실행 없이 수행하는 정적 분석. CLI, 15개 도구 MCP 서버 및 로컬 웹 UI, Node만 사용.
English · Deutsch · Español · Français · Português (Brasil) · Русский · 中文 · 日本語 · 한국어
사용해 보기 · 사용 사례 · 설치 · 읽는 대상 · CLI · 웹 UI · AI 에이전트용 · 엔진 · 한계 · REA와 비교 · 작동 방식 · 기여 · FAQ
개발자와 AI 에이전트를 위한 빠르고 로컬이며 증거에 기반한 소프트웨어 첫 살펴보기.
hexvero는 실행 파일, Electron 앱, APK, 아카이브, 데이터베이스, 네트워크 캡처를 실행하지 않고 읽습니다. 소프트웨어에 무엇이 들어 있는지, 무엇을 노출하는지, 각 사실을 어디에서 읽었는지, 얼마나 확실한지, 그리고 무엇을 확인할 수 없었는지 알려줍니다. 하나의 CLI, 코딩 에이전트를 위한 하나의 MCP 서버, 하나의 로컬 웹 UI. 어떤 것도 여러분의 컴퓨터를 떠나지 않습니다.

npx hexvero analyze ./MyApp.app/Contents/Resources/app.asar
Node.js 22.12 이상이면 충분합니다. 빈 npm 캐시에서 첫 결과는 노트북 기준으로 다운로드를 포함해 명령어 하나와 약 9초가 걸렸습니다. examples/에 있는 작은 Electron 앱에서의 실제 실행 결과:
$ hexvero analyze examples/notesdesk-1.4.0.asar
Summary
Electron ASAR: 4 JavaScript modules, 6 IPC channels
Findings
○ nodeIntegration: true in a BrowserWindow @ main.js:14
contextIsolation is on for the same window, so page scripts do not get require(). Node integration keeps the renderer out of the Chromium sandbox.
○ sandbox: false in a BrowserWindow @ main.js:15
The renderer process runs without the Chromium sandbox.
● 6 IPC channels @ main.js:25
app:quit, notes:list, notes:save, settings:get, settings:set, shell:open (collections ipcChannels, ipc)
● 6 members exposed to pages as window.notesdesk @ preload.js:4
getSetting, setSetting, listNotes, saveNote, quit, openInShell (collection contextBridge)
○ 2 network endpoints read from the code @ renderer/app.bundle.js:11
${…}/notes/sync, https://telemetry.notesdesk.example/collect (collection endpoints)
● 1 storage key read from the code @ renderer/app.bundle.js:10
notesdesk.token (collection storage)
… (preload script, list of collections)
Next
Which IPC channels can a page reach, and who handles them?
hexvero collection examples/notesdesk-1.4.0.asar ipcChannels
What does the preload script expose to web content?
hexvero collection examples/notesdesk-1.4.0.asar contextBridge
… (two more)
채워진 점은 파일에서 읽은 사실이고, 빈 점은 패턴에서 추론한 것이며, @ main.js:14는 그것을 읽은 위치입니다. 설정은 작성된 그대로 보고되며, 가정된 Electron 기본값으로 보고되지 않습니다. ${…}는 주소에서 런타임에 계산되는 부분을 표시합니다. windows 컬렉션은 각 창의 nodeIntegration, contextIsolation, sandbox를 true, false, computed, not written으로 나란히 배치하고, 이들로부터 함께 도출되는 결론을 제시합니다. package.json에 있는 버전의 Electron 기본값에 의존하는 값은 default on / default off로 표시됩니다. 규칙과 그 출처는 docs/electron-findings.md에 있습니다. IPC 발견은 모든 IPC 형태의 호출을 추적할 수 있었을 때만 채워진 점이 됩니다. 그렇지 않으면 한계 항목에 추적할 수 없었던 호출을 파일과 줄 번호와 함께 명시합니다.
1. 낯선 애플리케이션 이해하기. 바이너리, Electron 앱 또는 APK를 다운로드했습니다. hexvero는 그것이 무엇인지, 무엇을 노출하는지, 증거가 어디에 있는지 알려주고, 다음으로 살펴볼 것을 제안합니다. 네이티브 프로그램에서는 하드닝과 살펴볼 만한 임포트를 명시합니다:
$ cc -O2 -o demo examples/native/demo-v2.c && hexvero analyze demo
Findings
● Imports functions that start other programs or a shell: system
Read from the import table. Whether and with what input they are called is not established by static reading; a call graph (hexvero calls) shows who calls them. (collection imports)
● Hardening: PIE yes, stack canary no, ARC no, code signature yes, stripped yes
$ hexvero calls demo radare2 main --goal system # with radare2, rizin or Ghidra installed
radare2 path main → sym.imp.system · found
main
└ sym._run_tool
└ sym.imp.system
2. 두 버전 비교. 두 빌드 사이에 무엇이 변경되었는지, 목록별로, 항목을 증거로 제시합니다. 단순히 이동만 한 코드는 변경된 것으로 보고되지 않습니다.
$ hexvero compare examples/notesdesk-1.4.0.asar examples/notesdesk-1.5.0.asar webPreferences
webPreferences: 0 added, 0 removed, 2 changed, 2 unchanged · matched by file+windowName+key
~ main.js::win::nodeIntegration value: true → false
~ main.js::win::sandbox value: false → true
$ hexvero compare examples/notesdesk-1.4.0.asar examples/notesdesk-1.5.0.asar windows
windows: 0 added, 0 removed, 1 changed, 0 unchanged · matched by file+windowName
~ main.js::win nodeIntegration: true → false, nodeIntegrationInEffect: "on" → "off", sandbox: false → true, sandboxInEffect: "off" → "on"
$ hexvero compare examples/notesdesk-1.4.0.asar examples/notesdesk-1.5.0.asar contextBridge
contextBridge: 1 added, 1 removed, 0 changed, 5 unchanged · matched by api+member
+ notesdesk::checkUpdate
- notesdesk::openInShell
기본적으로 아무것도 무시되지 않습니다. 네이티브 바이너리에서 위치만 이동한 코드는 relocated로 집계됩니다. 창은 할당된 변수(win)를 기준으로 매칭되므로, 창을 추가해도 다른 창들의 짝이 잘못 맞춰지지 않습니다. 한쪽에서만 발견된 항목은, 반대쪽에서 그 항목이 위치한 파일을 읽은 경우에만 added 또는 removed가 되며, 그렇지 않으면 unknown(?)입니다.
3. AI 에이전트가 조사하도록 하세요. npx hexvero setup --apply는 발견된 코딩 에이전트(Claude Code, Codex, Cursor, VS Code 외 14개)에 MCP 서버를 등록하고, npx hexvero setup --skill --apply는 조사 루프를 가르치는 스킬을 설치합니다. 그러면 에이전트는 대상을 열고, 제안된 다음 호출과 함께 작은 첫 답변을 읽고, 필요한 목록만 페이지 단위로 읽으며, 각 주장마다 file:line을 인용합니다. 대상 내부의 텍스트는 데이터로 취급되며 절대 지시로 취급되지 않습니다. 이를 확인하기 위해 테스트에서 그러한 텍스트를 대상에 심어 둡니다. AI 에이전트용을 참고하세요.