Notepad++ Plugin Autoload Persistence & Execution
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Notepad++ caricherà automaticamente ogni plugin DLL trovata nelle sue sottocartelle plugins all’avvio. Posizionare un plugin maligno in qualsiasi installazione di Notepad++ scrivibile consente code execution all’interno di notepad++.exe ogni volta che l’editor viene avviato, sfruttabile per persistence, una initial execution stealthy, o come in-process loader se l’editor viene eseguito con privilegi elevati.
Posizioni plugin scrivibili
- Installazione standard:
C:\Program Files\Notepad++\plugins\<PluginName>\<PluginName>.dll(di solito richiede privilegi admin per scrivere). - Opzioni scrivibili per operatori a basso privilegio:
- Usa la portable Notepad++ build in una cartella scrivibile dall’utente.
- Copia
C:\Program Files\Notepad++in un percorso controllato dall’utente (es.,%LOCALAPPDATA%\npp\) e avvianotepad++.exeda lì. - Ogni plugin ottiene la propria sottocartella sotto
pluginsed è caricato automaticamente all’avvio; le voci di menu appaiono sotto Plugins.
Plugin load points (execution primitives)
Notepad++ si aspetta specifiche exported functions. Tutte vengono chiamate durante l’inizializzazione, offrendo multiple superfici di esecuzione:
DllMain— viene eseguito immediatamente al caricamento della DLL (primo punto di esecuzione).setInfo(NppData)— chiamato una volta al load per fornire gli handle di Notepad++; punto tipico per registrare voci di menu.getName()— restituisce il nome del plugin mostrato nel menu.getFuncsArray(int *nbF)— restituisce i comandi di menu; anche se vuoto, viene chiamato all’avvio.beNotified(SCNotification*)— riceve eventi dell’editor (apertura/modifica file, eventi UI) per trigger continui.messageProc(UINT, WPARAM, LPARAM)— gestore di messaggi, utile per scambi di dati più ampi.isUnicode()— flag di compatibilità verificato al load.
La maggior parte delle export può essere implementata come stubs; l’esecuzione può avvenire da DllMain o da qualsiasi callback sopra durante l’autoload.
Scheletro minimo di plugin malevolo
Compila una DLL con le exports attese e posizionala in plugins\\MyNewPlugin\\MyNewPlugin.dll sotto una cartella Notepad++ scrivibile:
BOOL APIENTRY DllMain(HMODULE h, DWORD r, LPVOID) { if (r == DLL_PROCESS_ATTACH) MessageBox(NULL, TEXT("Hello from Notepad++"), TEXT("MyNewPlugin"), MB_OK); return TRUE; }
extern "C" __declspec(dllexport) void setInfo(NppData) {}
extern "C" __declspec(dllexport) const TCHAR *getName() { return TEXT("MyNewPlugin"); }
extern "C" __declspec(dllexport) FuncItem *getFuncsArray(int *nbF) { *nbF = 0; return NULL; }
extern "C" __declspec(dllexport) void beNotified(SCNotification *) {}
extern "C" __declspec(dllexport) LRESULT messageProc(UINT, WPARAM, LPARAM) { return TRUE; }
extern "C" __declspec(dllexport) BOOL isUnicode() { return TRUE; }
- Compila la DLL (Visual Studio/MinGW).
- Crea la sottocartella plugin sotto
pluginse inserisci la DLL al suo interno. - Riavvia Notepad++; la DLL viene caricata automaticamente, eseguendo
DllMaine le callback successive.
Reflective loader plugin pattern
A weaponized plugin can turn Notepad++ into a reflective DLL loader:
- Presenta una voce UI/menu minima (e.g., “LoadDLL”).
- Accetta un file path o URL per recuperare una payload DLL.
- Reflectively map the DLL nel processo corrente e invoca un exported entry point (e.g., una loader function all’interno della DLL recuperata).
- Benefit: riutilizzare un processo GUI dall’aspetto benigno invece di spawnare un nuovo loader; il payload eredita l’integrità di
notepad++.exe(inclusi i contesti elevati). - Trade-offs: lasciare su disco una unsigned plugin DLL è rumoroso; considera il piggybacking su trusted plugins esistenti se presenti.
Note di rilevamento e hardening
- Blocca o monitora le scritture nelle directory dei plugin di Notepad++ (incluse le copie portable nei profili utente); abilita Controlled Folder Access o application allowlisting.
- Genera alert su nuove unsigned DLLs nella cartella
pluginse su attività insolite di child processes/network originate danotepad++.exe. - Imporre l’installazione dei plugin solo tramite Plugins Admin, e limitare l’esecuzione delle copie portable da percorsi non trusted.
Riferimenti
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.


