被不到50行代码卡了一个星期是怎样的体验

贴一下卡住我的代码:

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

void print() {
    printf("Hello\n");
}

void print_v2() {
    printf("GoodBye\n");
}

static void __attribute__((constructor)) init() {
    int numpages = 1;
    int pagesize = sysconf(_SC_PAGE_SIZE);
    #define PAGE_MASK (~(pagesize-1))

    int ret = mprotect((void*)((uintptr_t)print & PAGE_MASK), numpages*pagesize, PROT_READ|PROT_WRITE|PROT_EXEC);
    if (ret != 0) {
        printf("error: %s\n", strerror(errno));
        exit(1);
    }

    #pragma pack(push, 1)
    uint32_t ins[] = {
        0x3c190000 | ((uintptr_t)print_v2 >> 48),
        0x37390000 | (((uintptr_t)print_v2 >> 32) & 0xFFFF),
        0x0019cc38,
        0x37390000 | (((uintptr_t)print_v2 >> 16) & 0xFFFF),
        0x0019cc38,
        0x37390000 | ((uintptr_t)print_v2 & 0xFFFF),
        0x03200008,
        0x0
    };
    #pragma pack(pop)

    memcpy(print, ins, sizeof(ins));
}

int main() {
    print();
    return 0;
}

这段代码是干什么用的?

函数执行是动态修改代码段,使得原来的print函数转而去执行print_v2函数。

业余爱好还是工作上用的?

跟考试时被一道题卡了 15 分钟的体验差不多

1 个赞

orz 还有这种操作
0x3739 这些是魔数吗?

是机器指令

直接用gcc编译执行时提示

$ ./a.out 
Segmentation fault