12345678910111213141516171819202122232425262728293031 |
- package monkey
- import (
- "reflect"
- "syscall"
- "unsafe"
- )
- func rawMemoryAccess(p uintptr, length int) []byte {
- return *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
- Data: p,
- Len: length,
- Cap: length,
- }))
- }
- func pageStart(ptr uintptr) uintptr {
- return ptr & ^(uintptr(syscall.Getpagesize() - 1))
- }
- // from is a pointer to the actual function
- // to is a pointer to a go funcvalue
- func replaceFunction(from, to uintptr) (original []byte) {
- jumpData := jmpToFunctionValue(to)
- f := rawMemoryAccess(from, len(jumpData))
- original = make([]byte, len(f))
- copy(original, f)
- copyToLocation(from, jumpData)
- return
- }
|