Есть ли способ найти все функции, предоставляемые dll


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

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

13 54

13 ответов:

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

отладка приложений для Microsoft .Net и Microsoft Windows, Джон Роббинс - отличное (если немного старше) книга, которая содержит сведения и полный источник. И вы можете забрать его на Amazon за дешево!

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

dumpbin /exports <nameofdll>

существует три различных типа библиотек DLL под Windows:

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

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

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

Edit: ссылка 4Developers не работает.

также есть программа зависит от http://www.dependencywalker.com/

попробуйте этот (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

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

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

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

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

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

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

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

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

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

вы также можете использовать инструмент "objdump" linux под windows, но вам, возможно, придется сначала установить cygwin.

Я использую следующие команды:

# feed the output to less
objdump -x nameOfThe.Dll| less
# or use egrep to filter
objdump -x /cygdrive/c/Windows/system32/user32.dll | \ 
    egrep "^\s*\[[ [:digit:]]{4}\] \w{1,}" | less

Я думаю, вы закончите разбор PE-файла и сделаете деманглинг себя, если вы хотите найти имена функций неизвестной dll во время выполнения или чрезвычайно бесполезной системы("dumpbin"); magic.

вы должны быть более ясным о том, что вы хотите.

BFD библиотека делает то, что вы хотите (и кухонная раковина), которая является основным компонентом нескольких инструментов GNU binutils. Я не могу быть уверен, что это будет соответствовать вашей проблеме.

вам не нужен никакой инструмент, и вам не нужно разбирать PE. Просто используйте стандартный Win32 api (D)

код (в C) был опубликован много раз на ADV. Win32 api ng ( новости: / / comp.os.ms-windows.programmer.win32) (с 1992 года...)