dll에 의해 노출된 모든 기능을 찾을 수 있는 방법이 있습니까?
dll의 함수 이름에 매핑되는 모든 문자열을 가져올 방법을 찾고 있습니다.
즉, GetProcAddress를 호출할 수 있는 모든 문자열을 의미합니다.dll의 16진수 덤프를 실행하는 경우 기호(문자열)이 존재하지만 이러한 이름을 얻으려면 시스템 호출이 필요합니다.
MS Visual Studio를 사용하는 경우 DUMPBIN이라는 명령줄 도구가 있습니다.
dumpbin / dump <name ofdll >
Windows 에서는, 다음의 3 종류의 DLL이 있습니다.
DLL 내보내기 테이블에서 사용 가능한 모든 기능을 표시하는 클래식 DLL.dumpbin을 사용할 수 있습니다.이러한 유형을 검사하기 위한 무료 종속성 워커 또는 Visual Studio의 exe 또는 dependency.exe를 참조하십시오.Matt Pietrek은 Win32 PE 파일을 조사하기 위한 많은 기사와 유틸리티를 작성했습니다.MSDN 매거진의 고전적인 기사를 보세요.내보낸 클래스를 포함하는 C++ DLL은 클래스의 모든 메서드를 내보냅니다.유감스럽게도 이름이 망가져 있기 때문에 dumpbin의 출력을 읽을 수 없습니다.출력의 디멘글을 해제하려면 vc++_filt.exe와 같은 프로그램을 사용해야 합니다.
COM 오브젝트를 공개하는 COM DLL이러한 DLL은 COM 시스템이 객체를 인스턴스화할 수 있도록 하는 소수의 일반 내보내기 함수(DllRegisterServer 등)를 표시합니다.이러한 DLL을 확인할 수 있는 유틸리티는 많지만, 내장형 라이브러리가 없는 한 조사하기가 매우 어려울 수 있습니다.
4개발자는 다수의 우수한 COM/ActiveX 툴을 보유하고 있습니다.를 포함하는 .NET DLLNET 어셈블리주로 와 같은 도구를 사용합니다.NET Reflector를 참조하십시오.
편집: 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 를 참조해 주세요.
윈도우에서 "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
또, http://www.dependencywalker.com/ 에 DEPANDs 프로그램이 있습니다.
사용할 수 있는 dll 내보내기 뷰어라는 프로그램이 있습니다.http://www.nirsoft.net/utils/dll_export_viewer.html
난 항상 이걸 해야 해.그냥 이 사이트들 중 하나에 가.그들은 우리가 보통 필요로 하는 정보를 호스트한다.
나는 덤프빈을 사용한다.GUI - Windows 탐색기에서 마우스 오른쪽 버튼을 클릭하여 내보내기 목록 및 기타 많은 항목을 볼 수 있습니다. dumpbin
★★★★★★★★★★★★★★★★★」depends
둘다다다 리줄줄줄줄줄
WIn32 API에 대해서는 모릅니다.대신 PE 파일의 바이너리 포맷을 알고 파일을 읽는 것으로, 그것을 실행할 수 있습니다.http://msdn.microsoft.com/en-us/magazine/cc301808.aspx 를 참조해 주세요(이 기사에는 「PEDUMP」유틸리티가 기재되어 있습니다).
약간의 작업이 필요하지만 Microsoft의 DbgHelp 라이브러리를 사용하여 프로그래밍 방식으로 이 작업을 수행할 수 있습니다.
Microsoft 용 어플리케이션 디버깅.Net and Microsoft Windows by John Robbins는 사용 상세와 모든 소스를 포함한 훌륭한 (조금 오래된) 책입니다.그리고 아마존에서 저렴하게 살 수 있어요!
.dll의 PE 헤더를 검사해야 합니다.이는 Windows가 최종적으로 수행하는 작업이기 때문입니다.
.dll에 합니다.IMAGE_OPTIONAL_HEADER
(dbghelp)를 사용할 수 ).ImageNtHeader
.flash를 통해 합니다.LoadLibrary
직접 optional_header->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]
을 찾은 후 내보내기 은 내보내기 테이블입니다)을 IMAGE_EXPORT_DIRECTORY
를 참조해 주세요.
가 PE로 됩니다.IMAGE_DOS_HEADER
; ; 에의 오프셋IMAGE_NT_HEADER
IMAGE_DOS_HEADER::e_lfanew
및 , 。IMAGE_OPTIONAL_HEADER
【NT】【NT】【NT】【NT】★★★★★★】
실행시 또는 매우 쓸모없는 시스템("dumpbin")에서 알 수 없는 dll의 함수명을 찾으려면 PE파일을 해석하고 스스로 디망글링(demangling)을 하게 될 것입니다.
원하는 게 뭔지 좀 더 명확히 해야죠.
BFD 라이브러리는 여러 GNU binutils 툴의 주요 컴포넌트인 당신이 원하는 것(그리고 부엌 싱크)을 수행합니다.그것이 당신의 문제에 맞을지 확신할 수 없습니다.
PE를 해석할 필요도 없고 툴도 필요 없습니다.표준 Win32 api(D) 사용만 하면 됩니다.
코드(C)는 Adv에서 여러 번 공개되었습니다.Win32 api ng (뉴스://comp.os.ms-windows.programmer.win32) (1992년부터...)
언급URL : https://stackoverflow.com/questions/437432/is-there-a-way-to-find-all-the-functions-exposed-by-a-dll
'programing' 카테고리의 다른 글
Gradle 및 D를 통해 테스트에 시스템 속성을 부여하는 방법 (0) | 2022.09.18 |
---|---|
MySQL ERROR 1045 (28000):사용자 'bill'@'localhost'에 대한 액세스가 거부되었습니다(암호: YES 사용). (0) | 2022.09.18 |
웹 개발자용 Linux 프리 인스톨 (0) | 2022.09.18 |
MySQL 데이터베이스에 연결하는 방법 (0) | 2022.09.18 |
두 날짜를 어떻게 비교하나요? (0) | 2022.09.15 |