
Jormungandr is a kernel implementation of a COFF loader, allowing kernel developers to load and execute their COFFs in the kernel.
Jormungandr è un'implementazione kernel di un loader COFF, che consente agli sviluppatori di kernel di caricare ed eseguire i propri COFF nel kernel. L'unico tipo di COFF supportato è un COFF kernel x64 (ovvero un COFF che utilizza funzioni provenienti da NTOSKRNL o SSDT). Questo progetto non è supportato per l'esecuzione con VBS abilitato perché utilizza pool con permessi di esecuzione, ma dovrebbe funzionare su qualsiasi versione di Windows a partire da Windows 7.
Se non hai familiarità con COFF e il caricamento dei COFF, fai riferimento al post del blog di TrustedSec sui loader COFF.
Per comunicare con il driver, puoi utilizzare e compilare il file example con CMake. Questo è un esempio dell'utilizzo più basilare:
int main() {
HANDLE hDrv = CreateFile(DRIVER_NAME, GENERIC_WRITE | GENERIC_READ, 0, nullptr, OPEN_EXISTING, 0, nullptr);
// ...
BOOL result = WriteFile(hDrv, &data, sizeof(data), &bytesWritten, NULL);
// ...
}
Per eseguire l'esempio esistente, tutto ciò che devi fare è creare il tuo COFF oppure usare l'esempio:
JormungandrExample.exe example.out

Per scrivere un COFF kernel, crea un nuovo file C e importa le funzioni che desideri come segue:
DECLSPEC_IMPORT <FUNCTION_RETURN_TYPE> __cdecl <LIBRARY>$<FUNCTION_NAME>(<PARAMETERS>);
Sostituisci <FUNCTION_RETURN_TYPE> con il tipo di ritorno della funzione che desideri; <LIBRARY> può essere ntoskrnl o ntdll; il resto è la firma della funzione. Dopo aver importato la funzione, puoi usarla come sei abituato a fare quando scrivi codice.
Per compilare il COFF, usa mingw con il seguente comando:
x86_64-w64-mingw32-gcc -c example.c -o example.out
Per compilare il client, devi installare CMake e Visual Studio 2022 e poi eseguire:
cd <JORMUNGANDR PROJECT DIRECTORY>/Example
mkdir build
cd build
cmake ..
cmake --build .
Per compilare il progetto, avrai bisogno dei seguenti strumenti:
Clona il repository e compila il driver.
Per testarlo nel tuo ambiente di test, esegui questi comandi con cmd elevato:
bcdedit /set testsigning on
Dopo il riavvio, crea un servizio ed esegui il driver:
sc create nidhogg type= kernel binPath= C:\Path\To\Driver\Nidhogg.sys
sc start nidhogg
Per eseguire il debug del driver nel tuo ambiente di test, esegui questo comando con cmd elevato e riavvia il computer:
bcdedit /debug on
Dopo il riavvio, puoi vedere i messaggi di debug in strumenti come DebugView.
Un grande ringraziamento a tutte le persone che hanno contribuito a questo progetto: