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
DllShimmer — Arma facilmente il DLL hijacking. Inserisci una backdoor in qualsiasi funzione di qualsiasi DLL. | Kitploit
Strumenti/GitHubGitHub/print3m/dllshimmer
Meccanismi di PersistenzaPenetration TestingRed TeamingSviluppo PayloadAttacco Avversario
GitHubprint3m/dllshimmer

DllShimmer

Arma facilmente il DLL hijacking. Inserisci una backdoor in qualsiasi funzione di qualsiasi DLL.

Vedi Repository
750850 anni 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

DllShimmer

Sfrutta facilmente il DLL hijacking. Aggiungi una backdoor a qualsiasi funzione in qualsiasi DLL senza interferire con il normale funzionamento del processo.

DllShimmer flowchart

Come funziona

DllShimmer analizza la DLL originale ed estrae informazioni sulle funzioni esportate (nome, numero ordinale e informazioni sul forwarder). Sulla base di queste informazioni, DllShimmer crea un file C++ boilerplate (.cpp). Il file generato consente di aggiungere il proprio codice a ogni funzione esportata dalla DLL originale senza interrompere il normale funzionamento del programma. Non è richiesto alcun reverse engineering o strumentazione, perché DllShimmer non si basa sulle firme delle funzioni (vedi maggiori dettagli in “Limitazioni”).

Il secondo file generato è un file .def, che garantisce che tutte le DLL esportate dal proxy dopo la compilazione abbiano gli stessi nomi e numeri ordinali della DLL originale.

Dopo la compilazione, l'EAT nella DLL proxy è una copia esatta dell'EAT nella DLL originale. Tutti i nomi e i numeri ordinali delle funzioni esportate corrispondono e anche le funzioni inoltrate vengono inoltrate. DllShimmer non inoltra esplicitamente tutte le funzioni (come fanno la maggior parte degli strumenti), creando una struttura EAT completamente nuova e sospetta.

Installazione

Compila il codice sorgente Go oppure scarica il binario compilato.

Dipendenze:

  • x86_64-w64-mingw32-g++
  • x86_64-w64-mingw32-dlltool

Uso

Esempio:

root@kitploit:~
# Backdoor version.dll (proxy to absolute path)
./DllShimmer -i version.dll -o project/ -x "C:/Windows/System32/version.dll" -m

# Backdoor random chat.dll (proxy to relative path)
./DllShimmer -i chat.dll -o project/ -x "lib/chat2.dll" -m

# Backdoor random app.dll (static linking to the original DLL)
./DllShimmer -i app.dll -o project/ -x "app2.dll" -m --static

Parametri:

-i / --input <path> [richiesto]

La DLL originale a cui vuoi aggiungere la backdoor.

-o / --output <path> [richiesto]

Il percorso della directory in cui DllShimmer salverà tutti i file generati.

-x / --original <path> [richiesto]

In caso di collegamento dinamico (predefinito), fornisci il percorso in cui la DLL proxy troverà la DLL originale sul sistema di destinazione.

In caso di collegamento statico (--static), specifica solo il nome della DLL originale. Verrà cercata secondo l'ordine di caricamento predefinito di Windows.

-m / --mutex [facoltativo]

L'attivazione di questa opzione aggiunge un mutex al file sorgente, che impedisce che la tua backdoor venga eseguita più di una volta durante una singola esecuzione del programma. Tutte le funzioni originali continueranno a funzionare normalmente.

--static [facoltativo]

Abilita il collegamento statico tra la DLL proxy (IAT) e la DLL originale (EAT). Questo genera un file .lib aggiuntivo nella directory di output, che funge da DLL originale per la compilazione statica.

Questa tecnica presenta alcune importanti limitazioni rispetto al collegamento dinamico:

  • Non puoi definire un percorso assoluto o relativo per la DLL originale. Il loader di sistema usa solo il nome della DLL dalla IAT del proxy e cerca nei percorsi predefiniti.
  • Informazioni di debug limitate. Se la DLL originale non riesce a caricarsi, il programma in genere va in crash senza informazioni aggiuntive.

Tuttavia, il collegamento statico può essere più furtivo e naturale in alcuni scenari.

Predefinito: DllShimmer usa sempre il collegamento dinamico con le funzioni LoadLibraryA() e GetProcAddress().

--debug-file <path> [facoltativo]

Salva i log di debug in un file. I log vengono scritti in un file in modo continuo mentre il programma è in esecuzione. Se selezionata, i log non vengono stampati su STDOUT.

Predefinito: DllShimmer scrive sempre i log di debug su STDOUT.

Esempio di output di debug:

Example debug output

Limitazioni

  • È supportata solo l'architettura x86-64 / AMD64.
  • Con ogni probabilità, il codice proxy generico non funzionerà con funzioni che hanno parametri a virgola mobile, poiché questi usano registri diversi da quelli interi utilizzati da DllShimmer. Se conosci la firma della funzione, puoi modificarla manualmente nel file generato.
  • Le funzioni con più di 12 argomenti non funzioneranno perché questo numero è stato hardcoded nei modelli di DllShimmer.
  • Ci sono alcune DLL offuscate di grandi dimensioni con strani name mangling, convenzioni di chiamata e trucchi (ad esempio DLL del framework Qt compilate). Sconsiglio di usarle come DLL proxy. In questo caso DllShimmer molto probabilmente genererà spazzatura.

Risoluzione dei problemi

Prima di iniziare la risoluzione dei problemi:

  1. Leggi "Limitazioni".
  2. Assicurati di non usare il collegamento statico (--static). È più facile fare debug con il collegamento dinamico (predefinito).
  3. Salva l'output di debug in un file (--debug-file).

Nel file .cpp generato non vedo tutte le funzioni esportate dalla DLL originale.

Le funzioni definite nella DLL originale come “inoltrate” (forwarded) non sono incluse nel file .cpp. Tuttavia, sono visibili nel file .def. Verranno esportate anche dopo la compilazione, esattamente come nella DLL originale.

Strano errore del loader (126) durante il caricamento della DLL originale

A volte, la tua DLL proxy mostra un errore durante il caricamento della DLL originale e il codice di errore è 126, anche se in teoria hai specificato il percorso relativo corretto nel parametro -x. Perché non funziona?!?

Le DLL vengono cercate nella Current Directory. Nel 98% dei casi, questa è semplicemente la posizione del file EXE principale, ma ci sono programmi (per lo più vecchi legacy) che cambiano arbitrariamente la Current Directory usando, ad esempio, SetCurrentDirectoryW(). Il programma principale è a conoscenza di questa modifica, quindi carica correttamente la tua DLL proxy, ma tu non ne sei a conoscenza e provi a caricare la DLL originale in modo relativo, mentre il programma la cerca nella Current Directory modificata.

Questa regola vale sia per il caricamento statico che dinamico della DLL originale. Purtroppo, con il collegamento statico, questo problema è molto più difficile da individuare perché non abbiamo informazioni di debug. Il loader di sistema fallisce e basta. Questo è il motivo per cui consiglio sempre di usare prima il collegamento dinamico predefinito.

Nel caso del collegamento dinamico, abbiamo due opzioni:

  1. Adattare il percorso nel parametro -x alla nuova situazione della Current Directory.
  2. Cambiare dinamicamente la Current Directory per cercare le DLL dove vogliamo.

In caso di collegamento statico, abbiamo davvero una sola opzione:

  1. Spostare la DLL originale nella Current Directory.

TODO

  • Supportare i nomi di funzione C++ mangled.
Scarica lo strumento