Engines plugins, just like any JEB extension (parser, script, etc.) use the JEB API.

They are loaded when JEB starts. Unlike parsers, their role is not to process input data to produce units; they are meant to perform pointed tasks. They react to events issued by units (an `IUnit` is an `IEventSource`). They can also be called on-demand by clients.

From a programmer's standpoint, engines plugins extend the `IEnginesPlugin` (whereas processor plugins extend the `IUnitIdentifier` interface).

# Sample Plugins
Sample plugins can be found on our GitHub account. Examples:

- [Andhook](https://github.com/pnfsoftware/jeb2-andhook): Android Cryptographic Primitives Hooking using the JEB Debuggers API
- [Androsig](https://github.com/pnfsoftware/jeb-androsig): Android library code signing and matching (**no longer maintained**)
- [VTPlugin](https://github.com/pnfsoftware/jeb-samplecode/tree/master/plugins/src/com/pnf/vtplugin): pulls sample information from VirusTotal information

# Skeleton Plugin
Full source code: [Sample plugin skeleton on GitHub](https://github.com/pnfsoftware/jeb-samplecode/blob/master/plugins/src/com/pnf/plugintest/SampleEnginesPlugin.java)
```java
public class SampleEnginesPlugin implements IEnginesPlugin {
    private static final ILogger logger = GlobalLog.getLogger(SampleEnginesPlugin.class);

    @Override
    public IPluginInformation getPluginInformation() {
        return new PluginInformation("Sample Plugin", "A sample JEB plugin", "PNF Software", Version.create(1, 0));
    }

    @Override
    public List<? extends IOptionDefinition> getExecutionOptionDefinitions() {
        return null;
    }

    @Override
    public void execute(IEnginesContext context) {
        execute(context, null);
    }

    @Override
    public void execute(IEnginesContext engctx, Map<String, String> executionOptions) {
        logger.info("Executing sample plugin");
    }

    @Override
    public void dispose() {
    }
}
```
