-3

我想在带有参数的同一进程的上下文中调用另一个进程中的函数。为此,该CreateRemoteThread()功能似乎可以完成这项工作。可以在此处找到代码示例,例如。

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

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

我的函数将 aint和 adouble作为参数:

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函数已正确实现:

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

4

2 回答 2

1

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

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);
}

但我仍然想支持具有多个参数的任何类型的函数

你没有更好的办法,你需要将添加的参数添加到 中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;
    ......
}
于 2021-04-12T02:10:24.827 回答
0

我发现的另一种允许您真正指定任意数量的参数的方法是实现 shellcode 以设置参数和调用函数地址,同时当然尊重平台的调用约定,然后 shellcode 将成为函数由CreateRemoteThread()而不是实际的目标函数执行。这种方法完全实现起来更痛苦,但对于一些“边缘情况”来说可能是非常可行的,比如只需要integer arguments.

于 2021-04-13T15:52:00.073 回答