繁体   English   中英

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

[英]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中的 ImageDirectoryEntryToDatantdll.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM