【发布时间】:2019-08-06 08:06:59
【问题描述】:
我一直在尝试使用DLL injector 进程调用驻留在注入的DLL 中的函数。 this 答案中的代码可以在没有参数的情况下正常工作,但传递参数会导致像 -1733099520 这样的随机(未初始化)乱码被传递给函数,而不是所需的 DWORD:
DWORD speed_up = 1;
RemoteLibraryFunction(hProcess, targetDll, "set_speedup", &speed_up, sizeof speed_up, &lpReturn);
我正在调用的DLL 函数定义为:
#define DLL_EXPORT extern "C" __declspec(dllexport)
DLL_EXPORT void set_speedup(const DWORD new_speed)
{
sprintf_s(debug_message_buffer, "Setting new speed to: %i\n", new_speed);
OutputDebugStringA(debug_message_buffer);
speed = new_speed;
}
请注意,我使用DebugView++ 来观察OutputDebugStringA() 的输出。
我做错了什么?似乎参数设置/传递不正确,但代码似乎正确,没有功能失败。
【问题讨论】:
-
将调试器附加到远程进程。当执行到
set_speedup时,向上一栈帧,看看参数是如何设置的。将其与函数序言进行比较,以了解它如何期望其参数。 -
调用约定是什么?可能使用 __stdcall 强制执行。
-
CreateRemoteThread期望ThreadProc使用 WINAPI __stdcall 调用约定,而默认调用约定是 __cdecl。从我第一条评论中的反汇编中应该可以看出这一点。 -
@Botje:感谢调用约定提示,但强制执行
__stdcall仍然不起作用。它现在产生像528154624:extern "C" __declspec(dllexport) void __stdcall set_speedup(const DWORD new_speed)这样的值 -
然后回到调试器。这将告诉您如何传递参数以及函数如何期望它们。
标签: c++ windows dll rpc dll-injection