Notepad++ Plugin Autoload Persistence & Execution
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Notepad++ będzie autoload every plugin DLL found under its plugins subfolders przy uruchomieniu. Upuszczenie złośliwego pluginu do dowolnej writable Notepad++ installation daje wykonanie kodu wewnątrz notepad++.exe za każdym razem przy starcie edytora, co można wykorzystać do persistence, ukrytego initial execution, lub jako in-process loader, jeśli edytor zostanie uruchomiony z podwyższonymi uprawnieniami.
Writable plugin locations
- Standard install:
C:\Program Files\Notepad++\plugins\<PluginName>\<PluginName>.dll(zwykle wymaga uprawnień admina do zapisu). - Writable options for low-privileged operators:
- Use the portable Notepad++ build in a user-writable folder.
- Copy
C:\Program Files\Notepad++to a user-controlled path (e.g.,%LOCALAPPDATA%\npp\) and runnotepad++.exefrom there. - Each plugin gets its own subfolder under
pluginsand is loaded automatically at startup; menu entries appear under Plugins.
Plugin load points (execution primitives)
Notepad++ oczekuje konkretnych exported functions. Wszystkie są wywoływane podczas inicjalizacji, dając wielokrotne powierzchnie wykonawcze:
DllMain— uruchamia się natychmiast po załadowaniu DLL (pierwszy punkt wykonania).setInfo(NppData)— wywoływana raz przy ładowaniu w celu dostarczenia uchwytów Notepad++; typowe miejsce do rejestracji pozycji menu.getName()— zwraca nazwę pluginu wyświetlaną w menu.getFuncsArray(int *nbF)— zwraca polecenia menu; nawet jeśli pusta, jest wywoływana podczas uruchamiania.beNotified(SCNotification*)— odbiera zdarzenia edytora (otwarcie/zmiana pliku, zdarzenia UI) jako triggery dla dalszych działań.messageProc(UINT, WPARAM, LPARAM)— handler wiadomości, przydatny do wymiany większych danych.isUnicode()— flaga kompatybilności sprawdzana przy ładowaniu.
Większość eksportów może być zaimplementowana jako stubs; wykonanie może nastąpić z DllMain lub z dowolnego powyższego callbacku podczas autoload.
Minimal malicious plugin skeleton
Compile a DLL with the expected exports and place it in plugins\\MyNewPlugin\\MyNewPlugin.dll under a writable Notepad++ folder:
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; }
- Skompiluj DLL (Visual Studio/MinGW).
- Utwórz podfolder pluginu w
pluginsi umieść w nim DLL. - Zrestartuj Notepad++; DLL jest ładowany automatycznie, wykonując
DllMaini kolejne wywołania zwrotne.
Reflective loader plugin pattern
A weaponized plugin can turn Notepad++ into a reflective DLL loader:
- Udostępnij minimalny interfejs/menu (np. “LoadDLL”).
- Akceptuj ścieżkę pliku lub URL do pobrania payload DLL.
- Reflectively map the DLL into the current process and invoke an exported entry point (e.g., a loader function inside the fetched DLL).
- Korzyść: ponowne użycie pozornie nieszkodliwego procesu GUI zamiast uruchamiania nowego loadera; payload dziedziczy poziom integralności
notepad++.exe(w tym konteksty z podwyższonymi uprawnieniami). - Kompromisy: zapisanie na dysku unsigned plugin DLL jest głośne; rozważ piggybacking na istniejących zaufanych pluginach, jeśli są dostępne.
Detection and hardening notes
- Blokuj lub monitoruj writes to Notepad++ plugin directories (w tym przenośne kopie w profilach użytkowników); włącz Controlled Folder Access lub application allowlisting.
- Generuj alerty dla new unsigned DLLs w
pluginsoraz nietypowej child processes/network activity pochodzącej znotepad++.exe. - Wymuszaj instalację pluginów wyłącznie przez Plugins Admin, oraz ogranicz uruchamianie przenośnych kopii z nieznanych ścieżek.
References
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


