shadow1ng/fscan · error
local_pe_not_specified
Error message
local_pe_not_specified
What it means
WinIFEOPlugin.Scan (Image File Execution Options hijacking plugin) requires a local PE file path from session.Config.WinPEFile, since the IFEO Debugger key must point at an executable. When the config field is empty, Scan returns a failed Result with the localized "local_pe_not_specified" message before touching the registry. It is pure input validation.
Source
Thrown at plugins/local/winifeo.go:29
"strings"
"github.com/shadow1ng/fscan/common"
"github.com/shadow1ng/fscan/common/i18n"
"github.com/shadow1ng/fscan/plugins"
)
type WinIFEOPlugin struct {
plugins.BasePlugin
}
func NewWinIFEOPlugin() *WinIFEOPlugin {
return &WinIFEOPlugin{BasePlugin: plugins.NewBasePlugin("winifeo")}
}
func (p *WinIFEOPlugin) Scan(ctx context.Context, info *common.HostInfo, session *common.ScanSession) *plugins.Result {
pePath := session.Config.WinPEFile
if pePath == "" {
return &plugins.Result{Success: false, Error: fmt.Errorf("%s", i18n.GetText("local_pe_not_specified"))}
}
if _, err := os.Stat(pePath); err != nil {
return &plugins.Result{Success: false, Error: fmt.Errorf("%s", i18n.Tr("local_pe_not_found", pePath))}
}
absPath, _ := filepath.Abs(pePath)
// 劫持目标:不常用但系统存在的程序
targets := []struct {
exe string
desc string
}{
{"sethc.exe", i18n.GetText("winifeo_sticky_keys")},
{"utilman.exe", i18n.GetText("winifeo_accessibility")},
{"narrator.exe", i18n.GetText("winifeo_narrator")},
}
var output strings.BuilderView on GitHub (pinned to 95cc12e753)
Solutions
- Provide the local PE path via the config option that sets session.Config.WinPEFile before enabling winifeo.
- Double-check the config file section the plugin reads and that the key is spelled per current docs.
- If calling Scan programmatically, assign an absolute PE path to session.Config.WinPEFile first.
Example fix
// before // session.Config.WinPEFile not set -> local_pe_not_specified // after session.Config.WinPEFile = "C:\\tools\\payload.exe" // then run with plugin winifeo
Defensive patterns
Strategy: validation
Validate before calling
// Reject empty PE path before calling the winifeo plugin
if session.Config.WinPEFile == "" {
return errors.New("winifeo requires session.Config.WinPEFile to be set")
} Try / catch
result := plugin.Scan(ctx, host, session)
if result != nil && !result.Success && result.Error.Error() == i18n.GetText("local_pe_not_specified") {
// guide the user to set the PE path option
} Prevention
- Pair every IFEO-plugin enablement with an explicit PE path value.
- Add a config sanity check (required fields per enabled plugin) at startup.
- Keep a sample config with WinPEFile filled in as a template.
When it happens
Trigger: Scan is invoked while session.Config.WinPEFile == "" — the winifeo plugin was enabled without supplying the local PE path in the scan config.
Common situations: Missing --winpe-file style CLI flag when enabling winifeo, wrong config section/profile so the key isn't loaded, or the key renamed across versions so an old config value is dropped silently.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
Related errors
AI-assisted analysis of shadow1ng/fscan@95cc12e753 (2026-09-06).
Data as JSON: /api/errors/013c47e36becaf76.
Report an issue: GitHub.