28 lines
714 B
Go
28 lines
714 B
Go
package gomonkey
|
|
|
|
import "syscall"
|
|
|
|
func modifyBinary(target uintptr, bytes []byte) {
|
|
function := entryAddress(target, len(bytes))
|
|
err := mprotectCrossPage(target, len(bytes), syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
copy(function, bytes)
|
|
err = mprotectCrossPage(target, len(bytes), syscall.PROT_READ|syscall.PROT_EXEC)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func mprotectCrossPage(addr uintptr, length int, prot int) error {
|
|
pageSize := syscall.Getpagesize()
|
|
for p := pageStart(addr); p < addr+uintptr(length); p += uintptr(pageSize) {
|
|
page := entryAddress(p, pageSize)
|
|
if err := syscall.Mprotect(page, prot); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|