Skip to content

DLL Agent (zh‐CN)

Jimmy Mi edited this page Dec 16, 2024 · 3 revisions

构建 DLL 模板

  1. 修改源代码:更新 ./cmd/agent/main.go,添加以下代码:

    // 其他代码
    import "C"
    
    //export main
    func main() {
    // 其他代码
    }

    这样可以将 main 函数导出,使其可以从DLL外部调用。

  2. 设置环境:确保您的 Windows 机器上已安装 mingwGo 环境。

  3. 构建 DLL:在 Windows 主机上运行以下命令,将代理编译为 DLL:

    go build -buildmode=c-shared -ldflags='-s -w -H=windowsgui' -o emp3r0r.dll .\cmd\agent\

用代理配置补丁 DLL

  1. 复制 DLL:将生成的 emp3r0r.dll 复制到服务器的 ~/.emp3r0r/stub-win-dll-amd64 目录下。

  2. 生成代理:在服务器上打开 emp3r0r,运行 gen_agent 命令,并选择选项3来配置 Windows 代理。

  3. 部署 DLL:生成的 DLL 完成后,将其复制到 Windows 目标机器上使用。

测试 DLL

您可以使用一个小工具来测试 DLL,调用其中的函数。以下是一个示例:

package main

import (
	"flag"
	"fmt"
	"syscall"
)

func main() {
	dll_file := flag.String("dll", "", "加载 DLL 文件")
	func_name := flag.String("func", "", "调用函数")
	flag.Parse()
	dllPath := *dll_file
	procName := *func_name

	// 加载 DLL
	dll, err := syscall.LoadLibrary(dllPath)
	if err != nil {
		fmt.Println("加载 DLL 出错:", err)
		return
	}
	defer syscall.FreeLibrary(dll)

	// 获取函数地址
	proc, err := syscall.GetProcAddress(dll, procName)
	if err != nil {
		fmt.Println("获取函数地址出错:", err)
		return
	}

	// 调用函数
	_, _, _ = syscall.SyscallN(proc, 0, 0, 0, 0)
}

构建并运行该工具:

  1. 启用日志:在 PowerShell 中启用日志记录,以便确认agent是否正在运行:

    $env:VERBOSE='true'
  2. 运行工具:使用以下命令调用 emp3r0r.dll 中的 main 函数:

    .\rundll.exe -func main -dll emp3r0r.dll

您也可以使用 rundll32.exe 来调用 DLL:

rundll32.exe emp3r0r.dll main

但是,即使设置了 VERBOSE=true,您可能也看不到任何输出。