programing

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

copysource 2022. 9. 18. 16:06
반응형

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

dll의 함수 이름에 매핑되는 모든 문자열을 가져올 방법을 찾고 있습니다.

즉, GetProcAddress를 호출할 수 있는 모든 문자열을 의미합니다.dll의 16진수 덤프를 실행하는 경우 기호(문자열)이 존재하지만 이러한 이름을 얻으려면 시스템 호출이 필요합니다.

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

dumpbin / dump <name ofdll >

Windows 에서는, 다음의 3 종류의 DLL이 있습니다.

  1. DLL 내보내기 테이블에서 사용 가능한 모든 기능을 표시하는 클래식 DLL.dumpbin을 사용할 수 있습니다.이러한 유형을 검사하기 위한 무료 종속성 워커 또는 Visual Studio의 exe 또는 dependency.exe를 참조하십시오.Matt Pietrek은 Win32 PE 파일을 조사하기 위한 많은 기사와 유틸리티를 작성했습니다.MSDN 매거진의 고전적인 기사를 보세요.내보낸 클래스를 포함하는 C++ DLL은 클래스의 모든 메서드를 내보냅니다.유감스럽게도 이름이 망가져 있기 때문에 dumpbin의 출력을 읽을 수 없습니다.출력의 디멘글을 해제하려면 vc++_filt.exe와 같은 프로그램을 사용해야 합니다.

  2. COM 오브젝트를 공개하는 COM DLL이러한 DLL은 COM 시스템이 객체를 인스턴스화할 수 있도록 하는 소수의 일반 내보내기 함수(DllRegisterServer 등)를 표시합니다.이러한 DLL을 확인할 수 있는 유틸리티는 많지만, 내장형 라이브러리가 없는 한 조사하기가 매우 어려울 수 있습니다. 4개발자는 다수의 우수한 COM/ActiveX 툴을 보유하고 있습니다.

  3. 를 포함하는 .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

난 항상 이걸 해야 해.그냥 이 사이트들 중 하나에 가.그들은 우리가 보통 필요로 하는 정보를 호스트한다.

Windows 7 DLL 파일 정보

Windows XP DLL 파일 정보

는 덤프빈을 사용한다.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_HEADERIMAGE_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

반응형