gftrace:一款针对Golang源码的Windows API跟踪工具

2024-07-21 181 0

关于gftrace

gftrace是一款针对Golang源码的Windows API跟踪工具,可以帮助广大研究人员对Golang二进制文件进行安全分析。

该工具本质上是一个命令行工具,当前正处于积极开发中,欢迎随时提供反馈。

运行机制

尽管 Golang程序在构建方式和运行时行为方面有很多细微差别,但它们仍然需要与操作系统层交互,这意味着在某些时候它们需要从 Windows API 调用函数。

Go运行时包包含一个名为asmstdcall的函数,该函数是一种用于与Windows API交互的“网关”。由于该函数需要调用Windows API函数,我们可以假设它需要访问函数地址及其参数等信息,而这正是gftrace可以切入的地方。

asmstdcall函数可以接收一个参数,该参数是指向类似于以下结构的指针:

struct LIBCALL {

DWORD_PTR Addr;

DWORD Argc;

DWORD_PTR Argv;

DWORD_PTR ReturnValue;

 

[...]

}

其中一些字段是在调用API函数后填充的,例如返回值,其他字段由asmstdcall接收,例如函数地址、参数数量和参数列表。无论何时设置这些字段,很明显asmstdcall函数操纵了大量有关Golang中编译的程序执行的有趣信息。

gftrace利用asmstdcall及其工作方式来监控上述结构的特定字段并将其记录给用户。该工具能够记录函数名称、其参数以及Golang应用程序调用的每个Windows函数的返回值。所有这些都不需要设置单个API函数钩子或为其提供签名。

该工具还会尝试忽略 Go 运行时初始化产生的所有噪音,并且仅记录其后调用的函数(即来自主包的函数)。

工具安装

广大研究人员可以直接访问该项目的【Releases页面】下载最新版本的预编译gftrace。

除此之外,我们也可以使用下列命令将该项目源码克隆至本地:

git clone https://github.com/leandrofroes/gftrace.git

然后将项目源码导入到Visual Studio中,自行完成项目代码构建。

工具使用

1、确保gftrace.exe、gftrace.dll和gftrace.cfg位于同一目录中;

2、在gftrace.cfg文件中指定要跟踪的API函数(如果不应用API过滤器,该工具将无法工作);

3、运行gftrace.exe,并将目标Golang程序路径作为参数传递;

命令执行样例如下:

gftrace.exe <filepath> <params>

工具配置

我们唯一需要做的,就是在gftrace.cfg文件中指定想要跟踪的函数,并用逗号分隔(不带空格):

CreateFileW,ReadFile,CreateProcessW

工具使用样例

跟踪一个Golang文件(调用os.ReadFile两次)中的CreateFileW()和ReadFile()调用:

- 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():

- 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恶意软件中的多个函数:

- 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框架代理中的多个函数:

- 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)

 

[...]

许可证协议

本项目的开发与发布遵循GPL-3.0开源许可协议。

项目地址

gftrace:【GitHub传送门

参考资料

https://leandrofroes.github.io/posts/An-in-depth-look-at-Golang-Windows-calls/


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

如何使用CODASM编码Payload并降低熵值
SessionExec:一款针对会话安全的安全命令测试工具
Arkime:一款大规模数据包捕获和索引数据库系统
从蓝队流量角度分析Shiro-550反序列化漏洞
万字长文浅谈三高系统建设方法论和实践
你遇到过哪些奇葩面试题目;如何考察渗透测试与安全管理能力| FB甲方群话题讨论

发布评论