完全にクリーンな関数名をエクスポートしようとしています。これは、GetProcAddress (2 番目のパラメーター) 内で使用する必要があるためです。Kernel32に対してdumpbinをテストすると、クリーンな関数名が表示されるため、これが可能であることはわかっています。
私は周りを見回して多くの「解決策」を見つけました。
1 0 00001810 SomeFunction = _SomeFunction
ただし、次のようにする必要があります。
1 0 00001810 いくつかの関数
これにより、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);