我正在尝试使功能位于dll中的特定地址。
我尝试查看dll的反汇编,但是没有调试符号。
auto lib = LoadLibrary("lib.dll");
auto proc = GetProcAddress(lib, "proc1"); // Getting the address of the function.
如何在不为dll中的每个函数调用GetProcAddress的情况下从proc(地址)获取“ proc1”(函数名称)?似乎没有用于此目的的功能。还有其他方法可以获取函数名称吗?
答案 0 :(得分:1)
如果要查看DLL中的功能列表,可以使用工具。 Connection refused: localhost:4200 favicon.ico 502 in angular 7
但是我不确定为什么要在运行时执行此操作。在大多数情况下,您需要从DLL使用的功能已经知道名称和参数,并且已经准备好与之交互的标头。
但是,如果您确实需要对开源项目进行反向过程检查,则可能会在源代码中找到所需的内容。它在C#中,但可能会给您一些提示。 http://www.dependencywalker.com/
答案 1 :(得分:1)
首先,我们需要找到包含指定内存地址的图像的基地址。这可以通过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);
}
}