使用参数调用远程进程中的函数(注入的 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 架构远程调用 )