
A primeira análise de um binário ou pacote de aplicação: análise estática, sem execução, com evidências. CLI, servidor MCP com 15 ferramentas e interface web local, apenas Node.
English · Deutsch · Español · Français · Português (Brasil) · Русский · 中文 · 日本語 · 한국어
Experimente · Casos de uso · Instalação · O que ele lê · CLI · Interface Web · Para agentes de IA · Motores · Limites · Comparado com REA · Como funciona · Contribuindo · FAQ
Um primeiro olhar rápido, local e respaldado por evidências sobre software, para desenvolvedores e agentes de IA.
hexvero lê executáveis, aplicativos Electron, APKs, arquivos compactados, bancos de dados e capturas de rede sem executá-los. Ele informa o que o software contém, o que ele expõe, onde cada fato foi lido, quão certo ele é e o que não foi possível estabelecer. Uma CLI, um servidor MCP para agentes de codificação, uma interface web local. Nada sai da sua máquina.

npx hexvero analyze ./MyApp.app/Contents/Resources/app.asar
Node.js 22.12 ou mais recente é tudo o que ele precisa. A partir de um cache npm vazio, o primeiro resultado levou um comando e cerca de nove segundos num laptop, download incluído. Uma execução real na pequena aplicação Electron em examples/:
$ 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)
Um ponto preenchido é um fato lido do arquivo, um ponto vazio é uma inferência a partir de um padrão; @ main.js:14 é onde ele foi lido. As configurações são reportadas como escritas, nunca como padrões assumidos do Electron. ${…} marca a parte de um endereço que é calculada em tempo de execução. A coleção windows coloca o nodeIntegration, o contextIsolation e o sandbox de cada janela lado a lado como true, false, computed ou not written e diz o que decorre deles em conjunto; um valor que depende do padrão do Electron para a versão em package.json é marcado como default on / default off. As regras e suas fontes estão em docs/electron-findings.md. A descoberta de IPC é um ponto preenchido apenas quando todas as chamadas com forma de IPC puderam ser rastreadas; caso contrário, as limitações nomeiam as chamadas que não puderam, com arquivo e linha.
1. Entender uma aplicação desconhecida. Você baixou um binário, um aplicativo Electron ou um APK. O hexvero diz o que é, o que expõe e onde está a evidência, e sugere o que olhar a seguir. Em um programa nativo, ele nomeia o hardening e as importações que vale a pena examinar:
$ 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. Compare duas versões. O que mudou entre duas builds, lista por lista, com o item como evidência. Código que apenas foi movido não é reportado como alterado.
$ 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
Nada é ignorado por padrão; código que apenas se moveu num binário nativo é contado como relocated. As janelas são emparelhadas pela variável à qual são atribuídas (win), pelo que adicionar uma janela não emparelha mal as outras. Um item encontrado apenas de um lado é added ou removed apenas se o outro lado leu o ficheiro onde ele está; caso contrário é unknown (?).