Есть ли способ найти все функции, открытые dll
Я искал способ получить все строки, которые сопоставляются именам функций в dll.
Я подразумеваю под этим все строки, для которых вы можете вызвать GetProcAddress. Если вы выполняете шестнадцатеричный дамп dll, символы (строки) есть, но я полагаю, что мне нужен системный вызов для получения этих имен.
Ответы
Ответ 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.
Ответ 4
Также есть программа DEPENDs на http://www.dependencywalker.com/
Ответ 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.
Ответ 9
существует программа под названием dll export viewer, которую вы можете использовать: http://www.nirsoft.net/utils/dll_export_viewer.html
Ответ 10
Я всегда должен это делать. Я просто перехожу на один из этих сайтов. Они содержат информацию, которая нам обычно нужна.
Информация о файле DLL Windows 7
Информация о файлах DLL Windows XP
Ответ 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