函数hack

来源:互联网 发布:环境监测总站数据 编辑:程序博客网 时间:2024/05/02 00:49
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;

}


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;
    }
}

0 0
原创粉丝点击