replace_unix.go 606 B

1234567891011121314151617181920212223242526
  1. //+build !windows
  2. package monkey
  3. import (
  4. "syscall"
  5. )
  6. // this function is super unsafe
  7. // aww yeah
  8. // It copies a slice to a raw memory location, disabling all memory protection before doing so.
  9. func copyToLocation(location uintptr, data []byte) {
  10. f := rawMemoryAccess(location, len(data))
  11. page := rawMemoryAccess(pageStart(location), syscall.Getpagesize())
  12. err := syscall.Mprotect(page, syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC)
  13. if err != nil {
  14. panic(err)
  15. }
  16. copy(f, data[:])
  17. err = syscall.Mprotect(page, syscall.PROT_READ|syscall.PROT_EXEC)
  18. if err != nil {
  19. panic(err)
  20. }
  21. }