
SHAREM è un framework di analisi di shellcode, in grado di emulare più di 45.000 WinAPI e virtualmente tutte le system call di Windows. Include anche un proprio disassemblatore personalizzato, con molte funzionalità innovative, come la possibilità di mostrare il disassemblaggio deoffuscato di uno shellcode codificato o di integrare dati di emulazione per migliorare il disassemblaggio.
Benvenuto in SHAREM!
SHAREM è stato presentato al DEFCON 31 in "Game-Changing Advances in Windows Shellcode Analysis" e al Black Hat USA Arsenal. Un plugin companion per Ghidra è stato reso disponibile (separatamente) da Trellix, per gentile concessione di Max Kersten. Pertanto, puoi estendere la potenza di SHAREM a Ghidra, se lo desideri.
SHAREM è pensato per essere lo strumento definitivo per shellcode Windows, con il supporto per emulare oltre 45.000 WinAPI, praticamente tutte le syscall Windows in modalità utente, e SHAREM fornisce numerose nuove funzionalità. SHAREM contiene un emulatore, un disassemblatore, debugging senza tempo, deoffuscazione brute-force e molte altre caratteristiche. L'emulatore di SHAREM può anche visualizzare strutture complete (o persino strutture all'interno di strutture) e può permettere allo shellcode codificato di deoffuscarsi da solo. SHAREM registra l'output di tutte le WinAPI e le syscall Windows analizzate e le suddivide anche in molte categorie e sottocategorie. La copertura completa del codice di SHAREM consente anche di scoprire funzionalità non raggiungibili.
Il disassemblatore di SHAREM è in grado di integrare le funzioni scoperte nel disassemblato, etichettandole nel disassemblatore. SHAREM mostrerà anche la forma decifrata dello shellcode codificato nel disassemblatore, quindi non è necessario eseguire il debug dello shellcode.
Abbiamo creato una SHAREM Wiki che fornisce alcune informazioni didattiche sull'uso di SHAREM, anche se ci sono parti e funzionalità significative attualmente non documentate. SHAREM è stato sviluppato in un periodo di due anni da diverse persone. Il disassemblatore di SHAREM è significativamente più accurato rispetto ai principali disassemblatori. Inoltre, SHAREM può integrare i dati di emulazione nel disassemblatore, consentendo di ottenere un disassemblaggio quasi perfetto.
Tieni presente che, poiché SHAREM è appena stato rilasciato, la documentazione qui è un po' scarsa. Aggiorneremo GitHub con ulteriori informazioni nelle prossime settimane.
Se sei nuovo di SHAREM, sentiti libero di dare un'occhiata a un breve video demo che mostra alcune delle sue capacità. Clicca sull'immagine per visualizzare la demo:

