如何导出干净的“未损坏”功能名称?

时间:2014-10-12 22:27:46

标签: c++ dllexport dumpbin

我试图导出一个完全干净的函数名,这是因为我需要在GetProcAddress(第二个参数)中使用它。我知道这可能就像你对Kernel32测试dumpbin一样,它会显示干净的函数名。

我环顾四周找到了许多"解决方案",我的名字从乱七八糟到:

  

1 0 00001810 SomeFunction = _SomeFunction

但是我需要它看起来像:

  

1 0 00001810 SomeFunction

这将允许我从GetProcAddress函数调用它,因为我无法使用" Mangled"名。

以下是我如何定义它:

extern "C" __declspec(dllexport) void SomeFunction(void * SomeArguments)
{
      //Function Content
}

使用模块定义文件,它没用......我得到一个完全错误的名字。 使用这种方式,我几乎可以在那里得到它然而' _'阻止GetProcAddress将我的函数名称解析为一个地址。

模块定义输出:

  

1 0 00001810 SomeFunction =?SomeFunction @@ YAXPAX @ Z(void __cdecl SomeFunction(void *))

编辑:(如果您的意思是上述内容的功能......它只是一个消息框MessageBoxA()......那里可能出现任何问题。)

GetProcAddressLine:

LPVOID SomeFunctionAddr = (LPVOID)GetProcAddress(GetModuleHandleA("Pies.dll"), "SomeFunction");

完整" GetProcAddress":

LPVOID SomeFunctionAddr = (LPVOID)GetProcAddress(GetModuleHandleA("Pies.dll"), "SomeFunction");
if (!SomeFunctionAddr)
{
    std::cout << "Failed to obtain SomeFunction Address!\n";
    return 0;
}

Allocate = VirtualAllocEx(Handle, NULL, strlen(Path), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
WriteProcessMemory(Handle, Allocate, Path, strlen(Path), NULL);
Thread = CreateRemoteThread(Handle, NULL, NULL, (LPTHREAD_START_ROUTINE)SomeFunctionAddr, Allocate, 0, NULL);
WaitForSingleObject(Thread, INFINITE);
VirtualFreeEx(Handle, Thread, strlen(Path), MEM_RELEASE);

0 个答案:

没有答案