使用参数调用远程进程中的函数(注入的 DLL)

Posted

技术标签:

【中文标题】使用参数调用远程进程中的函数(注入的 DLL)【英文标题】:Calling a function in a remote process with parameters (injected DLL) 【发布时间】: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) 这样的值 然后回到调试器。这将告诉您如何传递参数以及函数如何期望它们。 【参考方案1】:

原来传递的参数是作为DWORD 的地址而不是DWORD 的地址传入的。这可以通过将被调用函数的签名更改为以下内容来解决:

#define DLL_EXPORT extern "C" __declspec(dllexport)

DLL_EXPORT void set_speedup(const LPVOID acceleration_pointer)

    const auto acceleration = *static_cast<DWORD*>(acceleration_pointer);
    speed = acceleration;

调用约定无关紧要。现在调用按预期工作。

【讨论】:

以上是关于使用参数调用远程进程中的函数(注入的 DLL)的主要内容,如果未能解决你的问题,请参考以下文章

动态库注入--远程线程

Dll注入:X86/X64 远程线程CreateRemoteThread 注入

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )(代

Android 逆向Android 进程注入工具开发 ( 远程调用 | x86 架构的返回值获取 | arm 架构远程调用 )

远程线程DLL注入, 如何释放DLL和结束DLL的线程

32位程序注入64位DLL到64位进程