您好,欢迎来到好走旅游网。
搜索
您的当前位置:首页linux下hook函数

linux下hook函数

来源:好走旅游网

    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <stdint.h>
    #include <string.h>
    #include <sys/mman.h>
    #include <errno.h>
    #include <unistd.h>

    void set_hook(void *to_mock_func, void *mock_func)
    {
        uint8_t machine_code[] = {
                //movq $0x0, %rax 后面8个字节的0为位立即数
                0x48, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
                //jmpq *%rax
                0xff, 0xe0
            };

        int pagesize = sysconf(_SC_PAGE_SIZE);
        if (pagesize == -1)
        {
            exit(errno);
        }

        uint8_t *mem = (uint8_t *) to_mock_func;
        void *p = (uint8_t*) (mem - ((uint_t) mem % pagesize));
        if (mprotect(p, pagesize, PROT_READ | PROT_WRITE | PROT_EXEC))
        {
            perror("mprotect error");
            exit(errno);
        }

        //改写立即数为mock的地址,写入函数入口处
        memcpy(machine_code + 2, &mock_func, sizeof(mock_func));
        memcpy(mem, machine_code, sizeof(machine_code));

        if (mprotect(p, pagesize, PROT_EXEC))
        {
            perror("mprotect error");
            exit(errno);
        }
    }

    using namespace std;
    class Cal
    {
    public:
        int Sum(int a, int b, long c, long d, long e)
        {
            std::cout << "Cal::Sum called... " << std::endl;
            return 0;
        }
        int m;
    };

    int MockCalSum(Cal *p, int a, int b, long c, long d, long e)
    {
        int x = 0;
        x += a + b + c + d;
        std::cout << "MockCalSum called... " << std::endl;
        p->m = x;
        return x;
    }

    int main()
    {
        int a = 0;
        int b = 1;
        long c = 2;
        long d = 3;
        long e = 4;
        Cal cal;
        cal.Sum(a, b, c, d, e);
        MockCalSum(&cal, a, b, c, d, e);
        set_hook((void*)&Cal::Sum, (void*)MockCalSum);
        cal.Sum(a, b, c, d, e);
        return 0;
    }


因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- haog.cn 版权所有 赣ICP备2024042798号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务