Как получить имя / индекс экспорта символа по определенному адресу (обратный GetProcAddress) - PullRequest
0 голосов
/ 04 августа 2011

Предположим, у меня есть DLL, которая экспортирует некоторые функции, и я знаю адрес в этой DLL. Если этот адрес ссылается на местоположение в такой функции, , то , при условии, что таблица экспорта отсортирована по записи функции, следующее найдет индекс этой функции в таблице экспорта:

IMAGE_DOS_HEADER* dosHeader;
dosHeader = (IMAGE_DOS_HEADER*)m_handle;
unsigned int count;

if(dosHeader->e_magic != IMAGE_DOS_SIGNATURE)
{return __MODULE_ADDRESS_NOT_FOUND;}

IMAGE_NT_HEADERS* ntHeaders = (IMAGE_NT_HEADERS*)(((BYTE*)dosHeader) + dosHeader->e_lfanew);

if(ntHeaders->Signature != 0x00004550)
    {return __MODULE_ADDRESS_NOT_FOUND;}

IMAGE_OPTIONAL_HEADER* optionalHeader = &ntHeaders->OptionalHeader;
if(optionalHeader->NumberOfRvaAndSizes<IMAGE_DIRECTORY_ENTRY_EXPORT)
    {return __MODULE_ADDRESS_NOT_FOUND;}

if(optionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size==0)
    {return __MODULE_ADDRESS_NOT_FOUND;}

IMAGE_DATA_DIRECTORY* dataDirectory = &optionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
IMAGE_EXPORT_DIRECTORY* Exp;
Exp = (IMAGE_EXPORT_DIRECTORY*)((DWORD)dosHeader + dataDirectory->VirtualAddress);

ULONG* addressoffunctions=(ULONG*)((BYTE*) m_handle + Exp->AddressOfFunctions);

if(Exp->NumberOfNames==1)
{
    if(addressoffunctions[0] + (BYTE*)m_handle < address)
        {return 0;}
    return __MODULE_ADDRESS_NOT_FOUND;
    }

for(count = 1; count < Exp->NumberOfNames; count++)
    {
    if(addressoffunctions[count-1] + (BYTE*)m_handle >= address
    && addressoffunctions[count] + (BYTE*)m_handle < address)
        {return count-1;}
    }

, но как мне утверждать, что адрес действительно ссылается на местоположение в экспортируемой функции.

1 Ответ

0 голосов
/ 08 декабря 2011

В общем случае вы не можете. Вы должны разобрать весь график инструкций функции, чтобы получить адреса всех инструкций.

В некоторых тривиальных случаях вы можете искать ret инструкцию, но она ненадежна.

Если вы можете выполнять статический анализ, вы можете использовать IDA для получения границ функций.

...