gpt4 book ai didi

c++ - 你如何在 C++ 中调用另一个地址空间中的函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:39 24 4
gpt4 key购买 nike

我知道这可能导致的线程问题等及其危险,但我需要知道如何为我在学校进行的安全项目执行此操作。我需要知道如何使用参数调用给定调用约定的远程地址空间中的函数 - 最好是恢复远程函数返回的数据,尽管我确实不需要这样做。

如果我能在编译时从远程函数的函数原型(prototype)中获得细节,我就能使这个方法起作用。我需要知道参数有多大以及参数是否明确声明为指针 (void*, char*, int*, etc...)

也就是说,如果我定义一个函数原型(prototype)如下:

typedef void (__cdecl *testFunc_t)(int* pData);

我需要在编译时至少获取参数的大小,如果可以的话,我需要知道哪些是指针,哪些不是。这里我们假设远程函数是 stdcall_cdecl 调用。

我使用的 IDE 是 Microsoft Visual Studio 2007,以防解决方案特定于特定产品。

这是我的计划:

  1. 在要调用的函数的起点使用 CreateRemoteThread 在远程进程中创建一个线程,尽管我会在挂起状态下这样做。

  2. 我会设置堆栈,使返回地址是在将调用 ExitThread(eax) 的进程内部分配的代码 stub 的地址 - 因为这将退出线程函数的返回值 - 然后我将使用 GetExitCodeThread

  3. 恢复它
  4. 我还会将函数调用的参数从我的本地堆栈复制到新创建线程的堆栈 - 这是我需要知道函数参数是否为指针以及参数大小的地方。

  5. 恢复线程并等待它退出,此时我将返回线程退出代码给调用者。

我知道这在编译时应该是可行的,但我不确定编译器是否有一些方法可以用来完成它,我不确定。我也知道所有这些数据都可以很容易地从编译代码后创建的 PDB 文件中恢复,并且如果编译器执行优化,参数的大小可能会改变。我不需要被告知这有多危险,因为我完全清楚这一点,但这不是商业产品,而是我必须为学校做的一个小项目。

问题:如果我有一个函数原型(prototype),例如typedef void (__cdecl testFunc_t)(int pData);

无论如何我可以在编译时得到这个原型(prototype)参数的大小(即在上面的例子中,参数总和为 sizeof(int*) 如果,例如,我有一个函数,如:

template<typename T> unsigned long getPrototypeArgLength<T>()
{
//would return size of arguments described in the prototype T
}

//when called as

getPrototypeArgLength<testFunc>()

最佳答案

这看起来像是一个学校项目......

  1. 对于第 3 步,您可以使用 ReadProcessMemory/WriteProcessMemory(其中之一)。例如,新线程可以在线程创建期间接收开始(开始和结束)参数的地址(在调用进程上)。然后它可以从该区域读取调用者进程内存并将其复制到自己的堆栈。

  2. 您是否考虑过使用 COM 来完成这一切?如果您使用专门为此设计的机制,您可能会更轻松地完成工作。

关于c++ - 你如何在 C++ 中调用另一个地址空间中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8307968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com