void set(void *orignal, void * mock_func) {
int ret;
pagesize_ = sysconf(_SC_PAGE_SIZE);
orignal_page_ = reinterpret_cast<int64_t>(orignal) / pagesize_;
orignal_page_ *= pagesize_;
unsigned char machine_code[] = { 0x48, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xff, 0xe0 };
ret = mprotect(reinterpret_cast<void*>(orignal_page_), pagesize_, PROT_READ | PROT_WRITE | PROT_EXEC);
if (ret < 0) {
printf("mproterct error: %d %s:%d", errno, __FILE__, __LINE__);
return;
}
if (0 == orignal_) {
memcpy(orignal_text_, orignal, sizeof(orignal_text_));
}
memcpy(machine_code + 2, &mock_func, sizeof(mock_func));
memcpy(orignal, machine_code, sizeof(machine_code));
mprotect(reinterpret_cast<void*>(orignal_page_), pagesize_, PROT_READ | PROT_EXEC);
orignal_ = orignal;
int ret;
pagesize_ = sysconf(_SC_PAGE_SIZE);
orignal_page_ = reinterpret_cast<int64_t>(orignal) / pagesize_;
orignal_page_ *= pagesize_;
unsigned char machine_code[] = { 0x48, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xff, 0xe0 };
ret = mprotect(reinterpret_cast<void*>(orignal_page_), pagesize_, PROT_READ | PROT_WRITE | PROT_EXEC);
if (ret < 0) {
printf("mproterct error: %d %s:%d", errno, __FILE__, __LINE__);
return;
}
if (0 == orignal_) {
memcpy(orignal_text_, orignal, sizeof(orignal_text_));
}
memcpy(machine_code + 2, &mock_func, sizeof(mock_func));
memcpy(orignal, machine_code, sizeof(machine_code));
mprotect(reinterpret_cast<void*>(orignal_page_), pagesize_, PROT_READ | PROT_EXEC);
orignal_ = orignal;
}
void clear() {
if (0 != orignal_) {
int ret;
ret = mprotect(reinterpret_cast<void*>(orignal_page_), pagesize_,
PROT_READ | PROT_WRITE | PROT_EXEC);
if (ret < 0) {
printf("mproterct error: %d %s:%d", errno, __FILE__, __LINE__);
return;
}
memcpy(orignal_, orignal_text_, sizeof(orignal_text_));
mprotect(reinterpret_cast<void*>(orignal_page_), pagesize_, PROT_READ | PROT_EXEC);
orignal_ = 0;
}
}