[Delphi] Odczytywanie funkcji bibliotek z skompilowanego exe

0

Witam,

Mój problem jest stosunkowo ciężkim przypadkiem. Możliwe, że będą mogli mi pomoc tylko eksperci w danej dziedzinie :S (Albo życzliwa osoba, która dzięki niespotykanwmu szczęściu znalazła by owy kawałek kodu gdzieś w internecie).

Otóż potrzebuję w jakiś sposób wyłuskać ze skompilowanego pliku "exe" listę funkcji, użytych przez zewnętrzne biblioteki.

Tak mogła by wyglądać przykłądowa lista, po przejrzeniu pliku exe:

------------------
user32.dll:

GetKeyboardType
LoadStringA
MessageBoxA
CharNextA

------------------
advapi32.dll:

RegQueryValueExA
RegOpenKeyExA
RegCloseKey

------------------
oleaut32.dll:

SysFreeString

(...)

Najważniejsze jest to, że nie chodzi mi o wszystkie funkcje, które posiadają zaimportowane biblioteki, a tylko te, które zostały w aplikacji użyte. Wiem, że musis istnieć na to "prosty" sposób, ponieważ wszystkie użyte funkcje owych bibliotek są wypisane bezpośrednio w plikach exe (nazwami).

Tak wygląda powyższy fragment listy, w pliku exe, otwartym WinHexem:
user image

Czy ktoś wie, jak sobie z tym poradzić? :/

0

jeśli nie potrzebujesz zrobić tego samodzielnie, to masz narzędzie Dependency Walker, standardowo dołączane od dobrych kilku(-nastu?) lat do Visual Studio. Znajdziesz tam listę bibliotek i funkcji importowanych z nich, jak również listę wszystkich funkcji z danej biblioteki i listę importów do bibliotek z innych bibliotek.

0

To znaczy, zależało mi na tym, aby to mój program po wskazaniu ścieżki do innej aplikacji, był w starnie wypisać z niej funkcje, które zostały użyte w importowanych przez ten program bibliotekach.

Jesli nie istnieje prosta możliwość, to będę skazany samemu napisać jakąś tandetną funkcję :S

0

weź pod uwagę to, że jeśli program ładuje biblioteki dynamicznie (loadLibrary() bodajże), to nie odczytasz tego z kodu pliku exe.

acha, popraw temat na opisujący Twój problem. bo ten nie mówi prawie nic.

0

Hmm... w sumie "znalazłem" rozwiązanie mojego problemu. Ale po tym kodzie w cpp odechciewa mi się dalszej zabawy :S (oczywiście nie przetłumaczę tego na delphi :/)

W każdym razie dzięki za linki.

int  WINAPI GetImportFunctionNamesByModule (
    LPVOID    lpFile,
    HANDLE    hHeap,
    char      *pszModule,
    char      **pszFunctions)
{
    PIMAGE_IMPORT_MODULE_DIRECTORY  pid;
    IMAGE_SECTION_HEADER     idsh;
    DWORD                    dwBase;
    int                      nCnt = 0, nSize = 0;
    DWORD                    dwFunction;
    char                     *psz;


    /* Locate section header for ".idata" section. */
    if (!GetSectionHdrByName (lpFile, &idsh, ".idata"))
        return 0;

    pid = (PIMAGE_IMPORT_MODULE_DIRECTORY)ImageDirectoryOffset 
             (lpFile, IMAGE_DIRECTORY_ENTRY_IMPORT);

    dwBase = ((DWORD)pid. idsh.VirtualAddress);

    /* Find module's pid. */
    while (pid->dwRVAModuleName &&
           strcmp (pszModule, 
                  (char *)(pid->dwRVAModuleName+dwBase)))
        pid++;

    /* Exit if the module is not found. */
    if (!pid->dwRVAModuleName)
        return 0;

    /* Count number of function names and length of strings. */
    dwFunction = pid->dwRVAFunctionNameList;
    while (dwFunction                      &&
           *(DWORD *)(dwFunction + dwBase) &&
           *(char *)((*(DWORD *)(dwFunction + dwBase)) +
            dwBase+2))
        {
        nSize += strlen ((char *)((*(DWORD *)(dwFunction +
             dwBase)) + dwBase+2)) + 1;
        dwFunction += 4;
        nCnt++;
        }

    /* Allocate memory off heap for function names. */
    *pszFunctions = HeapAlloc (hHeap, HEAP_ZERO_MEMORY, nSize);
    psz = *pszFunctions;

    /* Copy function names to memory pointer. */
    dwFunction = pid->dwRVAFunctionNameList;
    while (dwFunction                      &&
           *(DWORD *)(dwFunction + dwBase) &&
           *((char *)((*(DWORD *)(dwFunction + dwBase)) +
            dwBase+2)))
        {
        strcpy (psz, (char *)((*(DWORD *)(dwFunction + dwBase)) +
                dwBase+2));
        psz += strlen((char *)((*(DWORD *)(dwFunction + dwBase))+
                dwBase+2)) + 1;
        dwFunction += 4;
        }

    return nCnt;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1