Я хотел бы спросить, как я могу найти конкретный (Экспортируются) функция внутри DLL. Например, я хотел бы найти ReadProcessMemory внутри Kernel32. Я не хотел бы полагаться на таблицу импорта, я хотел бы найти различные API на основе их адресов, которые я получаю с помощью пользовательской функции.
Я попытался сделать небольшое исследование на VA, RVA & Смещение файла, но мне не удалось. Вот пример, который я пробовал, но он не работает (возвращает 0 во всех случаях):
DWORD Rva2Offset(DWORD dwRva, UINT_PTR uiBaseAddress)
{
WORD wIndex = 0;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
PIMAGE_NT_HEADERS pNtHeaders = NULL;
pNtHeaders = (PIMAGE_NT_HEADERS) (uiBaseAddress + ((PIMAGE_DOS_HEADER) uiBaseAddress)->e_lfanew);
pSectionHeader = (PIMAGE_SECTION_HEADER) ((UINT_PTR) (&pNtHeaders->OptionalHeader) + pNtHeaders->FileHeader.SizeOfOptionalHeader);
if (dwRva < pSectionHeader[0].PointerToRawData)
return dwRva;
for (wIndex = 0; wIndex < pNtHeaders->FileHeader.NumberOfSections; wIndex++)
{
if (dwRva >= pSectionHeader[wIndex].VirtualAddress && dwRva < (pSectionHeader[wIndex].VirtualAddress + pSectionHeader[wIndex].SizeOfRawData))
return (dwRva - pSectionHeader[wIndex].VirtualAddress + pSectionHeader[wIndex].PointerToRawData);
}
return 0;
}
Не могли бы вы помочь мне, как я мог выполнить эту простую задачу?
Спасибо.
P .: Я не придерживаюсь функции, описанной выше, и то, и другое, если вы можете указать, в чем проблема, или дать лучший источник, было бы здорово.
Задача ещё не решена.