#include #include #include int test1(char *msg); int test2(char *msg); void _jmp(void); void _hook_init(char *buf, int n); void _hook(char *ptr, char *hook, char *bak, int n); unsigned int t2_ptr = (unsigned int)test2; unsigned int *t2_pptr = &t2_ptr; char buf1[10]; char buf2[10]; int test1(char *msg) { printf("test1 call arg:'%s'\n", msg); return 1; } int test2(char *msg) { printf("test2 call arg:'%s'\n", msg); return 2; } int main(void) { _hook_init(buf1, sizeof(buf1)); printf("rv: %d\n", test1("no hook")); _hook((char *)test1, buf1, buf2, sizeof(buf1)); printf("rv: %d\n", test1("hooked")); _hook((char *)test1, buf2, buf1, sizeof(buf1)); printf("rv: %d\n", test1("no hook")); return 0; } void _hook_init(char *buf, int n) { buf[0] = 0xff; buf[1] = 0x25; *(int *)(buf + 2) = (int)&t2_ptr; } void _hook(char *ptr, char *hook, char *bak, int n) { memcpy(bak, ptr, n); memcpy(ptr, hook, n); } void _jmp(void) { __asm__ __volatile__ ("jmp *t2_ptr;"); __asm__ __volatile__ ("nop; nop; nop; nop;"); }