Есть ли способ найти все функции, предоставляемые DLL - PullRequest
55 голосов
/ 13 января 2009

Я искал способ получить все строки, которые отображаются на имена функций в DLL.

Под этим я подразумеваю все строки, для которых вы можете вызвать GetProcAddress. Если вы делаете шестнадцатеричный дамп dll, символы (строки) есть, но я думаю, что для получения этих имен должен быть системный вызов.

Ответы [ 13 ]

69 голосов
/ 13 января 2009

Если у вас MS Visual Studio, есть инструмент командной строки под названием DUMPBIN.

dumpbin /exports <nameofdll>
32 голосов
/ 13 января 2009

В Windows существует три типа DLL:

  1. Классические библиотеки DLL, которые предоставляют все доступные функции в таблице экспорта библиотеки DLL. Вы можете использовать dumpbin.exe или disabled.exe из Visual Studio или бесплатную зависимость для проверки этих типов. Мэтт Пьетрек написал много статей и утилит для поиска файлов Win32 PE. Взгляните на его классические статьи MSDN Magazine . Библиотеки C ++, содержащие экспортированные классы, будут экспортировать каждый метод в классе. К сожалению, он экспортирует искаженные имена, поэтому вывод dumpbin практически не читается. Вам понадобится программа наподобие vc ++ _ filt.exe, чтобы разобрать вывод.

  2. COM-библиотеки DLL, которые предоставляют COM-объекты. Эти библиотеки предоставляют несколько обычных экспортируемых функций (DllRegisterServer и т. Д.), Которые позволяют системе COM создавать объекты. Есть много утилит, которые могут просматривать эти библиотеки DLL, но если они не имеют встроенных библиотек типов, их может быть довольно сложно исследовать. 4 Разработчики имеют ряд хороших инструментов COM / ActiveX

  3. .NET DLL, которые содержат .NET сборки. Как правило, вы будете использовать инструмент, такой как .NET Reflector , чтобы копаться в них.

Редактировать: ссылка 4Developers не работает.

24 голосов
/ 13 января 2009

Также есть программа DEPENDs на http://www.dependencywalker.com/

16 голосов
/ 04 июня 2012

Попробуйте это (Linux) C код:

#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

unsigned int vpe2offset(void * base, unsigned int vpe) {
    unsigned int * ptr = base;
    unsigned int pe_offset;
    unsigned short num_sections;

    pe_offset = ptr[0x3c/4];                             //PE header offset
    ptr = base + pe_offset;                              //PE header address
    num_sections = ((unsigned short*)ptr)[6/2];          //Section count
    ptr = ((void*)base) + 0x18 + 0x60 + 16*8 + pe_offset;//Address of first section

    while (num_sections--) {
        if (vpe >= ptr[0x0c/4] && vpe < ptr[0x0c/4] + ptr[0x10/4]) {
            return vpe - ptr[0x0c/4] + ptr[0x14/4];
        }
        ptr += 0x28/4;
    }

    return 0;
}

void iterate_exports(void * base, int(*iterator)(char*)) {
    unsigned int * ptr = base;
    unsigned int pe_offset,
                 exports_offset,
                 number_of_names,
                 address_of_names;

    pe_offset = ptr[0x3c/4];
    ptr = base + pe_offset;
    exports_offset = ptr[0x78/4];
    ptr = base + vpe2offset(base, exports_offset);
    number_of_names = ptr[0x18/4];
    address_of_names = ptr[0x20/4];
    ptr = base + vpe2offset(base, address_of_names);
    while (number_of_names-- && iterator((char*)(base + vpe2offset(base, ptr++[0])))) {
        /* Do nothing */
    }
}

int print_symbol_name(char * name) {
    printf("%s\n", name);
    return 1;
}

int main(int argc, char const *argv[]) {
    int fd;
    struct stat st;
    void * base;

    if (argc == 1) {
        printf("Usage: %s <dll>\n", argv[0]);
    } else if (stat(argv[1], &st) == 0 && (fd = open(argv[1], O_RDONLY)) >= 0) {
        base = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
        if (base != MAP_FAILED) {
            iterate_exports(base, print_symbol_name);
            munmap(base, st.st_size);
        } else {
            fprintf(stderr, "Could not map \"%s\".\n", argv[1]);
        }
        close(fd);
    } else {
        fprintf(stderr, "Could not open \"%s\" for reading.\n", argv[1]);
    }
    return 0;
}

Он следует за ссылками внутри PE-файла и, наконец, вызывает функцию обратного вызова для каждого экспортируемого символа. Для обзора формата файла PE см. Это: http://www.openrce.org/reference_library/files/reference/PE%20Format.pdf

10 голосов
/ 13 января 2009

Я не знаю API WIn32 для этого: вместо этого вы (или один из инструментов, упомянутых в других статьях), делаете это, зная двоичный формат файла PE и читая файл: см. http://msdn.microsoft.com/en-us/magazine/cc301808.aspx (а в этой статье упоминается утилита "PEDUMP").

7 голосов
/ 14 января 2009

Это займет немного работы, но вы можете сделать это программно, используя библиотеку DbgHelp от Microsoft.

Отладка приложений для Microsoft .Net и Microsoft Windows, автор John Robbins - превосходная (если немного старше) книга, которая содержит сведения об использовании и полный исходный код. И вы можете купить его на Амазоне по дешевке!

6 голосов
/ 13 января 2009

Я использую dumpbinGUI , который дает вам список экспорта (и многое другое) из правого клика в проводнике Windows. dumpbin и depends также предоставят вам списки.

5 голосов
/ 13 января 2009

Вам необходимо проверить PE-заголовок .dll, так как это в конечном счете то, что в любом случае делает Windows.

Предполагая, что у вас есть указатель на .dll IMAGE_OPTIONAL_HEADER (вы можете использовать функцию dbghelp ImageNtHeader с дескриптором для .dll, загруженного через LoadLibrary, или попытаться найти ее самостоятельно, если вы знаете расположение .dll самостоятельно), вам нужно взглянуть на optional_header->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT], найти таблицу экспорта относительно необязательного заголовка со смещением, а затем просмотреть таблицу экспорта (это IMAGE_EXPORT_DIRECTORY).

Для фанатов, обратно совместимое изображение PE начинается с IMAGE_DOS_HEADER; смещение IMAGE_NT_HEADER равно IMAGE_DOS_HEADER::e_lfanew, а IMAGE_OPTIONAL_HEADER встроено в заголовок NT.

2 голосов
/ 06 августа 2010

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

Информация о файле Windows 7 DLL

Информация о файле Windows XP DLL

2 голосов
/ 13 января 2009

есть программа под названием dll export viewer, которую вы можете использовать: http://www.nirsoft.net/utils/dll_export_viewer.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...