Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/leandrofroes/gftrace
Динамический анализ (песочница)Обратная инженерияОтладчикиАнализ вредоносных программАнализ Бинарных Файлов
GitHubleandrofroes/gftrace

gftrace

Инструмент командной строки для трассировки Windows API в бинарных файлах Golang.

Репозиторий
1591442 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

gftrace

Инструмент командной строки для трассировки Windows API в Golang-бинарниках.

Примечание: Этот инструмент является PoC и прототипом в разработке, поэтому относитесь к нему соответственно. Обратная связь всегда приветствуется!

Как это работает?

Хотя программы на Golang содержат много нюансов, связанных с их сборкой и поведением во время выполнения, они всё равно должны взаимодействовать с уровнем ОС, а это означает, что в какой-то момент им необходимо вызывать функции Windows API.

Пакет runtime в Go содержит функцию asmstdcall, и эта функция является своего рода «шлюзом» для взаимодействия с Windows API. Поскольку ожидается, что эта функция будет вызывать функции Windows API, можно предположить, что она должна иметь доступ к такой информации, как адрес функции и её параметры, и здесь всё становится интереснее.

Asmstdcall получает единственный параметр — указатель на структуру, подобную следующей:

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

Некоторые из этих полей заполняются после вызова API-функции (например, возвращаемое значение), другие передаются в asmstdcall (например, адрес функции, количество аргументов и список аргументов). В любом случае, когда они установлены, становится ясно, что функция asmstdcall манипулирует большим количеством интересной информации, касающейся выполнения программ, скомпилированных на Golang.

gftrace использует asmstdcall и принцип её работы для мониторинга определённых полей упомянутой структуры и вывода информации пользователю. Инструмент способен логировать имя функции, её параметры, а также возвращаемое значение каждой Windows-функции, вызванной Golang-приложением. Всё это без необходимости хукать какую-либо отдельную API-функцию или иметь её сигнатуру.

Инструмент также пытается игнорировать весь шум от инициализации рантайма Go и логирует только функции, вызванные после неё (т.е. функции из основного пакета).

Если вы хотите узнать больше об этом проекте и исследовании, ознакомьтесь с блогпостом.

Установка

Скачайте последний релиз.

Использование

  1. Убедитесь, что gftrace.exe, gftrace.dll и gftrace.cfg находятся в одной директории.
  2. Укажите, какие функции API вы хотите трассировать в файле gftrace.cfg (инструмент не работает без применения фильтров API).
  3. Запустите gftrace.exe, передав путь к целевой Golang-программе в качестве параметра.
root@kitploit:~
gftrace.exe <filepath> <params>

Конфигурация

Всё, что вам нужно сделать, — указать в файле gftrace.cfg функции, которые вы хотите трассировать, разделяя их запятыми без пробелов:

root@kitploit:~
CreateFileW,ReadFile,CreateProcessW

Какие именно функции Windows API будет вызывать метод X из пакета Y в определённом сценарии, можно определить только путём анализа самого метода или попытки угадать. Существуют некоторые интересные характеристики, которые можно использовать для этого. Например, Golang-приложения, похоже, всегда предпочитают вызывать функции из наборов «Wide» и «Ex» (например, CreateFileW, CreateProcessW, GetComputerNameExW и т.д.), так что вы можете учитывать это при анализе.

Файл конфигурации по умолчанию содержит множество функций, которые я уже тестировал (по крайней мере, большинство из них), и могу с уверенностью сказать, что они могут быть вызваны Golang-приложением в какой-то момент. Я постараюсь обновлять его время от времени.

Примеры

Трассировка CreateFileW() и ReadFile() в простом Golang-файле, который дважды вызывает "os.ReadFile":

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)

Трассировка CreateProcessW() в вредоносном ПО 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)

[...]

Трассировка нескольких функций в вредоносном ПО 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)

[...]

Трассировка нескольких функций в агенте фреймворка 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)

[...]

Будущие возможности:

  • Поддержка инспекции 32-битных файлов.
  • Добавлена поддержка файлов, вызывающих функции через «IAT jmp table» вместо прямого вызова API в asmstdcall.
  • Добавлена поддержка параметров командной строки для целевого процесса.
  • Отправлять вывод лога трассировки в файл по умолчанию для удобства фильтрации. В настоящее время нет разделения между целевым файлом и выводом gftrace. Альтернатива — перенаправить вывод gftrace в файл через командную строку.

⚠️ Предупреждение

  • Инструмент динамически инспектирует целевой бинарник, а это означает, что трассируемый файл выполняется. Если вы инспектируете вредоносное ПО или неизвестное программное обеспечение, убедитесь, что делаете это в контролируемой среде.
  • Golang-программы могут быть очень шумными в зависимости от файла и/или трассируемой функции (например, VirtualAlloc всегда вызывается несколько раз пакетом runtime, CreateFileW вызывается несколько раз перед вызовом CreateProcessW и т.д.). Инструмент игнорирует шум инициализации рантайма Go, но после этого пользователь сам решает, какие функции лучше фильтровать в каждом конкретном сценарии.

Лицензия

gftrace опубликован под лицензией GPL v3. Пожалуйста, обратитесь к файлу LICENSE для получения дополнительной информации.

Скачать инструмент