Package IDA Pro plugins for the IDA Plugin Manager and plugins.hex-rays.com repository
Instalação
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Package IDA Pro plugins for the IDA Plugin Manager and plugins.hex-rays.com repository
Packaging IDA Pro Plugins
This skill helps package IDA Pro plugins for distribution via the IDA Plugin Manager and the plugins.hex-rays.com repository. It covers creating and updating the ida-plugin.json manifest, packaging archives, and publishing via GitHub Releases.
Overview
The IDA Plugin Manager is a self-service ecosystem for discovering, installing, and sharing IDA plugins:
Discovery: A daily indexer scans GitHub for repositories containing ida-plugin.json
The ida-plugin.json file defines the root of the plugin. When a plugin is installed, only the directory containing ida-plugin.json (and its subdirectories) is copied to $IDAUSR/plugins/. Nothing outside this directory is included.
Assessing Directory Structure Compatibility
Before packaging, verify that your plugin's structure is self-contained:
# GOOD: All plugin code is in the same directory as ida-plugin.json
my-repo/
├── ida-plugin.json # Plugin root
├── my_plugin.py # Entry point - INCLUDED
├── my_plugin_lib/ # Supporting code - INCLUDED
│ └── helpers.py
├── README.md # Plugin README - INCLUDED (shown on web)
└── assets/
└── logo.png # Logo - INCLUDED
# BAD: Plugin code outside the ida-plugin.json directory
my-repo/
├── plugin/
│ └── ida-plugin.json # Plugin root is here
├── src/ # NOT INCLUDED - outside plugin root!
│ └── my_plugin.py # This file won't be installed!
└── README.md # NOT INCLUDED - wrong directory!
Compatibility Checklist
When assessing an existing plugin, verify:
Entry point location: Is entryPoint in the same directory as ida-plugin.json?
All imports resolvable: Are all Python imports within the plugin root or in pythonDependencies?
No parent directory references: Does the code use ../ to access files outside the plugin root?
Assets included: Are logos, data files, or resources inside the plugin root?
README placement: Is README.md in the plugin root (not repo root) for web display?
Common Restructuring Patterns
Pattern 1: Plugin in subdirectory
If your plugin code is in a subdirectory like src/ or plugin/, move ida-plugin.json into that directory:
# Before # After
my-repo/ my-repo/
├── ida-plugin.json └── src/
└── src/ ├── ida-plugin.json # Moved here
└── my_plugin.py ├── my_plugin.py
└── README.md # Add for web
Pattern 2: Monorepo with IDA plugin
For projects where IDA plugin is one component (e.g., capa), place ida-plugin.json at the plugin code's location:
capa/
├── capa/
│ ├── ida/
│ │ └── plugin/
│ │ ├── ida-plugin.json # Plugin root
│ │ ├── capa_explorer.py # Entry point
│ │ └── README.md # Plugin-specific docs
│ └── main.py # Not included in IDA plugin
└── README.md # Repo README - not the plugin README
README in Plugin Root
Place a README.md file in the same directory as ida-plugin.json to have it displayed on the plugins.hex-rays.com web interface. This is separate from your repository's root README:
my-plugin/
├── ida-plugin.json
├── my_plugin.py
└── README.md # This README appears on plugins.hex-rays.com
The plugin README should focus on:
What the plugin does
How to use it within IDA
Configuration options (if using settings)
Screenshots or examples
It does not need installation instructions (the Plugin Manager handles that).
The ida-plugin.json Manifest
Every plugin requires an ida-plugin.json file in its root directory. This is the only required file beyond the plugin code itself. Paths in the metadata file are relative to the metadata file, because the metadata file defines the root of the plugin, even if its nested within a ZIP archive.
Complete Schema
{"IDAMetadataDescriptorVersion":1,"plugin":{"name":"my-plugin","version":"1.0.0","entryPoint":"my_plugin.py","description":"A one-line description of what this plugin does","license":"MIT","urls":{"repository":"https://github.com/org/my-plugin","homepage":"https://example.com/my-plugin"},"authors":[{"name":"Author Name","email":"author@example.com"}],"maintainers":[{"name":"Maintainer Name","email":"maintainer@example.com"}],"idaVersions":["9.0","9.1","9.2"],"platforms":["windows-x86_64","linux-x86_64","macos-x86_64","macos-aarch64"],"categories":["malware-analysis"],"keywords":["analysis","automation"],"pythonDependencies":["requests>=2.0","pydantic>=2"],"logoPath":"assets/logo.png","settings":[]}}
Required Fields
Field
Type
Description
IDAMetadataDescriptorVersion
1
Always set to 1
plugin.name
string
Unique identifier. ASCII letters, digits, underscores, hyphens only. No leading/trailing _ or -. Used to derive the IDA namespace: __plugins__my_plugin
plugin.version
string
Semantic version x.y.z format. No leading v
plugin.entryPoint
string
Entry point filename (e.g., my_plugin.py) or bare name for native plugins
For plugins requiring user configuration, declare settings in the manifest. Users configure these via hcli plugin config or the IDA GUI.
Settings Schema
{"settings":[{"key":"api_key","name":"API Key","type":"string","required":true,"documentation":"Your API key for the service"},{"key":"endpoint","name":"API Endpoint","type":"string","required":false,"default":"https://api.example.com","validation_pattern":"^https://.*$"},{"key":"log_level","name":"Log Level","type":"string","required":false,"choices":["debug","info","warning","error"],"default":"info"},{"key":"enable_telemetry","name":"Enable Telemetry","type":"boolean","required":false,"default":false}]}
Setting Fields
Field
Type
Required
Description
key
string
yes
Code-level identifier (e.g., api_key)
name
string
yes
Human-readable label (e.g., API Key)
type
"string" or "boolean"
yes
Value type
required
boolean
yes
Whether user must provide a value
documentation
string
no
Help text for users
default
string or boolean
no
Default value if not configured
validation_pattern
string
no
Regex for validating string values
choices
array of strings
no
Allowed values (mutually exclusive with validation_pattern)
Accessing Settings in Plugin Code
Use the ida-settings library:
from ida_settings import get_current_plugin_setting
api_key = get_current_plugin_setting("api_key")
log_level = get_current_plugin_setting("log_level")
Validation
Always validate before publishing:
# Validate a directory
hcli plugin lint /path/to/my-plugin
# Validate a ZIP archive
hcli plugin lint /path/to/my-plugin.zip
The linter checks:
JSON syntax and schema compliance
Required fields present
Entry point file exists
Logo file exists (if declared)
Platform/binary consistency
Path safety (no traversals)
Publishing to the Repository
Step 1: Create a GitHub Release
Tag your commit: git tag v1.0.0 && git push --tags
Create a GitHub Release from the tag
Attach your plugin archive (ZIP)
Step 2: Automatic Indexing
The indexer runs daily and automatically discovers:
Repositories with ida-plugin.json in the root
GitHub Releases with valid plugin archives
No manual registration required. Your plugin appears within 24 hours.
Step 3: Explicit Registration (Optional)
To expedite indexing, add your repository to known-repositories.txt: