我想问一下,如何在 DLL 中找到特定(导出的)函数。例如,我想在 Kernel32 中找到 ReadProcessMemory。我不想依赖 Import 表,我想根据我使用自定义函数获得的地址来定位不同的 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;
}
你能帮我如何完成这个简单的任务吗?
谢谢你。
Ps:我不坚持上面的功能,如果您能指出问题所在,或者提供更好的来源,那就太棒了。