如何在Windows中找到位于内存地址的功能

时间:2019-04-19 00:14:24

标签: c++ winapi dll

我正在尝试使功能位于dll中的特定地址。

我尝试查看dll的反汇编,但是没有调试符号。

auto lib = LoadLibrary("lib.dll");
auto proc = GetProcAddress(lib, "proc1"); // Getting the address of the function.

如何在不为dll中的每个函数调用GetProcAddress的情况下从proc(地址)获取“ proc1”(函数名称)?似乎没有用于此目的的功能。还有其他方法可以获取函数名称吗?

2 个答案:

答案 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);
    }
}