使用 CreateRemoteThread 使用参数调用另一个进程中的函数

Calling a function in another process with parameters using CreateRemoteThread

我想在同一进程的上下文中使用参数调用另一个进程中的函数。为此,CreateRemoteThread() function seems to do the job. A code example can be found e.g. here.

注意:我不想实施其他提供的解决方案,因为这个解决方案看起来不错而且切题。

在将参数传递给函数时,参数仅作为垃圾接收。

我的函数接受一个 int 和一个 double 作为参数:

DLL_EXPORT void show_message_dialog(const int first_value, const double second_value)
{
    const auto text = std::to_string(first_value);
    const auto caption = std::to_string(second_value);
    MessageBoxA(nullptr, text.c_str(), caption.c_str(), MB_ICONINFORMATION);
}

据我了解,需要定义一个 struct 保存参数,然后像这样传递 struct 的地址:

struct my_parameters
{
    int i;
    double d;
};

auto params = my_parameters{3, 1.1};
const auto process_id = get_process_id_from_process_name("...");
auto * const process_handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process_id);
RemoteLibraryFunction(process_handle, "my_injected_dll.dll", "show_message_dialog", &params, sizeof(my_parameters), nullptr);

消息框非常清楚地显示了 错误的 值,但我导出的 DLL 函数已正确实现:

代码有什么问题吗?或者是否有推荐的方法来在程序集级别调试此问题?寄存器不包含正确的值。

消息框产生了不正确的值。评论中提到,不能修改函数的参数列表,而是使用类似下面的代码:

DLL_EXPORT void show_message_dialog(LPVOID *myparam)
{
    my_parameters *p = (my_parameters *)myparam
    const auto text = std::to_string(p->i);
    const auto caption = std::to_string(p->d);
    MessageBoxA(nullptr, text.c_str(), caption.c_str(), MB_ICONINFORMATION);
}

but I still want to support any type of function with multiple arguments

你没有更好的办法,需要将添加的参数添加到struct,然后通过函数中的结构体获取相应的其他数据

struct my_parameters
{
    int i;
    double d;
    char c;
    std::string s;
    //other data
};

DLL_EXPORT void show_message_dialog(LPVOID *myparam)
{
    my_parameters* p = (my_parameters*)myparam;
    int i = p->i;
    double d = p->d;
    char c = p->c;
    std::string s = p->s;
    ......
}

我发现另一种允许您真正指定任意数量参数的方法是实现 shellcode 以设置参数和调用函数地址,同时当然尊重 calling conventions of the platform and then the shellcode will be the function to be executed by CreateRemoteThread() 而不是实际目标功能。这种方法完全实施起来比较痛苦,但对于某些“边缘情况”可能非常可行,比如只需要 integer arguments.