2016-11-24 2 views
0

Я могу проверить точку входа моего двоичного файла с помощью «$ readelf cbinary -a» и через код. Но как проверить его точку входа виртуального adr, когда двоичный файл mmaped, а затем прыгать туда?перейти, перейти к точке входа mmaped ELF двоичный

int fd; 
     int PageSize; 
     char *fileName = "/home/dssiam/workspace_eclipse/hello/src/cprog"; 
     if ((PageSize = sysconf(_SC_PAGE_SIZE)) < 0) { 
      perror("sysconf() Error="); 
     } 

    if ((fd = open(fileName, O_RDWR, S_IXUSR | S_IXGRP | S_IXOTH)) == -1) 
    { 
      perror("err open file:"); 
      exit(1); 
    } 
    else 
    { 
     fd = open(fileName, O_RDWR, S_IXUSR | S_IXGRP | S_IXOTH); 
    } 

     void *address; 
     int len; 
     off_t my_offset = 0; 
     len = PageSize*3; //Map one page 
     address = mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, my_offset); 
     if (address == MAP_FAILED) 
     { 
      perror("mmap error. "); 
     } 



     lseek(fd, 24, SEEK_SET); 
     unsigned long entry_point; 
     read(fd, &entry_point, sizeof(entry_point)); //IT RETURN entry point adr of my binary at "/home/dssiam/workspace_eclipse/hello/src/cprog" but not in VM 

     printf("entry: 0x%lx\n", entry_point); 
     close(fd); 
     void *ptr = (void *)0x80484b0; // 0x80484b0 - entry_point vaddress 
     goto *ptr; //no jump here 

так что я могу перейти к началу моей основной программы, но я не могу перейти к двоичному «cprog» хранятся на моем жестком диске и mmaped области тоже. любая помощь будет оценена.

+0

Это не действительный C. – Olaf

+0

Случай с проблемой XY (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? – davmac

ответ

1

В коде есть много ошибок (неправильная защита от mmap, неправильный начальный адрес mmap, произвольный тип страницы, стандарт C специально запрещает этот вид вычисляемого goto), но самая большая проблема заключается в том, что этот метод просто не будет работать, за исключением, возможно, для большинство основных случаев.

Вы не можете просто удалить одну функцию из файла эльфа в память и ожидать ее работы - вам нужно будет выполнить перемещение для перемещаемого кода, и даже для PIC (независимого от позиции кода) вам все равно нужно создать GOT ,

Я собираюсь угадать, что вы действительно хотите динамически загружать файлы с соблюдением, поэтому используйте стандартный способ для этого: скомпилируйте свой файл в .so динамическую библиотеку, затем используйте dlopen/dlsym для доступа к функциям из файла.

Смежные вопросы