Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Herramientas/GitHubGitHub/leandrofroes/gftrace
Análisis Dinámico (Sandboxing)Ingeniería InversaDepuradoresAnálisis de MalwareAnálisis de Binarios
GitHubleandrofroes/gftrace

gftrace

Una herramienta de línea de comandos para rastrear la API de Windows en binarios de Golang.

Ver Repositorio
15914hace 2 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

gftrace

Una herramienta de línea de comandos para rastrear llamadas a la API de Windows en binarios de Golang.

Nota: Esta herramienta es un PoC y un prototipo en desarrollo, así que por favor trátela como tal. ¡Los comentarios son siempre bienvenidos!

¿Cómo funciona?

Aunque los programas Golang contienen muchos matices respecto a cómo se construyen y su comportamiento en tiempo de ejecución, aún necesitan interactuar con la capa del sistema operativo y eso significa que en algún momento deben llamar funciones de la API de Windows.

El paquete runtime de Go contiene una función llamada asmstdcall y esta función es una especie de "puerta de enlace" utilizada para interactuar con la API de Windows. Dado que se espera que esta función llame a las funciones de la API de Windows, podemos asumir que necesita tener acceso a información como la dirección de la función y sus parámetros, y aquí es donde las cosas comienzan a ponerse más interesantes.

Asmstdcall recibe un solo parámetro que es un puntero a algo similar a la siguiente estructura:

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

Algunos de estos campos se completan después de que se llama a la función de la API, como el valor de retorno; otros son recibidos por asmstdcall, como la dirección de la función, el número de argumentos y la lista de argumentos. Independientemente de cuándo se establecen, está claro que la función asmstdcall manipula mucha información interesante sobre la ejecución de programas compilados en Golang.

gftrace aprovecha asmstdcall y su funcionamiento para monitorear campos específicos de la estructura mencionada y registrarlos para el usuario. La herramienta es capaz de registrar el nombre de la función, sus parámetros y también el valor de retorno de cada función de Windows llamada por una aplicación Golang. Todo ello sin necesidad de enganchar (hook) una sola función de la API ni tener una firma para ella.

La herramienta también intenta ignorar todo el ruido de la inicialización del runtime de Go y solo registrar funciones llamadas después de esta (es decir, funciones del paquete main).

Si deseas saber más sobre este proyecto e investigación, consulta el blogpost.

Instalación

Descarga la última versión.

Uso

  1. Asegúrate de que gftrace.exe, gftrace.dll y gftrace.cfg estén en el mismo directorio.
  2. Especifica qué funciones de la API deseas rastrear en el archivo gftrace.cfg (la herramienta no funciona sin filtros de API aplicados).
  3. Ejecuta gftrace.exe pasando la ruta del programa Golang objetivo como parámetro.
root@kitploit:~
gftrace.exe <filepath> <params>

Configuración

Todo lo que necesitas hacer es especificar qué funciones deseas rastrear en el archivo gftrace.cfg, separándolas por coma sin espacios:

root@kitploit:~
CreateFileW,ReadFile,CreateProcessW

Las funciones exactas de la API de Windows que un método Golang X de un paquete Y llamaría en un escenario específico solo pueden determinarse mediante el análisis del método en sí o intentando adivinarlas. Hay algunas características interesantes que pueden usarse para determinarlo; por ejemplo, las aplicaciones Golang parecen preferir siempre llamar a funciones del conjunto "Wide" y "Ex" (por ejemplo, CreateFileW, CreateProcessW, GetComputerNameExW, etc.), así que puedes considerarlo durante tu análisis.

El archivo de configuración predeterminado contiene múltiples funciones que ya he probado (al menos la mayoría de ellas) y puedo afirmar con certeza que una aplicación Golang puede llamarlas en algún momento. Intentaré actualizarlo eventualmente.

Ejemplos

Rastreo de CreateFileW() y ReadFile() en un archivo Golang simple que llama a "os.ReadFile" dos veces:

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)

Rastreo de CreateProcessW() en el 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)

[...]

Rastreo de múltiples funciones en el 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)

[...]

Rastreo de múltiples funciones en el 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)

[...]

Funcionalidades futuras:

  • Soporte para inspección de archivos de 32 bits.
  • Soporte para archivos que llaman funciones mediante la "tabla de saltos IAT" en lugar de la llamada API directamente en asmstdcall.
  • Soporte para parámetros de línea de comandos para el proceso objetivo
  • Enviar la salida del registro de rastreo a un archivo por defecto para facilitar el filtrado. Actualmente no hay separación entre el archivo objetivo y la salida de gftrace. Una alternativa es redirigir la salida de gftrace a un archivo usando la línea de comandos.

⚠️ Advertencia

  • La herramienta inspecciona el binario objetivo dinámicamente, lo que significa que el archivo rastreado se ejecuta. Si estás inspeccionando un malware o software desconocido, asegúrate de hacerlo en un entorno controlado.
  • Los programas Golang pueden ser muy ruidosos dependiendo del archivo y/o función que se esté rastreando (por ejemplo, VirtualAlloc siempre se llama múltiples veces por el runtime, CreateFileW se llama múltiples veces antes de una llamada a CreateProcessW, etc.). La herramienta ignora el ruido de inicialización del runtime de Go, pero después de eso depende del usuario decidir qué funciones es mejor filtrar en cada escenario.

Licencia

gftrace se publica bajo la Licencia GPL v3. Consulta el archivo LICENSE para más información.

Descargar herramienta