{"id":13643037,"url":"https://github.com/justicerage/gepetto","last_synced_at":"2026-10-29T21:16:25.240Z","repository":{"id":64239042,"uuid":"574156195","full_name":"JusticeRage/Gepetto","owner":"JusticeRage","description":"IDA plugin which queries language models to speed up reverse-engineering","archived":false,"fork":false,"pushed_at":"2026-08-15T17:09:38.000Z","size":2357,"stargazers_count":3490,"open_issues_count":16,"forks_count":331,"subscribers_count":53,"default_branch":"main","last_synced_at":"2026-10-27T09:43:10.315Z","etag":null,"topics":["gpt-5-api","ida-pro","openai","python","reverse-engineering"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JusticeRage.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":"2022-12-04T15:48:48.000Z","updated_at":"2026-10-25T03:41:07.000Z","dependencies_parsed_at":"2023-11-09T23:06:44.987Z","dependency_job_id":"b7140686-ba23-4bf7-8d81-cacfe1a95ec8","html_url":"https://github.com/JusticeRage/Gepetto","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/JusticeRage/Gepetto","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JusticeRage%2FGepetto","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JusticeRage%2FGepetto/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JusticeRage%2FGepetto/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JusticeRage%2FGepetto/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JusticeRage","download_url":"https://codeload.github.com/JusticeRage/Gepetto/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JusticeRage%2FGepetto/sbom","scorecard":null,"funding_links":[],"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":346510206,"owners_count":38561632,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-10-03T21:59:58.778Z","status":"online","status_checked_at":"2026-10-27T02:00:05.503Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["gpt-5-api","ida-pro","openai","python","reverse-engineering"],"created_at":"2024-08-02T01:01:40.183Z","updated_at":"2026-10-27T20:22:58.524Z","avatar_url":"https://github.com/JusticeRage.png","language":"Python","funding_links":[],"categories":["Browser-extensions"],"sub_categories":[],"readme":"# Gepetto\r\n\r\nGepetto is a Python plugin which uses various large language models to provide meaning to functions \r\ndecompiled by IDA Pro (≥ 7.6). It can leverage them to explain what a function does, and to automatically \r\nrename its variables. Here is a simple example of what results it can provide in mere seconds:\r\n\r\n![](https://github.com/JusticeRage/Gepetto/blob/main/readme/comparison.png?raw=true)\r\n\r\n## Setup\r\n\r\n### Using hcli (Recommended)\r\nThe easiest way to install Gepetto is using the [Hex-Rays CLI tool (hcli)](https://github.com/HexRaysSA/ida-hcli):\r\n```bash\r\npip install ida-hcli\r\nhcli plugin install gepetto\r\n```\r\n\r\nThis will automatically install the plugin to your IDA user directory.\r\n\r\n### Manual Installation\r\nAlternatively, you can manually install the plugin:\r\n1. Drop this script (`gepetto.py`, as well as the `gepetto/` folder) into your IDA plugins folder (`$IDAUSR/plugins`).\r\n2. The plugins directory location depends on your system:\r\n   - **Windows**: `%APPDATA%\\Hex-Rays\\IDA Pro\\plugins\\`\r\n   - **macOS**: `~/.idapro/plugins/`\r\n   - **Linux**: `~/.idapro/plugins/`\r\n3. Install the required packages to IDA's Python installation. Find which interpreter IDA is using by checking the following registry key:\r\n   `Computer\\HKEY_CURRENT_USER\\Software\\Hex-Rays\\IDA` (default on Windows: `%LOCALAPPDATA%\\Programs\\Python\\Python39`).\r\n4. With the corresponding interpreter, simply run:\r\n   ```bash\r\n   [/path/to/python] -m pip install -r requirements.txt\r\n   ```\r\n\r\n### Configuration\r\n\r\nGepetto keeps its configuration in your IDA user directory, so it survives\r\nplugin upgrades:\r\n\r\n- **Windows**: `%APPDATA%\\Hex-Rays\\IDA Pro\\cfg\\gepetto\\config.ini`\r\n- **macOS / Linux**: `~/.idapro/cfg/gepetto/config.ini`\r\n\r\nThe first time the plugin runs it copies `gepetto/config.ini` there and tells\r\nyou the path on the console. After that, the copy shipped with the plugin is\r\nonly a template — edit the one in your user directory. Set `GEPETTO_CONFIG_DIR`\r\nto override the location entirely.\r\n\r\nAdd your API keys to that file, or supply them through the environment\r\nvariables named in it. For OpenAI, a key can be created on\r\n[this page](https://platform.openai.com/api-keys). Please note that API queries\r\nare usually not free (although not very expensive) and you will need to set up a\r\npayment method with the corresponding provider.\r\n\r\n## Supported models\r\n\r\n- [Anthropic](https://console.anthropic.com/)\r\n  - claude-opus-4-7\r\n  - claude-sonnet-4-6\r\n  - claude-haiku-4-5\r\n- [OpenAI](https://playground.openai.com/)\r\n  - gpt-5\r\n  - gpt-5-mini\r\n  - gpt-5-nano\r\n  - gpt-4-turbo\r\n  - gpt-4o\r\n  - o4-mini\r\n  - gpt-4.1\r\n  - o3\r\n  - o3-pro\r\n- [Google Gemini](https://ai.google.dev/)\r\n  - gemini-2.0-flash\r\n  - gemini-2.5-pro\r\n  - gemini-2.5-flash\r\n  - gemini-2.5-flash-lite-preview-06-17\r\n- [Azure OpenAI](https://ai.azure.com/)\r\n  - gpt-35-turbo\r\n  - gpt-35-turbo-1106\r\n  - gpt-35-turbo-16k\r\n  - gpt-4-turbo\r\n  - gpt-4-turbo-2024-0409-gs\r\n- [Ollama](https://ollama.com/)\r\n  - Any local model exposed through Ollama (will not appear if Ollama is not running)\r\n- [Groq](https://console.groq.com/playground)\r\n  - llama-3.1-70b-versatile\r\n  - llama-3.2-90b-text-preview\r\n  - mixtral-8x7b-32768\r\n- [Together](https://api.together.ai/)\r\n  - mistralai/Mixtral-8x22B-Instruct-v0.1 (does not support renaming variables)\r\n- [Novita AI](https://novita.ai/)\r\n  - deepseek/deepseek-r1\r\n  - deepseek/deepseek-v3\r\n  - meta-llama/llama-3.3-70b-instruct\r\n  - meta-llama/llama-3.1-70b-instruct\r\n  - meta-llama/llama-3.1-405b-instruct\r\n- [Kluster.ai](https://kluster.ai/)\r\n  - deepseek-ai/DeepSeek-R1\r\n  - deepseek-ai/DeepSeek-V3-0324\r\n  - google/gemma-3-27b-it\r\n  - klusterai/Meta-Llama-3.1-8B-Instruct-Turbo\r\n  - klusterai/Meta-Llama-3.1-405B-Instruct-Turbo\r\n  - klusterai/Meta-Llama-3.3-70B-Instruct-Turbo\r\n  - meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8\r\n  - meta-llama/Llama-4-Scout-17B-16E-Instruct\r\n  - Qwen/Qwen2.5-VL-7B-Instruct\r\n- [LM Studio](https://lmstudio.ai/)\r\n  - Any local model exposed through LM Studio (will not appear if LM Studio Developer server is not running)\r\n## Adding your own provider\r\n\r\nGepetto loads providers from three places, each overriding the last on a menu\r\nname collision: the modules shipped in `gepetto/models/`, then any `.py` file in\r\n`$IDAUSR/cfg/gepetto/providers/`, then any installed distribution advertising a\r\n`gepetto.providers` entry point. Overrides are announced on the console, so you\r\ncan replace a built-in provider without forking the plugin.\r\n\r\nA drop-in provider uses exactly the same contract as a built-in one. For an\r\nOpenAI-compatible endpoint, the whole file is:\r\n\r\n```python\r\nimport openai\r\nimport gepetto.config\r\nimport gepetto.models.model_manager\r\nfrom gepetto.models.openai import GPT\r\n\r\n\r\nclass MyProvider(GPT):\r\n    @staticmethod\r\n    def get_menu_name() -\u003e str:\r\n        return \"MyProvider\"\r\n\r\n    @staticmethod\r\n    def supported_models():\r\n        return [\"my-model-v1\"]\r\n\r\n    @staticmethod\r\n    def is_configured_properly() -\u003e bool:\r\n        return bool(gepetto.config.get_config(\"MyProvider\", \"API_KEY\", \"MYPROVIDER_API_KEY\"))\r\n\r\n    def __init__(self, model):\r\n        try:\r\n            super().__init__(model)\r\n        except ValueError:\r\n            pass  # No OpenAI key needed for this provider.\r\n        self.model = model\r\n        self.client = openai.OpenAI(\r\n            api_key=gepetto.config.get_config(\"MyProvider\", \"API_KEY\", \"MYPROVIDER_API_KEY\"),\r\n            base_url=\"https://api.example.com/v1\",\r\n        )\r\n\r\n\r\ngepetto.models.model_manager.register_model(MyProvider)\r\n```\r\n\r\nAdd a matching `[MyProvider]` section to your `config.ini` and restart IDA:\r\nproviders are registered at load time, so a new key or a new file needs a\r\nrestart before it appears in the menu.\r\n\r\nTo ship one as a package instead, expose the class or a\r\n`register(register_model)` callable:\r\n\r\n```toml\r\n[project.entry-points.\"gepetto.providers\"]\r\nmyprovider = \"myprovider:MyProvider\"\r\n```\r\n\r\nFiles in `providers/` execute arbitrary Python when IDA starts. That is the same\r\ntrust level as any IDA plugin, but only install providers you trust.\r\n\r\n## Usage\r\n\r\nOnce the plugin is installed properly, you should be able to invoke it from the context menu of IDA's pseudocode window,\r\nas shown in the screenshot below:\r\n\r\n![](https://github.com/JusticeRage/Gepetto/blob/main/readme/usage.png?raw=true)\r\n\r\nSwitch between models supported by Gepetto from the Edit \u003e Gepetto menu:\r\n\r\n![](https://github.com/JusticeRage/Gepetto/blob/main/readme/select_model.png?raw=true)\r\n\r\nGepetto also provides a CLI interface you can use to ask questions to the LLM directly from IDA. Make sure to select\r\n`Gepetto` in the input bar:\r\n\r\n![](https://github.com/JusticeRage/Gepetto/blob/main/readme/cli.png?raw=true)\r\n\r\n### Hotkeys\r\n\r\nThe following hotkeys are available:\r\n\r\n- Ask the model to explain the function: `Ctrl` + `Alt` + `G`\r\n- Ask the model to add comments to the code: `Ctrl` + `Alt` + `K`\r\n- Request better names for the function's variables: `Ctrl` + `Alt` + `R`\r\n\r\nInitial testing shows that asking for better names works better if you ask for an explanation of the function first – I\r\nassume because the model then uses its own comment to make more accurate suggestions.\r\nThere is an element of randomness to the AI's replies. If for some reason the initial response you get doesn't suit you,\r\nyou can always run the command again.\r\n\r\n## Limitations\r\n\r\n- The plugin requires access to the HexRays decompiler to function.\r\n- All supported LLMs are general-purpose and may very well get things wrong! Always be \r\n  critical of results returned!\r\n\r\n## Translations\r\n\r\nYou can change Gepetto's language by editing the locale in the configuration. For instance, to use the plugin\r\nin French, you would simply add:\r\n\r\n```ini\r\n[Gepetto]\r\nLANGUAGE = \"fr_FR\"\r\n```\r\n\r\nThe chosen locale must match the folder names in `gepetto/locales`. If the desired language isn't available,\r\nyou can contribute to the project by adding it yourself! Create a new folder for the desired locale\r\n(ex: `gepetto/locales/de_DE/LC_MESSAGES/`), and open a new pull request with the updated `.po` file, which you can\r\ncreate by copying and editing `gepetto/locales/gepetto.pot` (replace all the lines starting with `msgstr` with the\r\nlocalized version).\r\n\r\n## Acknowledgements\r\n\r\n- [OpenAI](https://openai.com), for making these incredible models, obviously\r\n- [Hex Rays](https://hex-rays.com/), the makers of IDA for their lightning fast support\r\n- [Kaspersky](https://kaspersky.com), for initially funding this project\r\n- [HarfangLab](https://harfanglab.io/), the current backer making this work possible\r\n- [@vanhauser-thc](https://github.com/vanhauser-thc) for contributing ideas of additional models and providers to support via his [fork](https://github.com/vanhauser-thc/gepetto/)\r\n- Everyone who contributed translations: @seifreed, @kot-igor, @ruzgarkanar, @orangetw\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjusticerage%2Fgepetto","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjusticerage%2Fgepetto","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjusticerage%2Fgepetto/lists"}