Skip to content

Instantly share code, notes, and snippets.

@TACIXAT
Created September 12, 2020 21:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TACIXAT/ba77f1781348d0cd4ac7d0866471fba6 to your computer and use it in GitHub Desktop.
Save TACIXAT/ba77f1781348d0cd4ac7d0866471fba6 to your computer and use it in GitHub Desktop.
Windows Executable JIT Memory in Golang
package main
// Executable memory / JIT in Golang for Windows
// Linux see:
// https://medium.com/kokster/writing-a-jit-compiler-in-golang-964b61295f
import (
"log"
"reflect"
"syscall"
"unsafe"
)
type intFunc func() (int, int)
func main() {
bs := []byte{
// mov rax, 5
0x48, 0xC7, 0xC0, 0x05, 0x00, 0x00, 0x00,
// mov [rsp+8], rax
0x48, 0x89, 0x44, 0x24, 0x08,
// mov rax, 65535
0x48, 0xC7, 0xC0, 0xFF, 0xFF, 0x00, 0x00,
// mov [rsp+16], rax
0x48, 0x89, 0x44, 0x24, 0x10,
// ret
0xC3}
size := len(bs)
h, err := syscall.CreateFileMapping(
syscall.InvalidHandle,
nil,
syscall.PAGE_EXECUTE_READWRITE,
0,
uint32(size),
nil,
)
if err != nil {
log.Fatal("create ", err)
}
addr, err := syscall.MapViewOfFile(
h,
syscall.FILE_MAP_READ|syscall.FILE_MAP_WRITE|syscall.FILE_MAP_EXECUTE,
0,
0,
uintptr(size),
)
if err != nil {
log.Fatal("map ", err)
}
var sh reflect.SliceHeader
sh.Data = addr
sh.Len = size
sh.Cap = size
bsx := *(*[]byte)(unsafe.Pointer(&sh))
copy(bsx, bs)
log.Println(bsx)
unsafeFunc := (uintptr)(unsafe.Pointer(&bsx))
retN := *(*intFunc)(unsafe.Pointer(&unsafeFunc))
val5, valFFFF := retN()
log.Println("from go", val5, valFFFF)
err = syscall.CloseHandle(h)
if err != nil {
log.Fatal("close ", err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment