Прежде всего нам нужно найти базовый адрес изображения, который содержит указанный адрес памяти.это можно сделать с помощью функции RtlPcToFileHeader
.
, тогда нам нужно получить каталог экспорта через, скажем, ImageDirectoryEntryToData
из Dbghelp.dll или через RtlImageDirectoryEntryToData
из ntdll.dll и перечислите все функции экспорта.Первый взгляд по имени.если нет имени для такого адреса - смотрите порядковый номер.
void FromAddress(LPCVOID Address)
{
PVOID BaseOfImage = RtlPcToFileHeader(Address, &BaseOfImage);
if (!BaseOfImage)
{
return;
}
ULONG Size;
PIMAGE_EXPORT_DIRECTORY pied = (PIMAGE_EXPORT_DIRECTORY)
RtlImageDirectoryEntryToData(BaseOfImage, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT, &Size);
ULONG NumberOfFunctions, NumberOfNames;
if (!pied || !(NumberOfFunctions = pied->NumberOfFunctions))
{
return;
}
NumberOfNames = pied->NumberOfNames;
PULONG AddressOfFunctions = (PULONG)RtlOffsetToPointer(BaseOfImage, pied->AddressOfFunctions);
PULONG AddressOfNames = (PULONG)RtlOffsetToPointer(BaseOfImage, pied->AddressOfNames);
PUSHORT AddressOfNameOrdinals = (PUSHORT)RtlOffsetToPointer(BaseOfImage, pied->AddressOfNameOrdinals);
bool bFound = false;
if (NumberOfNames)
{
do
{
ULONG rva = *AddressOfNames++;
if (RtlOffsetToPointer(BaseOfImage, AddressOfFunctions[*AddressOfNameOrdinals++]) == Address)
{
DbgPrint("%s\n", RtlOffsetToPointer(BaseOfImage, rva));
bFound = true;
}
} while (--NumberOfNames);
}
if (!bFound)
{
DWORD Base = pied->Base;
do
{
if (Address == RtlOffsetToPointer(BaseOfImage, *AddressOfFunctions++))
{
DbgPrint("#%u\n", Base);
}
} while (Base++, --NumberOfFunctions);
}
}