Marzo 2026: SHAREM caricava fino a 61 DLL all'avvio, ma con l'ultimo aggiornamento ora supporta 369 DLL e 45538 WinAPI uniche. Inoltre, le DLL vengono caricate su richiesta secondo necessità. Le funzionalità interne di Windows (come elenchi di moduli, flink, blink, ecc.) verranno automaticamente aggiornate se devono essere caricate DLL aggiuntive, ad esempio tramite LoadLibraryA. Sono stati apportati numerosi altri aggiornamenti per migliorare la funzionalità. Sono state apportate modifiche per semplificare alcuni problemi che mi sono stati segnalati riguardo alle difficoltà di installazione.
22 Marzo 2026: La logica per uscire dai cicli è stata perfezionata con più sfumature. Gran parte di essa è stata riscritta e testata nuovamente. In generale, non consigliamo di modificare il valore predefinito in config.cfg, se decidi di utilizzare questa funzionalità.
2024/2025: SHAREM può opzionalmente sfruttare l'IA per analizzare i risultati, con una chiave OpenAI (fornita dall'utente). Nota che SHAREM è stato realizzato prima dei recenti progressi nell'IA e il suo utilizzo dell'IA avviene solo dopo che l'analisi iniziale di SHAREM è completa. Questa funzionalità opzionale può consentirgli di esaminare ciò che è stato trovato e applicarlo al framework MITRE ATT&CK e molto altro ancora.
SHAREM viene installato come pacchetto Python locale, in modo da avervi accesso in altri progetti. Questo consente di importare parti di SHAREM. Pertanto, deve essere installato come pacchetto. Nota: ho sentito segnalazioni di alcuni problemi di installazione. Le modifiche recenti dovrebbero correggere questo problema.
Git è richiesto per l'installazione di sharem. Può essere installato da https://git-scm.com/download/win. Dopo l'installazione, riavvia il computer e continua con l'installazione di SHAREM. Git serve per automatizzare l'installazione di SSDeep di Windows. Puoi anche farlo manualmente e modificare il file .bat per escludere SSDeep, se lo fai da solo. L'installazione manuale evita la necessità di usare Git. Nota: per Windows, stiamo passando a un fork di SSDeep sull'account Bw3ll che corregge alcuni problemi di installazione della versione precedente. Questa versione e la precedente erano wrapper per SSDeep.
Esegui il file .bat. Chiamerà il file setup.py. A seconda di come richiami Python, potresti dover usare il file .bat alternativo o persino modificarlo leggermente, se usi qualcosa di non standard.
Esegui
py -m pip list o python3 -m pip list per verificare che SHAREM sia installato localmente come pacchetto. Deve essere installato come pacchetto per funzionare. Cosa succede se NON lo vedi? Allora NON è installato come pacchetto e SHAREM NON funzionerà. Assicurati di usare i file .bat e di eseguirli nel prompt dei comandi di Windows dalla directory degli installer. Se non funziona, cerca eventuali messaggi di errore. Se presenti, prova a correggerli. Puoi provare alcune volte. Se ancora non funziona, apri un ticket e prova a includere tutte queste informazioni, così possiamo cercare di capire cosa non va. Di solito, non sarà necessario, ma occasionalmente potrebbe esserlo. Se hai disinstallato una volta e deciso di reinstallare, potrebbe essere necessario eseguire nuovamente lo script di installazione. Una volta che vedi sharem apparire quando esegui py -m pip list, sai che è correttamente installato come pacchetto locale.
Dopo l'installazione di SHAREM, la prima volta che esegui uno shellcode, devi trovarti nella cartella sharem_cli. Ad esempio, quando sei in quella directory, puoi eseguire py main.py -r32 shellcode.bin. Nessuno shellcode? Va bene, puoi trovare alcuni esempi nel repository di esempi di shellcode che ospito in un repository separato.
Nota: La prima volta che tenti di emulare uno shellcode su Windows, proverà a raccogliere e inflare le DLL di Windows. Questo processo inizia automaticamente quando si tenta di emulare per la prima volta uno shellcode. Copierà le DLL, spostando le copie (e successivamente inflate) in una directory di SHAREM. Ci sono passaggi aggiuntivi, ma l'intero processo iniziale può richiedere diversi minuti, o anche 10-15 minuti, con una CPU molto vecchia. Una volta completato, non dovrai più ripeterlo. Questo deve essere fatto separatamente sia per shellcode a 32 bit che a 64 bit. Puoi navigare in sharem/sharem/sharem/sharem/DLLs/x86 - e dovresti vedere le DLL apparire lentamente. Queste vengono prese dal sistema operativo, modificate per emulare ciò che il sistema operativo farebbe con esse e salvate in questa directory. Ce ne saranno poco più di 60. Se vedi circa quel numero di DLL e non vengono salvate altre DLL, significa che probabilmente si è bloccato. Premi semplicemente Invio di nuovo. Se fallisce, riavvia e prova a emulare di nuovo. Una volta salvate le DLL, non dovrai più ripetere questa operazione; solo la prima volta potrebbe richiedere tempo in attesa, a seconda della velocità della CPU. Dovresti vedere i risultati dell'emulazione quando finisce, come l'enumerazione di diverse WinAPI o syscall Windows.
Se il file termina con .txt, assumerà che lo shellcode sia una rappresentazione ASCII di HEX (piuttosto che esadecimale puro) e lo interpreterà come tale. Questo funziona con qualcosa trovato online. Se si utilizza una rappresentazione ASCII dell'esadecimale, è necessario che il nome del file termini con .txt.
chmod +x linux_installer.sh Abilita l'esecuzione dell'installer.sudo ./linux_installer.sh Esegui l'installer.Dovrai aggiungere i file DLL di Windows. Al momento non li abbiamo disponibili come download separato per gli utenti Linux. Per ora, gli utenti dovrebbero raccoglierli installandoli tramite Windows. (Nota: Queste DLL DEVONO essere inflate da SHAREM. Le DLL non possono essere utilizzate se non sono inflate. La maggior parte, se non tutte, probabilmente falliranno se non vengono inflate nella quantità corretta.) In seguito, potremmo fornirle come download separato nelle prossime settimane. Ma nel frattempo, l'utente può seguire i passaggi di Windows per generarli e spostarli su Linux, posizionandoli in sharem\sharem\sharem\DLLs\x64 e sharem\sharem\sharem\DLLs\x86. Avrai anche bisogno di foundDLLAddresses32.json e FoundDLLAddresses64.json, che dovrebbero andare in sharem\sharem\sharem.
Nel 2024 SHAREM ha aggiunto il supporto per OpenAI, così possiamo sfruttare l'IA per automatizzare alcune attività di analisi. Questo può essere attivato tramite A dal menu principale - "leverage AI". Per fare ciò, devi avere una chiave OpenAI e inserirla nel file config.cfg, che si trova in sharem/sharem/sharem/sharem/config.cfg. Inoltre, devi emulare uno shellcode prima di poter sfruttare l'IA. Attualmente questo è l'unico modo per utilizzare l'IA - non funziona in modalità headless - ma se qualcuno ne ha bisogno, apri un ticket e aggiungerò il supporto come altra opzione selezionabile tramite config. Se hai già installato SHAREM e ottieni la versione aggiornata, potrebbe bastare installare manualmente OpenAI, ad esempio pip install openai. L'ho aggiunto anche ai requisiti per il file setup.py che viene attivato quando si eseguono gli script di installazione iniziali.
L'eccellente script Ghidra di Max Kersten, mostrato al Black Hat e DEFCON dell'agosto 2023, si trova qui: https://github.com/advanced-threat-research/GhidraScripts/blob/main/Sharem.java Alcune istruzioni di Max sono qui: https://github.com/advanced-threat-research/GhidraScripts/ Questo plugin Ghidra è per gentile concessione di Trellix! Devi comunque usare SHAREM. Questo script importa l'output JSON prodotto da SHAREM e lo converte in un formato utile per Ghidra. Maggiori informazioni su Max stesso si trovano su https://maxkersten.nl/.
La documentazione può essere trovata sulla SHAREM Wiki, che fornisce alcune informazioni didattiche sull'uso di SHAREM, anche se ci sono parti e funzionalità significative attualmente non documentate.
SHAREM è un framework molto potente con numerose capacità, alcune ben documentate e altre no. Questa sezione mostrerà un piccolo numero di queste capacità.
SHAREM può prendere uno shellcode codificato e deoffuscarlo tramite emulazione. Non solo cattura tutte le informazioni sulle WinAPI o syscall, ma se scegli di visualizzarlo nel disassemblatore, mostra la forma decodificata dello shellcode:

SHAREM non solo può enumerare oltre 12.000 funzioni WinAPI, ma può anche farlo con praticamente tutte le syscall Windows in modalità utente. Inoltre, per alcune mostra informazioni sulle strutture. Per chi ha a che fare con il registro, estrarrà le informazioni del registro e le aggiungerà al nostro Registry Manager:

SHAREM ha anche la capacità di scaricare file tramite UrldownloadToFileA, se esistono. Questi vengono scaricati nella memoria dell'emulatore - non salvati su disco. Se ha successo, catturerà l'hash. C'è anche un pseudo file system limitato, quindi puoi vedere correlazioni, come un file scaricato come una cosa e rinominato in un'altra. Se il download necessario non è disponibile, verrà semplicemente simulato come un download riuscito. Il download live è un'opzione che può essere abilitata o disabilitata nel config.

Dr. Bramwell Brizendine, Austin Babcock, Jake Hince, Shelby VandenHoek, Sascha Walker, Evan Read, Dylan Park, Kade Brost, James Tate Forcella, William Lochte, Hunter Murphy e Tarek Abdelmotaleb.
Questa ricerca e alcuni co-autori sono stati sostenuti dal NSA Grant H98230-20-1-0326.