
Caricatore dinamico di shellcode con sofisticate capacità di evasione
AsmLdr è un avanzato loader di shellcode implementato in assembly x64, progettato per ambienti Windows x64. Il suo scopo principale è eseguire payload crittografati riducendo al minimo il rilevamento da parte di software antivirus avanzati, sistemi di endpoint detection and response (EDR), sandbox e debugger. Ottiene questo risultato risolvendo dinamicamente moduli, API e syscall a runtime, eliminando dipendenze statiche come tabelle di importazione o indirizzi hardcoded. Questo approccio crea un binario compatto con un basso profilo di rilevamento.
Il loader utilizza il module stomping per inserire lo shellcode nella sezione eseguibile di una DLL esistente, decrittografa il payload in memoria e lo esegue tramite syscall indirette con stack spoofing. Include funzionalità di evasione come misure anti-debug, regolazioni temporali per imitare i modelli applicativi normali e bypass del tracciamento eventi di Windows (ETW). Queste capacità lo rendono uno strumento per red teaming e ricerca sulla sicurezza. Nota etica: Questo progetto è solo a scopo educativo e di ricerca. Dimostra meccanismi interni di Windows a basso livello, tra cui l'attraversamento del PEB, l'analisi della tabella delle esportazioni, l'unhooking delle syscall e la manipolazione delle protezioni di memoria. Utilizzarlo in ambienti controllati (ad es. VM). L'uso improprio per attività dannose è illegale e non etico. L'autore declina ogni responsabilità per un uso improprio.
AsmLdr offre una serie di funzionalità per l'esecuzione stealth di payload e l'evasione. Ciascuna è descritta di seguito, con particolare attenzione alla sua funzione e ai suoi vantaggi:
Risoluzione dei Moduli tramite Attraversamento del PEB: Il loader elenca i moduli in esecuzione seguendo la catena dei moduli del PEB. Confronta i nomi dei moduli tramite confronti Unicode per trovare e restituire l'indirizzo di base della DLL desiderata. Questo metodo bypassa le funzioni di caricamento standard, riducendo il rischio di intercettazione.
Risoluzione delle API dalle Tabelle di Esportazione: Il loader esamina la directory delle esportazioni di una DLL per individuare le funzioni. Abbina le API usando hash o, opzionalmente, controlli diretti dei nomi con verifica della lunghezza per evitare confusione tra nomi di funzioni simili. Questo fornisce l'indirizzo della funzione senza dipendere da import pre-collegati.
Protezioni Anti-Debug: Il loader rileva il debugging tramite molteplici controlli e termina in modo pulito se uno qualsiasi indica un'analisi.
Generazione di Codice Spazzatura per la Resistenza all'Analisi: Il loader esegue sequenze di operazioni non essenziali per creare pattern confusi nel disassembly, rendendo l'analisi statica più difficile senza influire sull'efficienza a runtime.
Normalizzazione Temporale e Comportamentale: Il loader misura la velocità del sistema per eseguire carichi di lavoro simulati che corrispondono ai modelli applicativi normali, aiutandolo a mimetizzarsi con i processi legittimi. Inoltre, si mette in pausa brevemente prima delle azioni chiave per normalizzare i tempi di esecuzione.
Bypass della Registrazione ETW: Il loader imposta breakpoint hardware sulle API di registrazione ETW per intercettare e saltare le chiamate di registrazione eventi, impedendo tracce nei log di sistema.
Unhooking a Più Livelli: Il loader recupera dinamicamente i numeri di syscall validi (SSN) controllando direttamente le funzioni, scansionando il codice vicino se hookato, oppure contando i pattern in ntdll per stimarne il numero, adattandosi alle eccezioni note.
Tecniche utilizzate:
Syscall Indirette e Stack Spoofing: Il loader trova percorsi di codice puliti in ntdll per le syscall e incatena fino a 32 operazioni, nascondendo lo stack delle chiamate per eludere il tracing. Ripristina lo stato originale al termine.
DLL Hollowing: Il loader carica una DLL di destinazione, consente temporaneamente la scrittura nella sua sezione del codice, inserisce lo shellcode crittografato, lo decrittografa e ripristina le protezioni in sola esecuzione.
Decrittografia in Memoria: Il loader decrittografa lo shellcode applicando un pattern di chiave ripetuto direttamente nella memoria iniettata.
Funzioni di Utilità: Il loader include strumenti per misurare la lunghezza delle stringhe, confrontare stringhe (caratteri standard o wide), hash dei nomi per le ricerche, validare i puntatori di memoria e leggere i timestamp per i controlli temporali.
Lo script Python generate.py crittografa il file di shellcode grezzo. Aggiunge padding per l'allineamento, crea o usa una chiave, e applica XOR a ogni byte con la chiave in un ciclo ripetuto. Il file di output shellcode.asm definisce dimensioni, array per i dati crittografati e la chiave, e una routine per caricare i dati a runtime. La decrittografia del loader rispecchia questo processo in memoria. Nota che chiavi più lunghe aumentano il tempo di attesa.
Preparare un binario di shellcode grezzo (ad es. payload.bin). Eseguire python generate.py payload.bin [chiave_opzionale] per produrre shellcode.asm.
Modificare szDllName (parole hex Unicode in evader.asm) per DLL alternative come urlmon.dll. Ricalcolare gli hash DJB2 per le nuove API usando la logica str_hash. Commentare le macro (ad es. KILL_DEBUGGERS) per il debug.
AsmLdr è ottimizzato per Windows 10 e 11 x64; gli aggiornamenti del kernel possono alterare gli offset (ad es. PEB+0x18) o i pattern NTDLL (ad es. 0xb8d18b4c), richiedendo una validazione. La gestione degli errori si basa sui valori di ritorno NTSTATUS (ad es. <0 fallimento), senza registrazione integrata. Le operazioni fittizie e spazzatura consumano cicli di CPU, potenzialmente allertando i monitor delle risorse su sistemi limitati. Utilizzare esclusivamente in ambienti controllati.