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
gftrace — Uno strumento di tracciamento delle API di Windows da riga di comando per binari Golang. | Kitploit
Strumenti/GitHubGitHub/leandrofroes/gftrace
Analisi Dinamica (Sandboxing)Reverse EngineeringDebuggerAnalisi MalwareAnalisi di Binari
GitHubleandrofroes/gftrace

gftrace

Uno strumento di tracciamento delle API di Windows da riga di comando per binari Golang.

Vedi Repository
1591442 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

gftrace

Uno strumento da riga di comando per tracciare le chiamate API di Windows nei binari Golang.

Nota: Questo strumento è un PoC e un prototipo in fase di sviluppo, pertanto trattatelo come tale. I feedback sono sempre benvenuti!

Come funziona?

Sebbene i programmi Golang contengano molte sfumature riguardo al modo in cui sono costruiti e al loro comportamento in fase di esecuzione, devono comunque interagire con il livello del sistema operativo, il che significa che ad un certo punto devono chiamare funzioni dell'API di Windows.

Il pacchetto runtime di Go contiene una funzione chiamata asmstdcall e questa funzione è una sorta di "gateway" utilizzato per interagire con l'API di Windows. Poiché ci si aspetta che questa funzione chiami le funzioni dell'API di Windows, possiamo supporre che abbia bisogno di accedere a informazioni come l'indirizzo della funzione e i suoi parametri, ed è qui che le cose iniziano a diventare più interessanti.

Asmstdcall riceve un singolo parametro che è un puntatore a qualcosa di simile alla seguente struttura:

root@kitploit:~
struct LIBCALL {
	DWORD_PTR Addr;
	DWORD Argc;
	DWORD_PTR Argv;
	DWORD_PTR ReturnValue;
	
	[...]
}

Alcuni di questi campi vengono riempiti dopo che la funzione API viene chiamata, come il valore di ritorno, altri vengono ricevuti da asmstdcall, come l'indirizzo della funzione, il numero di argomenti e la lista degli argomenti. Indipendentemente da quando vengono impostati, è chiaro che la funzione asmstdcall manipola molte informazioni interessanti riguardanti l'esecuzione di programmi compilati in Golang.

gftrace sfrutta asmstdcall e il suo funzionamento per monitorare campi specifici della struttura menzionata e registrarli per l'utente. Lo strumento è in grado di registrare il nome della funzione, i suoi parametri e anche il valore di ritorno di ogni funzione Windows chiamata da un'applicazione Golang. Il tutto senza bisogno di agganciare (hook) una singola funzione API o avere una firma per essa.

Lo strumento cerca anche di ignorare tutto il rumore dell'inizializzazione del runtime di Go e registra solo le funzioni chiamate dopo di essa (cioè le funzioni del package main).

Se vuoi saperne di più su questo progetto e sulla ricerca, consulta il blogpost.

Installazione

Scarica l'ultima release.

Utilizzo

  1. Assicurati che gftrace.exe, gftrace.dll e gftrace.cfg siano nella stessa directory.
  2. Specifica quali funzioni API vuoi tracciare nel file gftrace.cfg (lo strumento non funziona senza filtri API applicati).
  3. Esegui gftrace.exe passando il percorso del programma Golang di destinazione come parametro.
root@kitploit:~
gftrace.exe <filepath> <params>

Configurazione

Tutto ciò che devi fare è specificare quali funzioni vuoi tracciare nel file gftrace.cfg, separandole con virgole senza spazi:

root@kitploit:~
CreateFileW,ReadFile,CreateProcessW

Le esatte funzioni API Windows che un metodo Golang X di un pacchetto Y chiamerebbe in uno scenario specifico possono essere determinate solo analizzando il metodo stesso o cercando di indovinarle. Ci sono alcune caratteristiche interessanti che possono essere utilizzate per determinarlo, ad esempio, le applicazioni Golang sembrano preferire sempre chiamare funzioni del set "Wide" ed "Ex" (es. CreateFileW, CreateProcessW, GetComputerNameExW, ecc.) quindi puoi tenerlo in considerazione durante la tua analisi.

Il file di configurazione predefinito contiene diverse funzioni che ho già testato (almeno la maggior parte di esse) e posso affermare con certezza che possono essere chiamate da un'applicazione Golang a un certo punto. Cercherò di aggiornarlo in futuro.

