[英]How to get the function located at a memory address in Windows
我正在尝试使函数位于dll中的特定地址。
我曾尝试查看dll的反汇编,但没有调试符号。
auto lib = LoadLibrary("lib.dll");
auto proc = GetProcAddress(lib, "proc1"); // Getting the address of the function.
我如何从proc(地址)取回“ proc1”(函数名称),而不为dll中的每个函数调用GetProcAddress? 似乎没有用于此目的的功能。 还有其他方法可以获取函数名称吗?
如果要查看DLL中的功能列表,可以使用一个工具。 http://www.dependencywalker.com/
但是我不确定要为什么在运行时需要这样做。 大多数时候,您需要从DLL使用的函数已经知道名称和参数,并且已经准备好与之交互的标头。
但是,如果您确实需要对开源项目进行反向过程检查,则可能会在源代码中找到所需的内容。 它在C#中,但可能会给您一些提示。 https://github.com/lucasg/Dependencies
首先我们需要找到包含指定内存地址的映像的基地址。 这可以通过RtlPcToFileHeader
函数来完成。
那么我们需要通过Dbghelp.dll中的 ImageDirectoryEntryToData
或ntdll.dll中的 RtlImageDirectoryEntryToData
获取它的导出目录,并枚举所有exportfuntions。 首先看名字。 如果该地址没有名称-请按序。
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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.