Golang二进制文件的命令行Windows Windows API跟踪工具。
Note:此工具是POC,并且是在进行中的工作原型,因此请这样对待。总是欢迎反馈!
它如何工作?
虽然Golang程序对它们的构建方式和运行时的行为有很多细微差别,但它们仍然需要与OS层进行交互,这意味着在某个时候,他们确实需要从Windows API调用功能。
GO运行时软件包包含一个称为ASMSTDCALL的函数,此功能是一种用于与Windows API交互的“网关”。由于该功能可以调用Windows API函数,因此我们可以假设它需要访问信息,例如该功能的地址及其参数,这就是事物开始变得更加有趣的地方。
ASMSTDCALL接收一个单个参数,该参数指向与以下结构相似的东西的指针:
struct libcall {
dword_ptr addr;
dword argc;
dword_ptr argv;
dword_ptr returnValue;
[.]
}这些字段中的某些字段被填充后,称为API函数(例如返回值,Asmstdcall收到的返回值),例如函数地址,参数数量和参数列表。无论何时设置这些设置,很明显,ASMSTDCALL函数会操纵有关Golang编译程序执行的许多有趣信息。
GFTRACE利用ASMSTDCALL及其在监视上述结构的特定字段并将其记录到用户的工作方式。该工具能够记录函数名称,它的参数以及Golang应用程序调用的每个Windows函数的返回值。所有这些都无需连接单个API功能或为其具有签名。
该工具还试图忽略GO运行时初始化中的所有噪声,而仅在其之后调用的日志函数(即来自主包装的函数)。
如果您想了解更多有关此项目的信息,请检查博客文章。
安装
下载最新版本。
用法
确保gftrace.exe,gftrace.dll和gftrace.cfg在同一目录中。指定您要在gftrace.cfg文件中跟踪的API功能(如果没有应用API过滤器,该工具就无法使用)。运行gftrace.exe将目标golang程序路径作为参数。 gftrace.exe filepath params
配置
您需要做的只是指定要在gftrace.cfg文件中跟踪的功能
createFilew,readfile,createProcessw确切的Windows API功能一个软件包的Golang方法X在特定方案中只能通过分析方法本身或试图猜测来确定。可以使用一些有趣的特征来确定它,例如,Golang应用程序似乎总是更喜欢从“宽”和“ ex”集中调用功能(例如CreateFilew,createProcessw,getComputernameexw等),因此您可以在分析过程中考虑它。
默认配置文件包含我已经测试过的多个功能(至少其中的大部分),并且可以确保在某个时候可以通过Golang应用程序调用它们。我将最终尝试更新它。
示例
跟踪CreateFilew()和ReadFile()在一个简单的Golang文件中,该文件调用'os.ReadFile'Twice:
-CreateFileW('C: \ USER \ USER \ desktop \ doc.txt',0x80000000,0x3,0x0,0x3,0x3,0x1,0x0)=0x168(360)
- readfile(0x168,0xc000108000,0x200,0xc000075d64,0x0)=0x1(1)
-CreateFileW('C: \ USER \ USER \ desktop \ doc2.txt',0x80000000,0x3,0x0,0x3,0x1,0x1,0x0)=0x168(360)
- readfile(0x168,0xc000108200,0x200,0xc000075d64,0x0)=0x1(1)在隧道Malware:中跟踪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 |。
- 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 |。
- 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 SmtpAddres s |。
- 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 |。
- 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,0xc0000acc0,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 Malware:中追踪多个功能
- CreateFileW('config.dat.tmp',0x80000000,0x3,0x0,0x3,0x1,0x0)=0xffffffffffffffffffffff (-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,0xc000000c79d4,0x0)=0x1(1)
-getAddrinFow('reyweb.com',0x0,0xc00000031f18,0xc000031e88)=0x0(0)
-wsasocketw(0x2,0x1,0x0,0x0,0x81)=0x1f0(496)
-wsasend(0x1f0,0xc00004f038,0x1,0xc0000004f020,0x0,0xc0000004eff0,0x0)=0x0(0)
-WSARECV(0x1f0,0xc00004ef60,0x1,0xc000048,0xc0000004efd0,0xc0000004ef18,0x0)=0xffffffff(-1)
-getAddrinFow('reyweb.com',0x0,0xc00000031f18,0xc000031e88)=0x0(0)
-wsasocketw(0x2,0x1,0x0,0x0,0x81)=0x200(512)
-wsasend(0x200,0xc00004f2b8,0x1,0xc00004f2a0,0x0,0xc0000004f270,0x0)=0x0(0)
-wsarecv(0x200,0xc00004f1e0,0x1,0xc00004f1c8,0xc0000004f250,0xc0000004f198,0x0)=0xffffffff(-1)
[.]在DEIMOSC2框架代理:中追踪多个功能
-wsasocketw(0x2,0x1,0x0,0x0,0x81)=0x130(304)
-setSockopt(0x130,0xffff,0x20,0xc000000b7838,0x4)=0xffffffff(-1)
- 插座(0x2,0x1,0x6)=0x138(312)
-wsaioctl(0x138,0xc8000006,0xaf0870,0x10,0xb38730,0x8,0x8,0xc000000b746c,0x0,0x0,0x0)=0x0(0)
-getModuleFilenameW(0x0,'C: \ users \ user \ desktop \ samples \ deimos.exe',0x400)=0x2f(47)
-getUserProfofileDirectoryW(0x140,'C: \ User \ User',0xc0000b7a08)=0x1(1)
-lookupaccountsidw(0x0,0xc00000E250,'用户',0xc0000b796c,'桌面检测',0xc000000b7970,0xc000000b79f0)=0x1(1)(1)
-netusergetInfo('桌面测试','用户',0xa,0xc0000b7930)=0x0(0)
-getComputerNameExw(0x5,'桌面测试',0xc000000b7b78)=0x1(1)
-getAdaptersAddresses(0x0,0x10,0x0,0xc000120000,0xc0000b79d0)=0x0(0)
-createToolHelp32snapshot(0x2,0x0)=0x1b8(440)
-getCurrentProcessID()=0x2584(9604)
-getCurrentDirectoryW(0x12c,'C: \ users \ user \ user \ appdata \ local \ program \ program \ retoolkit \ bin')=0x39(57)
[.]
未来功能:
[x]支持对32个位文件的检查。 [x]通过“ IAT JMP表”而不是直接在ASMSTDCALL中的API调用来添加支持文件的支持。 [X]为目标过程的CMDLINE参数添加支持[]将跟踪日志输出发送到文件默认情况下,以使其更好地过滤。当前,目标文件和GFTRACE输出之间没有分离。另一种方法是使用命令行重定向GFTRACE输出到文件。
:警告:警告
该工具会动态检查目标二进制,这意味着执行了所跟踪的文件。如果您正在检查恶意软件或未知软件,请确保在受控的环境中进行。 Golang程序可能会非常嘈杂,具体取决于文件和/或函数的追踪(例如,通过运行时软件包始终将VirtualAlloc多次调用,在呼叫CreateProcessw等调用之前,CreateFilew多次被称为createfilew)。该工具忽略了Golang运行时初始化噪声,但此后,用户可以决定哪种功能在每种情况下都更好地过滤。
许可证
GFTRACE以GPL V3许可发布。有关更多信息,请参考名称许可证的文件。