mirror of
https://github.com/0O0o0oOoO00/Alas.git
synced 2026-05-23 00:39:29 +08:00
37 lines
1.1 KiB
C++
37 lines
1.1 KiB
C++
|
|
#include "dobby/dobby_internal.h"
|
|
#include "core/arch/Cpu.h"
|
|
|
|
#include <unistd.h>
|
|
#include <sys/mman.h>
|
|
#include <string.h>
|
|
|
|
#if !defined(__APPLE__)
|
|
PUBLIC int DobbyCodePatch(void *address, uint8_t *buffer, uint32_t buffer_size) {
|
|
#if defined(__ANDROID__) || defined(__linux__)
|
|
int page_size = (int)sysconf(_SC_PAGESIZE);
|
|
uintptr_t patch_page = ALIGN_FLOOR(address, page_size);
|
|
uintptr_t patch_end_page = ALIGN_FLOOR((uintptr_t)address + buffer_size, page_size);
|
|
|
|
// change page permission as rwx
|
|
mprotect((void *)patch_page, page_size, PROT_READ | PROT_WRITE | PROT_EXEC);
|
|
if (patch_page != patch_end_page) {
|
|
mprotect((void *)patch_end_page, page_size, PROT_READ | PROT_WRITE | PROT_EXEC);
|
|
}
|
|
|
|
// patch buffer
|
|
memcpy(address, buffer, buffer_size);
|
|
|
|
// restore page permission
|
|
mprotect((void *)patch_page, page_size, PROT_READ | PROT_EXEC);
|
|
if (patch_page != patch_end_page) {
|
|
mprotect((void *)patch_end_page, page_size, PROT_READ | PROT_EXEC);
|
|
}
|
|
|
|
addr_t clear_start_ = (addr_t)address;
|
|
ClearCache((void *)clear_start_, (void *)(clear_start_ + buffer_size));
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
#endif |