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.Builder

View on GitHub (pinned to 95cc12e753)

Solutions

  1. Provide the local PE path via the config option that sets session.Config.WinPEFile before enabling winifeo.
  2. Double-check the config file section the plugin reads and that the key is spelled per current docs.
  3. 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

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.