#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);
}
Вычислить иерархию dll
Буду благодарен за помощь.
Подробное описание, как это делается, (и вообще хорошее описание заголовка PE-файлов) можете найти в книге "Работа с файлами в Win32" (П.В. Румянцев).
Естественно, вы получите только дерево статически линкумых dll.
Набросок кода для получения имён импортируемых библиотек (компилятор Microsoft):
Код:
#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));
}
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));
}