Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CLR-Unhook — I moderni prodotti di sicurezza (CrowdStrike, Bitdefender, SentinelOne, ecc.) eseguono l'hook della funzione nLoadImage all'interno di clr.dll per intercettare e scansionare i caricamenti di assembly .NET in memoria. Questo strumento rimuove l'hook di quella funzione. | Kitploit
Strumenti/GitHubGitHub/hwbp/clr-unhook
Strumenti DifensiviExploitPost-ExploitPenetration TestingRed TeamingSviluppo Payload
GitHubhwbp/clr-unhook

CLR-Unhook

I moderni prodotti di sicurezza (CrowdStrike, Bitdefender, SentinelOne, ecc.) eseguono l'hook della funzione nLoadImage all'interno di clr.dll per intercettare e scansionare i caricamenti di assembly .NET in memoria. Questo strumento rimuove l'hook di quella funzione.

Vedi Repository
2172219 mesi faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Strumento di Unhooking CLR

  • Nota: Per ottenere l'effetto di un CLR pulito, dovresti mappare manualmente la DLL dal disco in memoria. Non puoi usare LoadLibraryA/W, perché le soluzioni antivirus rileveranno l'evento di caricamento della DLL e potrebbero hookarla immediatamente. Se desideri questo comportamento, puoi cercare mapper manuali esistenti su GitHub e integrarne uno nel tuo codice. Non ne includo uno qui, poiché i vendor di AV generalmente non lo apprezzano.

Un'utilità C++ nativa che bypassa gli hook EDR/AV nel Common Language Runtime .NET ripristinando l'implementazione originale della funzione nLoadImage.

Descrizione Rapida

Questo strumento rimuove gli hook dei prodotti di sicurezza dalla funzione nLoadImage del CLR - il punto di ingresso nativo critico che gestisce tutto il caricamento degli assembly .NET in memoria. Leggendo il clr.dll pulito dal disco e sovrascrivendo i byte della funzione hookata in memoria, ripristina il comportamento originale del CLR, permettendo a Assembly.Load(byte[]) di essere eseguito senza ispezione o scansione EDR.

Cosa Fa?

I moderni prodotti di sicurezza (BitDefender, CrowdStrike, SentinelOne, ecc.) hookano la funzione all'interno di per intercettare e scansionare i caricamenti degli assembly .NET in memoria. Questo strumento rimuove l'hook di quella funzione:

nLoadImage
clr.dll
  1. Leggendo il clr.dll pulito dal disco
  2. Trovando i byte originali di nLoadImage
  3. Sovrascrivendo la versione hookata in memoria

Dopo l'unhooking, Assembly.Load(byte[]) viene eseguito senza ispezione EDR.

Capire nLoadImage

nLoadImage è la funzione nativa critica che gestisce tutti i caricamenti degli assembly in memoria nel runtime .NET. È dichiarata come InternalCall nel codice gestito, il che significa che non ha un'implementazione in C# - invece, è un ponte diretto verso il codice nativo del CLR.

La Catena di Chiamate:

root@kitploit:~
Managed Code (C#)
    ↓
Assembly.Load(byte[])
    ↓
RuntimeAssembly.nLoadImage(...) [InternalCall - no managed body]
    ↓
clr.dll!AssemblyNative::LoadImage (Native C++ implementation)
    ↓
Assembly loaded into AppDomain

Perché è Critico:

Quasi ogni caricamento di assembly in memoria passa attraverso nLoadImage. Il metodo Assembly.Load(byte[]) e i suoi overload (incluso il caricamento con byte di simboli) invocano tutti nLoadImage sotto il cofano. Quando chiami Assembly.Load(byte[]), il codice gestito in mscorlib.dll passa il tuo array di byte attraverso RuntimeAssembly.nLoadImage(), che è marcata con [MethodImpl(MethodImplOptions.InternalCall)] - ciò significa che il suo corpo è vuoto in C# e l'esecuzione salta immediatamente al codice nativo del CLR.

Anche scenari di generazione dinamica del codice - framework di serializzazione che emettono assembly in fase di esecuzione, generazione di serializzatori XML e strumenti red team come execute-assembly di Cobalt Strike - confluiscono tutti attraverso questa singola funzione.

Implementazione Nativa:

Lo stub InternalCall nLoadImage in mscorlib.dll punta alla funzione C++ nativa AssemblyNative::LoadImage all'interno di clr.dll. Questa funzione:

  • Analizza le intestazioni PE dall'array di byte
  • Convalida i metadati e il codice IL
  • Alloca memoria per l'assembly
  • Registra l'assembly nell'AppDomain
  • Attiva eventi post-caricamento (scansione ETW, AMSI in .NET 4.8+)
  • Gestisce assembly in modalità mista (nativo + gestito)
  • Applica la verifica del nome sicuro (strong-name)

In .NET Framework 4.8+, ogni chiamata nLoadImage passa automaticamente i byte dell'assembly all'AMSI di Windows Defender (AmsiScanBuffer) per la scansione prima dell'esecuzione, rendendolo un punto di strozzatura critico per i prodotti di sicurezza.

Firma della Funzione (.NET Framework 4.7+):

root@kitploit:~
[MethodImpl(MethodImplOptions.InternalCall)]
static internal extern Assembly nLoadImage(
    byte[] rawAssembly,              // PE bytes
    byte[] rawSymbolStore,           // Optional PDB bytes
    Evidence evidence,               // CAS evidence (obsolete)
    ref StackCrawlMark stackMark,    // Security stack marker
    bool fIntrospection,             // Reflection-only flag
    bool fSkipIntegrityCheck,        // Skip integrity validation
    SecurityContextSource securityContextSource  // Security context
);

Quando chiami Assembly.Load(byte[]), invoca nLoadImage con questi parametri tipici:

root@kitploit:~
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
return RuntimeAssembly.nLoadImage(
    rawAssembly,                            // Your byte array
    null,                                   // rawSymbolStore
    null,                                   // evidence
    ref stackMark,                          // LookForMyCaller
    false,                                  // fIntrospection
    SecurityContextSource.CurrentAssembly   // securityContextSource
);

Il parametro fIntrospection controlla se l'assembly viene caricato per l'esecuzione (false) o solo per ispezione tramite reflection (true). Il metodo Assembly.ReflectionOnlyLoad(byte[]) chiama nLoadImage con fIntrospection=true, permettendo l'esame dei metadati senza esecuzione del codice.

Perché EDR lo Hooka:

Poiché nLoadImage è il singolo punto di ingresso per tutti i caricamenti di assembly in memoria, i prodotti EDR lo hookano a livello nativo in clr.dll. Ciò consente loro di:

  • Ispezionare ogni assembly prima che venga caricato
  • Scansionare gli array di byte per pattern malevoli
  • Bloccare l'esecuzione prima ancora che .NET elabori l'assembly
  • Bypassare le tecniche di evasione AMSI/ETW (poiché l'hook è al di sotto di questi livelli)

I bypass tradizionali (patching di AMSI, disabilitazione di ETW) non influenzano gli hook a livello CLR perché operano a un livello più alto nello stack. L'hook avviene all'interno del CLR stesso, prima ancora che AMSI venga invocato.

Utilizzo

Processo Locale (Processo Corrente)

root@kitploit:~
CLRUnhook.exe

Rimuove l'hook del CLR nel processo corrente. Nota: Funziona solo se il CLR è già caricato (cioè, in esecuzione da un'applicazione .NET o dopo aver caricato manualmente il CLR).

Processo Remoto (Target di un Altro Processo)

root@kitploit:~
CLRUnhook.exe powershell.exe

CLRUnhook.exe 1234

Rimuove l'hook del CLR in un processo remoto.

Esempio di Output

Unhooking Remoto Riuscito

root@kitploit:~
=== CLR Unhooking Tool ===

[*] Mode -> Remote Process Unhooking
[*] Target -> PID 21436
[+] Found PID -> 21436
[*] Unhooking CLR->nLoadImage in remote process...
[DEBUG] Remote mode enabled
[DEBUG] Found clr.dll at 0x00007FFD38CB0000
[DEBUG] CLR path -> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
[DEBUG] CLR module size -> 10108928 bytes
[DEBUG] Read 10108928 bytes from remote process
[DEBUG] Searching for 'nLoadImage' in module (size: 10108928)
[DEBUG] Remote base address: 0x00007FFD38CB0000
[DEBUG] Scanning for string 'nLoadImage' (11 bytes)...
[DEBUG] Found string at RVA 0x7c12b8
[DEBUG] Searching for remote pointer: 0x7ffd394712b8
[DEBUG] Found pointer at offset 0x7a4340
[DEBUG] Valid function pointer found at RVA 0x5e4f30
[DEBUG] Found nLoadImage at RVA 0x00000000005E4F30
[DEBUG] Hooked function address -> 0x00007FFD39294F30
[DEBUG] Clean function at offset 0x00000000005E4F30 in disk file
[DEBUG] Reading hooked bytes before patch...
[DEBUG] First 16 bytes BEFORE unhook:
       4C 8B DC 49 89 5B 08 49 89 73 10 4D 89 4B 20 57
[DEBUG] Clean bytes from disk:
       8B 4B 78 E8 88 A9 EA FF C6 44 24 28 00 80 3D A4
[DEBUG] Wrote 30 bytes successfully
[DEBUG] First 16 bytes AFTER unhook:
       8B 4B 78 E8 88 A9 EA FF C6 44 24 28 00 80 3D A4
[DEBUG] VERIFICATION SUCCESS: Patched bytes match clean bytes!
[+] SUCCESS -> CLR nLoadImage unhooked in remote process!
[+] EDR/AV hooks bypassed

[*] Press Enter to exit...

La Catena dell'Hook

root@kitploit:~
Managed Code (C#)
    ↓
Assembly.Load(byte[])
    ↓
RuntimeAssembly.nLoadImage(...) [InternalCall]
    ↓
clr.dll!AssemblyNative::LoadImage
    ↓
[EDR HOOK] ← We bypass this
    ↓
Original CLR Code

Il Processo di Unhooking

  1. Localizzare la funzione hookata - Trova nLoadImage nel clr.dll caricato (attualmente hookato)
  2. Caricare copia pulita - Legge il clr.dll originale da C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
  3. Estrarre byte puliti - Ottiene i primi 30 byte della funzione originale, .net è JIT non vogliamo avere problemi.
  4. Sovrascrivere l'hook - Patcha la versione hookata con i byte puliti

Scoperta della Funzione

Usa la scansione di pattern per localizzare nLoadImage:

  1. Cercare la stringa "nLoadImage" nella memoria del modulo
  2. Trovare il puntatore a quella stringa
  3. Localizzare il puntatore alla funzione adiacente al puntatore alla stringa
  4. Validare che l'indirizzo sia entro i limiti del modulo

Crediti

Ricerca della Tecnica:

  • Matthew Graeber (@mattifestation) - Reverse engineering dei metodi InternalCall e degli interni del CLR

Implementazione:

  • HWBP - Unhooking del CLR tramite ripristino della memoria
  • @Evilbytecode - Mi ha aiutato con l'Unhooking, ho avuto alcuni problemi dovuti al fatto che .net è jit.

Disclaimer

SOLO PER RICERCA SULLA SICUREZZA AUTORIZZATA E A SCOPO EDUCATIVO.

L'uso non autorizzato di questo strumento per bypassare i controlli di sicurezza potrebbe violare le leggi sulla frode informatica (CFAA, leggi equivalenti). Utilizzare solo su sistemi di propria proprietà o per i quali si ha esplicita autorizzazione scritta per il test.

Riferimenti

  • Reverse Engineering InternalCall Methods - Matthew Graeber
  • Microsoft .NET Reference Source
  • Documentazione del Pipeline di Caricamento Assembly CLR

Scarica lo strumento