Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вычислить иерархию dll

842
29 марта 2009 года
sigmov
301 / / 16.09.2008
Вообщем задача следующая - есть некая dll(native), выяснить, какие dll она использует, и определить их наличие/отсутствие - вообщем что-то типа Depends.Exe.

Буду благодарен за помощь.
3.7K
29 марта 2009 года
0nni
326 / / 24.06.2008
Если просто (рекурсивно) получить получить таблицу импорта каждой dll?
Подробное описание, как это делается, (и вообще хорошее описание заголовка PE-файлов) можете найти в книге "Работа с файлами в Win32" (П.В. Румянцев).
Естественно, вы получите только дерево статически линкумых dll.
341
30 марта 2009 года
Der Meister
874 / / 21.12.2007
Набросок кода для получения имён импортируемых библиотек (компилятор Microsoft):
Код:
#include <windows.h>
#include <imagehlp.h>
#include <vector>
#include <string>

using namespace std;

#pragma comment(lib, "imagehlp.lib")

bool IsNullDescriptor(PIMAGE_IMPORT_DESCRIPTOR descriptor)
{
    static const IMAGE_IMPORT_DESCRIPTOR comparand = {0, 0, 0, 0, 0};
    int result = memcmp(descriptor, &comparand, sizeof(comparand));

    return (result == 0);
}

int _tmain(int argc, _TCHAR* argv[])
{
    PLOADED_IMAGE image = ImageLoad(TEXT("exe.exe"), NULL);
    ULONG dataSize = 0;
    PIMAGE_IMPORT_DESCRIPTOR importDescriptors =
        (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(
            image->MappedAddress,
            FALSE,
            IMAGE_DIRECTORY_ENTRY_IMPORT,
            &dataSize
        );

    ULONG descriptorsCount = dataSize / sizeof(*importDescriptors) - 1;

    vector<string> names;
    names.reserve(descriptorsCount);

    // Вообще, согласно докам, мы не в праве использовать величину descriptorsCount для
    // определения количества дескрипторов. Вместо этого, перечисление
    // должно заканчиваться тогда, когда все поля структуры будут содержать
    // нулевые значения.
    for (ULONG i = 0; ; i++)
    {
        PIMAGE_IMPORT_DESCRIPTOR currentDescriptor = &importDescriptors;

        if (IsNullDescriptor(currentDescriptor))
            break;

        LPCSTR name = (LPCSTR) ImageRvaToVa(
            image->FileHeader,
            image->MappedAddress,
            currentDescriptor->Name,
            NULL
        );

        names.push_back(string(name));
    }
   
    ImageUnload(image);
}
341
30 марта 2009 года
Der Meister
874 / / 21.12.2007
Забыл добавить: имена библиотек отложенного вызова извлекаются отдельно. Код изменится примерно таким образом:
Код:
#include<delayimp.h>

PImgDelayDescr importDescriptors =
    (PImgDelayDescr) ImageDirectoryEntryToData(
        image->MappedAddress,
        FALSE,
        IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT,
        &dataSize
    );

// ...

for (int i = 0; ; i++)
{
    PImgDelayDescr currentDescriptor = &importDescriptors;

    // Условие на завершение перечисления аналогично
    // приведённому в предыдущем примере

    LPCSTR name = (LPCSTR) ImageRvaToVa(
        image->FileHeader,
        image->MappedAddress,
        currentDescriptor->rvaDLLName,
        NULL
    );

    names.push_back(string(name));
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог