ProgramingTip

DLL에 의해 노출 된 모든 기능을 찾는 방법이 있습니까?

bestdevel 2020. 12. 6. 21:50
반응형

DLL에 의해 노출 된 모든 기능을 찾는 방법이 있습니까?


dll의 매핑되는 모든 함수를 찾는 방법을 찾습니다.

이것은 GetProcAddress를 호출 할 수있는 모든 것을 의미합니다. dll의 16 개의 진수를 수행하면 기호 (문자열)가 해당 이름을 호출이 필요하다고 생각합니다.


약간의 작업이 필요하지만 Microsoft DbgHelp 라이브러리를 사용하여 프로그래밍 방식으로이 작업을 수행 할 수 있습니다 .

Microsoft .Net 및 Microsoft Windows 용 응용 프로그램 저작 (John Robbins )은 사용 세부 정보와 전체 소스를 포함하는 훌륭한 (조금 더 오래된)입니다. 그리고 저렴한 가격으로 아마존에서 수령 할 수 있습니다!


MS Visual Studio가있는 경우 DUMPBIN이라는 명령 줄 도구가 있습니다.

dumpbin / exports <nameofdll>

Windows에는 다음과 같은 세 가지 유형의 DLL이 있습니다.

  1. DLL의 내보내기 테이블에서 사용 가능한 모든 기능을 노출하는 클래식 DLL입니다. Visual Studio의 dumpbin.exe 또는 dependent.exe 또는 무료 기술 워커 를 사용하여 검사 할 수 있습니다. Matt Pietrek은 Win32 PE 파일을 파헤 치기위한 많은 기사와 유틸리티를 작성했습니다. 그의 고전적인 MSDN Magazine 기사를 찾았습니다 . 내 보낸 클래스가 포함 된 C ++ DLL은 클래스의 모든 메서드를 내 보냅니다. 불행히도 그것은 잘린 이름을 효과적으로 읽을 수 없습니다. 출력을 demangle vc ++ _ filt.exe와 같은 프로그램을 사용합니다.

  2. COM 개체를 노출하는 COM DLL. DLL은 COM 시스템이 개체를 인스턴스화 할 수있는 소수의 일반 내에서 보낸 함수 (DllRegisterServer 등)를 노출합니다. DLL을 사용할 수있는 많은 유틸리티가 포함 된 형식 라이브러리가 검사하기가 매우 어려운 수 있습니다. 4 개발자 는 좋은 COM / ActiveX 도구를 많이 가지고 있습니다.

  3. .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 7 DLL 파일 정보

Windows XP DLL 파일 정보


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

반응형