DLL에 의해 노출 된 모든 기능을 찾는 방법이 있습니까?
dll의 매핑되는 모든 함수를 찾는 방법을 찾습니다.
이것은 GetProcAddress를 호출 할 수있는 모든 것을 의미합니다. dll의 16 개의 진수를 수행하면 기호 (문자열)가 해당 이름을 호출이 필요하다고 생각합니다.
약간의 작업이 필요하지만 Microsoft 의 DbgHelp 라이브러리를 사용하여 프로그래밍 방식으로이 작업을 수행 할 수 있습니다 .
Microsoft .Net 및 Microsoft Windows 용 응용 프로그램 저작 (John Robbins )은 사용 세부 정보와 전체 소스를 포함하는 훌륭한 (조금 더 오래된)입니다. 그리고 저렴한 가격으로 아마존에서 수령 할 수 있습니다!
MS Visual Studio가있는 경우 DUMPBIN이라는 명령 줄 도구가 있습니다.
dumpbin / exports <nameofdll>
Windows에는 다음과 같은 세 가지 유형의 DLL이 있습니다.
DLL의 내보내기 테이블에서 사용 가능한 모든 기능을 노출하는 클래식 DLL입니다. Visual Studio의 dumpbin.exe 또는 dependent.exe 또는 무료 기술 워커 를 사용하여 검사 할 수 있습니다. Matt Pietrek은 Win32 PE 파일을 파헤 치기위한 많은 기사와 유틸리티를 작성했습니다. 그의 고전적인 MSDN Magazine 기사를 찾았습니다 . 내 보낸 클래스가 포함 된 C ++ DLL은 클래스의 모든 메서드를 내 보냅니다. 불행히도 그것은 잘린 이름을 효과적으로 읽을 수 없습니다. 출력을 demangle vc ++ _ filt.exe와 같은 프로그램을 사용합니다.
COM 개체를 노출하는 COM DLL. DLL은 COM 시스템이 개체를 인스턴스화 할 수있는 소수의 일반 내에서 보낸 함수 (DllRegisterServer 등)를 노출합니다. DLL을 사용할 수있는 많은 유틸리티가 포함 된 형식 라이브러리가 검사하기가 매우 어려운 수 있습니다.
4 개발자는 좋은 COM / ActiveX 도구를 많이 가지고 있습니다..NET 어셈블리를 포함하는 .NET DLL. 일반적으로 .NET Reflector 와 같은 도구를 사용하여 이들을 파헤 .
편집 : 4 개발자 링크가 작동하지 않습니다.
또한 http://www.dependencywalker.com/에 DEPENDs 프로그램이 있습니다 .
이 (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"유틸리티에 대해 언급 함).
Windows 탐색기에서 마우스 오른쪽 버튼을 클릭하여 내보내기 목록 (및 기타)을 제공 하는 dumpbinGUI 를 사용합니다. dumpbin
그리고 depends
모두 잘 당신에게 목록을 제공 할 것입니다.
.dll의 PE 헤더를 검사해야합니다. 궁극적으로 Windows가 수행하는 작업이기 때문입니다.
.dll에 대한 포인터가 있다고 가정하면 IMAGE_OPTIONAL_HEADER
( ImageNtHeader
로드 된 .dll에 대한 핸들과 함께 dbghelp의 함수를 사용 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
신약 헤더에 포함됩니다.
사용할 수있는 dll 내보내기 뷰어라는 프로그램이 있습니다. http://www.nirsoft.net/utils/dll_export_viewer.html
나는 항상 이것을해야한다. 이 사이트 중 하나로 이동합니다. 그들은 우리가 일반적으로 필요한 정보를 호스팅합니다.
Windows에서 "objdump"리눅스 도구를 사용할 수도 있지만 먼저 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
런타임에서 알 수없는 dll의 함수 이름을 찾고 싶거나 매우 쓸모없는 system ( "dumpbin"); 마법.
당신이 원하는 것에 대해 더 명확하게해야합니다.
BFD 라이브러리는 여러 GNU binutils 도구의 주요 구성 요소 인 원하는 작업 (및 주방 싱크대)을 수행합니다. 귀하의 문제에 맞는지 확신 할 수 없습니다.
도구가 필요하지 않으며 PE를 구문 분석 할 필요도 없습니다. 표준 Win32 API (D)를 사용하십시오.
코드 (C)는 Adv.Win32 API (news : //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
'ProgramingTip' 카테고리의 다른 글
쉘에서 마지막으로 캐치 작성 시도 (0) | 2020.12.06 |
---|---|
SQL 서버에서 저장 프로 시저의 예약 된 실행 (0) | 2020.12.06 |
SQL Server 데이터베이스의 소유자를 변경 한 비용은 무엇입니까? (0) | 2020.12.06 |
PHP를 사용하여 "-"(빼기 기호)가 처음부터 구매를 두 개의 개의 $ var로 분할해야합니까? (0) | 2020.12.06 |
iPhone 앱을 여러 SDK (펌웨어) 버전과 호환 만드는 방법 (0) | 2020.12.05 |