Esempi

Tracciamento di CreateFileW() e ReadFile() in un semplice file Golang che chiama "os.ReadFile" due volte:

root@kitploit:~
- CreateFileW("C:\Users\user\Desktop\doc.txt", 0x80000000, 0x3, 0x0, 0x3, 0x1, 0x0) = 0x168 (360)
- ReadFile(0x168, 0xc000108000, 0x200, 0xc000075d64, 0x0) = 0x1 (1)
- CreateFileW("C:\Users\user\Desktop\doc2.txt", 0x80000000, 0x3, 0x0, 0x3, 0x1, 0x0) = 0x168 (360)
- ReadFile(0x168, 0xc000108200, 0x200, 0xc000075d64, 0x0) = 0x1 (1)

Tracciamento di CreateProcessW() nel malware TunnelFish:

root@kitploit:~
- CreateProcessW("C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe", "powershell /c "Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn; Get-Recipient | Select Name -ExpandProperty EmailAddresses -first 1 | Select SmtpAddress |  ft -hidetableheaders"", 0x0, 0x0, 0x1, 0x80400, "=C:=C:\Users\user\Desktop", 0x0, 0xc0000ace98, 0xc0000acd68) = 0x1 (1)
- CreateProcessW("C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe", "powershell /c "Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn; Get-Recipient | Select Name -ExpandProperty EmailAddresses -first 1 | Select SmtpAddress |  ft -hidetableheaders"", 0x0, 0x0, 0x1, 0x80400, "=C:=C:\Users\user\Desktop", 0x0, 0xc0000c4ec8, 0xc0000c4d98) = 0x1 (1)
- CreateProcessW("C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe", "powershell /c "Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn; Get-Recipient | Select Name -ExpandProperty EmailAddresses -first 1 | Select SmtpAddress |  ft -hidetableheaders"", 0x0, 0x0, 0x1, 0x80400, "=C:=C:\Users\user\Desktop", 0x0, 0xc00005eec8, 0xc00005ed98) = 0x1 (1)
- CreateProcessW("C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe", "powershell /c "Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn; Get-Recipient | Select Name -ExpandProperty EmailAddresses -first 1 | Select SmtpAddress |  ft -hidetableheaders"", 0x0, 0x0, 0x1, 0x80400, "=C:=C:\Users\user\Desktop", 0x0, 0xc0000bce98, 0xc0000bcd68) = 0x1 (1)
- CreateProcessW("C:\WINDOWS\system32\cmd.exe", "cmd /c "wmic computersystem get domain"", 0x0, 0x0, 0x1, 0x80400, "=C:=C:\Users\user\Desktop", 0x0, 0xc0000c4ef0, 0xc0000c4dc0) = 0x1 (1)
- CreateProcessW("C:\WINDOWS\system32\cmd.exe", "cmd /c "wmic computersystem get domain"", 0x0, 0x0, 0x1, 0x80400, "=C:=C:\Users\user\Desktop", 0x0, 0xc0000acec0, 0xc0000acd90) = 0x1 (1)
- CreateProcessW("C:\WINDOWS\system32\cmd.exe", "cmd /c "wmic computersystem get domain"", 0x0, 0x0, 0x1, 0x80400, "=C:=C:\Users\user\Desktop", 0x0, 0xc0000bcec0, 0xc0000bcd90) = 0x1 (1)

[...]

Tracciamento di più funzioni nel malware Sunshuttle:

