Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
gftrace — Golang 바이너리를 위한 명령줄 Windows API 추적 도구. | Kitploit
도구/GitHubGitHub/leandrofroes/gftrace
Dynamic Analysis (Sandboxing)Reverse EngineeringDebuggersMalware AnalysisBinary Analysis
GitHubleandrofroes/gftrace

gftrace

Golang 바이너리를 위한 명령줄 Windows API 추적 도구.

저장소 보기
1591442년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

gftrace

Golang 바이너리를 위한 명령줄 Windows API 추적 도구입니다.

참고: 이 도구는 PoC이며 작업 진행 중인 프로토타입이므로 그렇게 취급해 주시기 바랍니다. 피드백은 언제나 환영합니다!

작동 방식

Golang 프로그램은 빌드 방식 및 런타임 동작과 관련하여 많은 미묘한 차이가 있지만, OS 계층과 상호 작용해야 하므로 어느 시점에서는 Windows API 함수를 호출해야 합니다.

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과 그 작동 방식을 활용하여 언급된 구조체의 특정 필드를 모니터링하고 사용자에게 기록합니다. 이 도구는 Golang 애플리케이션이 호출하는 각 Windows 함수의 함수 이름, 매개변수 및 반환 값을 기록할 수 있습니다. 단 하나의 API 함수를 후킹하거나 시그니처를 가질 필요 없이 모두 가능합니다.

또한 이 도구는 Go 런타임 초기화로 인한 모든 노이즈를 무시하고 그 이후에 호출되는 함수(예: main 패키지의 함수)만 기록하려고 시도합니다.

이 프로젝트와 연구에 대해 더 자세히 알고 싶다면 블로그 포스트를 확인하세요.

설치

최신 릴리즈를 다운로드하세요.

사용법

  1. gftrace.exe, gftrace.dll 및 gftrace.cfg가 동일한 디렉토리에 있는지 확인하세요.
  2. gftrace.cfg 파일에서 추적하려는 API 함수를 지정하세요 (API 필터를 적용하지 않으면 도구가 작동하지 않습니다).
  3. 대상 Golang 프로그램 경로를 매개변수로 전달하여 gftrace.exe를 실행하세요.
root@kitploit:~
gftrace.exe <파일경로> <매개변수>

설정

gftrace.cfg 파일에서 추적하려는 함수를 쉼표로 구분하고 공백 없이 지정하기만 하면 됩니다:

root@kitploit:~
CreateFileW,ReadFile,CreateProcessW

특정 시나리오에서 패키지 Y의 Golang 메서드 X가 호출할 정확한 Windows API 함수는 메서드 자체의 분석이나 추측을 통해서만 결정될 수 있습니다. 이를 결정하는 데 사용할 수 있는 몇 가지 흥미로운 특성이 있습니다. 예를 들어 Golang 애플리케이션은 "Wide" 및 "Ex" 계열의 함수(예: CreateFileW, CreateProcessW, GetComputerNameExW 등)를 호출하는 쪽을 선호하는 경향이 있으므로 분석 중에 이를 고려할 수 있습니다.

기본 구성 파일에는 이미 테스트한 (적어도 대부분) 여러 함수가 포함되어 있으며, 이 함수들이 어떤 시점에서 Golang 애플리케이션에 의해 호출될 수 있다고 확언할 수 있습니다. 향후 업데이트할 예정입니다.

예제

"os.ReadFile"을 두 번 호출하는 간단한 Golang 파일에서 CreateFileW() 및 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)

TunnelFish 악성코드에서 CreateProcessW() 추적:

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비트 파일 검사 지원.
  • asmstdcall에서 API 호출을 직접 하는 대신 "IAT 점프 테이블"을 통해 함수를 호출하는 파일 지원 추가.
  • 대상 프로세스에 대한 명령줄 매개변수 지원 추가.
  • 추적 로그 출력을 기본적으로 파일로 보내 필터링을 더 쉽게 만듦. 현재 대상 파일과 gftrace 출력 사이에 분리가 없습니다. 대안은 명령줄을 사용하여 gftrace 출력을 파일로 리디렉션하는 것입니다.

⚠️ 경고

  • 이 도구는 대상 바이너리를 동적으로 검사하며, 이는 추적 중인 파일이 실행된다는 것을 의미합니다. 악성코드나 알 수 없는 소프트웨어를 검사하는 경우 통제된 환경에서 수행해야 합니다.
  • Golang 프로그램은 추적 중인 파일 및/또는 함수에 따라 매우 시끄러울 수 있습니다 (예: VirtualAlloc은 런타임 패키지에 의해 항상 여러 번 호출되고, CreateFileW는 CreateProcessW 호출 전에 여러 번 호출됨). 도구는 Golang 런타임 초기화 노이즈를 무시하지만 그 이후에는 각 시나리오에서 어떤 함수를 필터링하는 것이 더 좋은지 사용자가 결정해야 합니다.

라이선스

gftrace는 GPL v3 라이선스에 따라 배포됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.

도구 다운로드