随机渲染:因为想摸鱼,所以写了一个免杀框架

被嫌弃免杀太菜,说是不能自己写加密壳

闲聊几句

上次说到随机渲染,其实也就是随机变量名。往大方向来设计的话,就是只渲染需要的模块,当然也可以根据模块来随机渲染,那就是自己也不知道最后的组合是什么了(开玩笑,当然可以看到每次渲染的结果)。

再来回忆一下一个加载器所需要的模块:1、ShellCode 2、Loader。

那基础的渲染模板就可以围绕着两个模块设计,第一是ShellCode生成的位置,第二是Loader的加载的时机和方式。

Golang template

说点官方话

Go标准库提供了几个package可以产生输出结果,而text/template 提供了基于模板输出文本内容的功能。html/template 则是产生 安全的HTML格式的输出。

Golang text/template 包是一个数据驱动的模版渲染工具。提供条件判断,数组或map遍历;参数赋值,函数或方法调用;自定义函数扩展,模板嵌套及重用等功能。基于该工具,可以轻松实现复杂场景的文本渲染。

模板没有限定扩展名,最流行的后缀是.tmpl, vim-go提供了对它的支持,并且godoc的例子中也使用这个后缀。Atom 和 GoSublime 对.gohtml后缀的文件提供了语法高亮的支持。通过对代码库的分析统计发现.tpl后缀也被经常使用。当然后缀并不重要,在项目中保持清晰和一致即可。

基础模板

先来写一个简单的模板,模板的语法很简单,各位大佬去看看官方文档就好啦。

package main

import (
    "variant/loader"
)

func main() {

    {{.PlainText}} := {{.ShellCode}}    

    loader.{{.Loader}}({{.PlainText}})
}

带有 {{. }} 符号的就是模板变量,会根据定义的数据来进行模板的渲染,可以通过点号.来访问。

如果数据是复杂类型的数据,可以通过{ { .FieldName }}来访问它的字段。

如果字段还是复杂类型,可以链式访问 { { .Struct.StructTwo.Field }}

随机字段

可以看到除了 {{.ShellCode}} 这个模板变量我们无法进行随机(其实加密之后每次结果不一样,也算是随机了),其他两个模板变量都可以随机,简单写个demo看一下。

package main

import (
	"os"
	"path/filepath"
	"text/template"
	"time"

	"golang.org/x/exp/rand"
)

type Anti struct {
	PlainText string
	Loader    string
}

func RStrings(length int) string {
	var result string
	for i := 0; i < length; i++ {
		// 随机选择是大写字母还是小写字母
		char := byte(rand.Intn(26) + 'a')
		if rand.Intn(2) == 1 {
			char = byte(rand.Intn(26) + 'A')
		}
		result += string(char)
	}
	return result
}

func main() {
	// 设置随机种子
	rand.NewSource(uint64(time.Now().UnixNano()))

	// 设置模板变量渲染数据
	anti := Anti{
		PlainText: RStrings(8),
		Loader:    RStrings(10),
	}

	// 读取模板
	content, err := os.ReadFile("mht.tmpl")
	if err != nil {
		panic(err)
	}

	// 创建模板对象
	tmpl, err := template.New(filepath.Base("mht")).Parse(string(content))
	if err != nil {
		panic(err)
	}

	// 创建输出的 Go 文件
	goFile, err := os.Create("mhtAnti.go")
	if err != nil {
		panic(err)
	}
	defer goFile.Close()

	// 渲染模板并写入到 Go 文件中
	err = tmpl.Execute(goFile, anti)
	if err != nil {
		panic(err)
	}

}

运行结果

d2b5ca33bd20240628172250

这样就得到随机渲染的编译模板了,实现每次编译都是新的文件指纹。

总结

多看一眼https://pkg.go.dev/text/template,这个库非常好用。

想要实现一个通用的渲染器,其实也很简单。

如果你看到这里了,顺手帮我点个Star,再去看下项目中实现的渲染器吧

https://github.com/C1ph3rX13/variant/blob/main/render/buildtmpl.go

顺带一句,它有个不顺眼的地方,会在七月份更新解决。

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

请登录后发表评论

    请登录后查看评论内容