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

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

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

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 или бесплатно зависимость 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. Typiically вы будете использовать инструмент, как .Чистый отражатель копаться в этих.

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


также есть программа DEPENDs в 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], найдите таблицу экспорта относительно необязательного заголовка со смещением там, а затем пройдите таблицу экспорта (это IMAGE_EXPORT_DIRECTORY).

для funsies, обратная совместимость PE изображение начинается с IMAGE_DOS_HEADER; смещение к IMAGE_NT_HEADER is 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.ОС.ms-windows.программист.win32) (с 1992 года...)