- 论坛徽章:
- 0
|
写了个演示性的代码, 在x86的gcc 4.45上测试通过
- #include <stdio.h>
- void *memrmem(const void *v, size_t size, const void *pat, size_t patsize) {
- const char *p;
- if (size < patsize)
- return NULL;
- if (patsize == 0)
- return (void *) v;
- for (p = v, p += size-patsize; size >= patsize; --p, --size)
- if (memcmp(p, pat, patsize) == 0)
- return (void *) p;
- return NULL;
- }
- int search_caller() {
- unsigned char * ptr, *caller;
- asm volatile ("movl 4(%%ebp), %%eax; \
- movl %%eax, %0;"
- :"=g"(ptr)
- :
- :"%eax"
- );
- caller = memrmem(ptr - 1000, 1000, "\x55\x89\xe5", 3);
- if(caller) {
- printf("0x%08X\n", caller);
- }
- }
- int main(int argc, char *argv[]) {
- search_caller();
- printf("0x%08X\n", main);
- return 0;
- }
复制代码 |
|