Как определить, удаляются ли символы во время выполнения? - PullRequest
9 голосов
/ 28 февраля 2011

В моей программе на C ++, как я могу программно определить во время выполнения, были ли символы удалены с помощью средства разработки gnu 'strip' в Linux?

Я хотел бы определение функции, которая возвращает true, если удален,в противном случае false.

Сработает ли dlsym () в функции main () для надежного обнаружения этого?

Ответы [ 5 ]

8 голосов
/ 01 марта 2011

Из оставленного комментария для другого ответа :

Полосатый ELF будет лишен записи .symtab. Команда file проходит через все заголовки раздела ELF, пока не будет найден раздел таблицы символов. Если один не может быть найден, двоичный файл считается раздетым.


Библиотека libelf позволяет программе манипулировать объектными файлами ELF, архивными файлами и членами архива. Справочные страницы elf (3E) содержат документацию по использованию библиотеки. В следующем коде приведен пример определения того, удаляется ли исполняемый файл путем поиска существования раздела таблицы символов (.symtab).

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

/* Include for ELF processing */
#include <libelf.h>
#include <gelf.h>

int main(int argc, char ** argv)
{
    int fd;
    const char *file = argv[0];

    Elf *elf;       /* ELF pointer for libelf */
    Elf_Scn *scn;   /* section descriptor pointer */
    GElf_Shdr shdr; /* section header */

    /* Open ELF file to obtain file descriptor */
    if((fd = open(file, O_RDONLY)) < 0)
    {
        fprintf(stderr, "Error opening file %s\n", file);
        exit(EXIT_FAILURE);
    }

    /* Protect program from using an older library */
    if(elf_version(EV_CURRENT) == EV_NONE)
    {
        fprintf(stderr, "WARNING - ELF Library is out of date!\n");
        exit(EXIT_FAILURE);
    }

    /* Initialize elf pointer for examining contents of file */
    elf = elf_begin(fd, ELF_C_READ, NULL);

    /* Initialize section descriptor pointer so that elf_nextscn()
     * returns a pointer to the section descriptor at index 1. */
    scn = NULL;

    /* Iterate through ELF sections */
    while((scn = elf_nextscn(elf, scn)) != NULL)
    {
        /* Retrieve section header */
        gelf_getshdr(scn, &shdr);

        /* If a section header holding a symbol table (.symtab)
         * is found, this ELF file has not been stripped. */
        if(shdr.sh_type == SHT_SYMTAB)
        {
            printf("NOT STRIPPED\n");
            break;
        }
    }

    elf_end(elf);
    close(fd);
    exit(EXIT_SUCCESS);
}
8 голосов
/ 28 февраля 2011

Я знаю, что команда file может определить разницу, поэтому вы можете посмотреть на ее источник, чтобы узнать, какой механизм он использует.

2 голосов
/ 28 февраля 2011

dlsym смотрит на динамические символы, которые не затрагиваются strip .Таблица статических символов содержится в разделах, которые не загружаются во время выполнения и, следовательно, не отображаются в таблице сегментов.

Довольно неплохой эвристикой будет наблюдать за существованием таблицы разделов в заголовке ELF,который обычно отображается в вашей памяти процесса, хотя интерфейсы динамического компоновщика делают намеренно трудно определить, где.В типичной системе, которая имеет функцию dl_iterate_phdrs (которая является расширением стандарта), вы можете пройти PHDRS и проверить на vaddr для каждого, есть ли там магическое число ELF, но это неспособ, форма или форма портативный.

1 голос
/ 26 сентября 2013

readelf --sections binary_path | grep debug_info

Нетрудно в общем сказать, был ли удален двоичный файл или нет, потому что существуют разные способы удаления файла. По сути, удаление удаляет некоторые разделы, связанные с символами и отладкой. Однако если вы замените «debug_info» на «debug», вы увидите, что в стандартных двоичных файлах дистрибутива Ubuntu остались некоторые разделы, связанные с отладкой.

1 голос
/ 28 февраля 2011

Вы можете использовать popen () , чтобы выполнить nm в целевом приложении, а затем проанализировать вывод , чтобы выяснить, раздето оно или нет.

nm: /bin/ls: no symbols
...