Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

dumpbin /exports <nameofdll>

Ответ 3

В Windows существует три различных типа DLL:

  • Классические DLL файлы, которые раскрывают каждую доступную функцию в таблице экспорта DLL. Вы можете использовать dumpbin.exe или depend.exe из Visual Studio или бесплатный зависимый ходок для изучения этих типов. Мэтт Пьетрек написал много статей и утилит для перекопа в файлы Win32 PE. Взгляните на его классический статьи журнала MSDN. С++ DLL, которые содержат экспортированные классы, будут экспортировать каждый метод в класс. К сожалению, он экспортирует измененные имена, поэтому вывод dumpbin практически нечитабелен. Вам нужно будет использовать программу, такую ​​как vС++ _ filt.exe, для демонстрации вывода.

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

  • .NET DLL, которые содержат сборки .NET. Обычно вам нужно использовать инструмент, например .NET Reflector.

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

Вам нужно проверить PE-заголовок DLL, так как в конечном итоге это делает Windows.

Предполагая, что у вас есть указатель на .dll IMAGE_OPTIONAL_HEADER (вы можете использовать функцию dbghelp ImageNtHeader с дескриптором .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.

Ответ 11

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

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

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

Ответ 12

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

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

Ответ 13

Вы также можете использовать инструмент "objdump" linux под окнами, но вам, возможно, придется сначала установить 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