贴一下卡住我的代码:
#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;
}