root@kitploit:~
- CreateFileW("config.dat.tmp", 0x80000000, 0x3, 0x0, 0x3, 0x1, 0x0) = 0xffffffffffffffff (-1)
- CreateFileW("config.dat.tmp", 0xc0000000, 0x3, 0x0, 0x2, 0x80, 0x0) = 0x198 (408)
- CreateFileW("config.dat.tmp", 0xc0000000, 0x3, 0x0, 0x3, 0x80, 0x0) = 0x1a4 (420)
- WriteFile(0x1a4, 0xc000112780, 0xeb, 0xc0000c79d4, 0x0) = 0x1 (1)
- GetAddrInfoW("reyweb.com", 0x0, 0xc000031f18, 0xc000031e88) = 0x0 (0)
- WSASocketW(0x2, 0x1, 0x0, 0x0, 0x0, 0x81) = 0x1f0 (496)
- WSASend(0x1f0, 0xc00004f038, 0x1, 0xc00004f020, 0x0, 0xc00004eff0, 0x0) = 0x0 (0)
- WSARecv(0x1f0, 0xc00004ef60, 0x1, 0xc00004ef48, 0xc00004efd0, 0xc00004ef18, 0x0) = 0xffffffff (-1)
- GetAddrInfoW("reyweb.com", 0x0, 0xc000031f18, 0xc000031e88) = 0x0 (0)
- WSASocketW(0x2, 0x1, 0x0, 0x0, 0x0, 0x81) = 0x200 (512)
- WSASend(0x200, 0xc00004f2b8, 0x1, 0xc00004f2a0, 0x0, 0xc00004f270, 0x0) = 0x0 (0)
- WSARecv(0x200, 0xc00004f1e0, 0x1, 0xc00004f1c8, 0xc00004f250, 0xc00004f198, 0x0) = 0xffffffff (-1)

[...]

Tracciamento di più funzioni nell'agente del framework DeimosC2:

root@kitploit:~
- WSASocketW(0x2, 0x1, 0x0, 0x0, 0x0, 0x81) = 0x130 (304)
- setsockopt(0x130, 0xffff, 0x20, 0xc0000b7838, 0x4) = 0xffffffff (-1)
- socket(0x2, 0x1, 0x6) = 0x138 (312)
- WSAIoctl(0x138, 0xc8000006, 0xaf0870, 0x10, 0xb38730, 0x8, 0xc0000b746c, 0x0, 0x0) = 0x0 (0)
- GetModuleFileNameW(0x0, "C:\Users\user\Desktop\samples\deimos.exe", 0x400) = 0x2f (47)
- GetUserProfileDirectoryW(0x140, "C:\Users\user", 0xc0000b7a08) = 0x1 (1)
- LookupAccountSidw(0x0, 0xc00000e250, "user", 0xc0000b796c, "DESKTOP-TEST", 0xc0000b7970, 0xc0000b79f0) = 0x1 (1)
- NetUserGetInfo("DESKTOP-TEST", "user", 0xa, 0xc0000b7930) = 0x0 (0)
- GetComputerNameExW(0x5, "DESKTOP-TEST", 0xc0000b7b78) = 0x1 (1)
- GetAdaptersAddresses(0x0, 0x10, 0x0, 0xc000120000, 0xc0000b79d0) = 0x0 (0)
- CreateToolhelp32Snapshot(0x2, 0x0) = 0x1b8 (440)
- GetCurrentProcessId() = 0x2584 (9604)
- GetCurrentDirectoryW(0x12c, "C:\Users\user\AppData\Local\Programs\retoolkit\bin") = 0x39 (57)

[...]

Funzionalità future:

  • Supporto per l'ispezione di file a 32 bit.
  • Aggiunto supporto per file che chiamano funzioni tramite la "IAT jmp table" invece della chiamata API diretta in asmstdcall.
  • Aggiunto supporto per i parametri da riga di comando per il processo di destinazione.
  • Inviare l'output del log di tracciamento a un file per impostazione predefinita per facilitare il filtraggio. Attualmente non c'è separazione tra il file di destinazione e l'output di gftrace. Un'alternativa è reindirizzare l'output di gftrace a un file usando la riga di comando.

⚠️ Avviso

  • Lo strumento ispeziona il binario di destinazione dinamicamente, il che significa che il file tracciato viene eseguito. Se stai ispezionando un malware o un software sconosciuto, assicurati di farlo in un ambiente controllato.
  • I programmi Golang possono essere molto rumorosi a seconda del file e/o della funzione tracciata (es. VirtualAlloc viene sempre chiamato più volte dal pacchetto runtime, CreateFileW viene chiamato più volte prima di una chiamata a CreateProcessW, ecc.). Lo strumento ignora il rumore dell'inizializzazione del runtime di Golang, ma dopo spetta all'utente decidere quali funzioni è meglio filtrare in ogni scenario.

Licenza

gftrace è pubblicato sotto licenza GPL v3. Fare riferimento al file denominato LICENSE per maggiori informazioni.

Scarica lo strumento