{"id":49133326,"url":"https://github.com/flavouredtux/ember","last_synced_at":"2026-04-25T00:00:47.274Z","repository":{"id":352457878,"uuid":"1214501736","full_name":"FlavouredTux/Ember","owner":"FlavouredTux","description":"x86-64 decompiler built from first principles. ELF + Mach-O, IR + SSA, pseudo-C, QuickJS scripting.","archived":false,"fork":false,"pushed_at":"2026-04-23T21:44:19.000Z","size":2392,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-23T23:33:50.946Z","etag":null,"topics":["cpp","cpp23","decompiler","disassembler","elf","mach-o","reverse-engineering","x86-64"],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FlavouredTux.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-18T17:01:52.000Z","updated_at":"2026-04-23T21:44:23.000Z","dependencies_parsed_at":null,"dependency_job_id":"f1550d81-204e-4e98-80b7-59d21f60b4f1","html_url":"https://github.com/FlavouredTux/Ember","commit_stats":null,"previous_names":["flavouredtux/ember"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/FlavouredTux/Ember","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FlavouredTux%2FEmber","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FlavouredTux%2FEmber/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FlavouredTux%2FEmber/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FlavouredTux%2FEmber/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FlavouredTux","download_url":"https://codeload.github.com/FlavouredTux/Ember/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FlavouredTux%2FEmber/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32245151,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T13:21:15.438Z","status":"ssl_error","status_checked_at":"2026-04-24T13:21:15.005Z","response_time":64,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","cpp23","decompiler","disassembler","elf","mach-o","reverse-engineering","x86-64"],"created_at":"2026-04-21T20:00:39.398Z","updated_at":"2026-04-25T00:00:47.235Z","avatar_url":"https://github.com/FlavouredTux.png","language":"C++","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/mascot.png\" alt=\"Ember\" width=\"360\"\u003e\n\u003c/p\u003e\n\n# Ember\n\nA from-scratch reverse-engineering toolkit: ELF + Mach-O loader, x86-64\ndisassembler, IR lifter, SSA, cleanup passes, control-flow structuring,\npseudo-C emitter, a QuickJS scripting surface, and an Electron UI.\n\nNo Capstone. No Zydis. No Ghidra decompiler. Stdlib only (QuickJS-NG is\nvendored for scripting).\n\n![welcome screen](docs/welcome.png)\n\n![decompiler view](docs/main.png)\n\n## Build\n\nRequires a C++23 compiler (GCC 15+ or recent Clang) and CMake 3.28+.\n\n```sh\ncmake -S . -B build -DCMAKE_BUILD_TYPE=Release\ncmake --build build -j\n./build/cli/ember --help\n```\n\n### UI\n\nThe Electron UI lives in `ui/`. It shells out to the `ember` CLI binary.\n\n```sh\ncd ui\nnpm install\nnpm run dev\n```\n\nSet `EMBER_BIN` if the CLI isn't at `../build/cli/ember`.\n\n## CLI\n\n```\nember [options] \u003cbinary\u003e\n\n  -d, --disasm         linear disassembly of a function\n  -c, --cfg            control-flow graph of a function\n  -i, --ir             lifted IR of a function\n      --ssa            IR in SSA form (implies -i)\n  -O, --opt            run cleanup passes (implies --ssa)\n      --struct         structured regions (implies -O)\n  -p, --pseudo         pseudo-C output (implies --struct)\n  -X, --xrefs          emit full call graph (all fn -\u003e call targets)\n      --strings        dump printable strings (addr|text|xrefs)\n      --arities        dump inferred SysV arity per function\n  -s, --symbol NAME    target a specific symbol (default: main)\n      --annotations P  read user renames / signatures from a project file\n      --project PATH   project file scripts may read/write via project.*\n      --script PATH    run a JS file against the loaded binary\n      -- ARG...        pass remaining args to the script as argv\n      --cache-dir DIR  override ~/.cache/ember\n      --no-cache       bypass the on-disk cache\n```\n\n`--xrefs`, `--strings`, and `--arities` are cached to `~/.cache/ember/`\n(keyed on path + size + mtime). First run is slow; subsequent runs on the\nsame binary skip the analysis entirely.\n\n## Pipeline\n\n```\nELF   →  decoder  →  CFG       →  IR lift   →  SSA      →\ncleanup passes  →  structurer (if/while/switch)  →  pseudo-C\n```\n\nx86-64 only. ELF and Mach-O.\n\n## Scripting\n\n`--script PATH` runs a JavaScript file with the loaded binary exposed\nthrough `binary`, `xrefs`, `strings`, and (with `--project`) `project`.\n\n```sh\nember --script scripts/query.js \u003cbinary\u003e -- \u003ccommand\u003e [args...]\n```\n\n`scripts/query.js` is a generic dispatcher covering `info`, `imports`,\n`sections`, `bytes`, `disasm`, `func`, `pseudo-c`, `xrefs-to`, `callers`,\n`callees`, `strings`, `string-xrefs`, `find-func`, `find-bytes`, and more.\n\nMutations (`project.rename`, `setSignature`, `note`) stage into a pending\nbuffer; `project.commit()` writes them back to the project file. Every\nmutator also accepts `{ dryRun: true }` so agents can preview changes\nbefore committing.\n\n## Layout\n\n```\ncore/           C++23 library (everything except the CLI shim)\n  include/ember/   public headers\n  src/\n    binary/     ELF + Mach-O loaders\n    disasm/     x86-64 instruction decoder\n    analysis/   CFG builder, SysV arity inference, strings scanner\n    ir/         IR + x64 lifter + SSA builder + cleanup passes\n    structure/  region builder (if / while / switch)\n    decompile/  pseudo-C emitter\n    script/     QuickJS runtime + bindings\n    common/     annotations (project file), on-disk cache\ncli/            command-line driver\nscripts/        JS scripts that run against the CLI (query.js, etc.)\nui/             Electron + React + TypeScript frontend\ntests/          golden-output CTest suite\nthird_party/    vendored deps (QuickJS-NG)\n```\n\n## Tests\n\n```sh\ncmake --build build -j\nctest --test-dir build\n```\n\nFixtures are small C programs compiled at build time; output is diffed\nagainst checked-in goldens in `tests/golden/`. To accept an intentional\noutput change:\n\n```sh\nUPDATE_GOLDEN=1 ctest --test-dir build -V\n```\n\n## Status\n\nUnder active development. Output is readable enough to beat hand-reading\nx64, but edges are rough — particularly around indirect calls, sub-register\narithmetic corner cases, and switch cases whose default target happens to\nlie outside the table's bounds check.\n\n## License\n\nMIT. See [LICENSE](LICENSE). QuickJS-NG (vendored under `third_party/quickjs/`)\nis also MIT.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflavouredtux%2Fember","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflavouredtux%2Fember","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflavouredtux%2Fember/lists"}