Есть ли способ найти все функции, предоставляемые dll
Я искал способ получить все строки, которые сопоставляются с именами функций в dll.
Я имею в виду все строки, для которых вы можете вызвать GetProcAddress. Если вы делаете шестнадцатеричный дамп dll, символы (строки) есть, но я полагаю, что должен мне системный вызов, чтобы получить эти имена.
13 ответов
Это требует немного работы, но вы можете сделать это программно, используя DbgHelp библиотека от Microsoft.
отладка приложений для Microsoft .Net и Microsoft Windows, Джон Роббинс - отличное (если немного старше) книга, которая содержит сведения и полный источник. И вы можете забрать его на Amazon за дешево!
Если у вас есть MS Visual Studio, есть инструмент командной строки под названием DUMPBIN.
dumpbin /exports <nameofdll>
существует три различных типа библиотек DLL под Windows:
классические библиотеки DLL, которые предоставляют все доступные функции в таблице экспорта библиотеки DLL. Вы можете использовать dumpbin.exe или зависит.exe из Visual Studio или бесплатно зависимость walker для изучения этих типов. Мэтт Pietrek написал много статей и утилит для рытья в Win32 PE файлов. Посмотрите на его классический статьи журнала MSDN. Библиотеки DLL C++, содержащие экспортированные классы будет экспортировать каждый метод в классе. К сожалению, он экспортирует искаженные имена, поэтому выход dumpbin практически нечитаем. Вам нужно будет использовать такую программу, как vc++_filt.exe в demangle выход.
com DLL, которые предоставляют COM-объекты. Эти библиотеки DLL предоставляют несколько регулярных экспортированных функций (DllRegisterServer и т. д.), которые позволяют системе COM создавать экземпляры объектов. Есть много утилит, которые могут смотреть на эти библиотеки DLL, но если они не имеют встроенного типа библиотеки, которые они могут быть довольно трудны для изучения.
4Developers есть ряд хороших инструментов COM / ActiveXбиблиотеки DLL .NET, содержащие сборки .NET. Typiically вы будете использовать инструмент, как .Чистый отражатель копаться в этих.
Edit: ссылка 4Developers не работает.
попробуйте этот (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 делает в любом случае.
если у вас есть указатель .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
Я всегда должен это делать. Я просто хожу на один из этих сайтов. В них хранится информация, которая нам обычно нужна.
вы также можете использовать инструмент "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 года...)