我知道这可能会引起线程问题等安全问题,但我需要知道如何调用给定调用约定的远程地址空间中的函数,并传递参数——最好能恢复远程函数返回的数据,但实际上并不一定需要。
如果我可以在编译时从远程函数的函数原型中获取具体信息,我将能够使此方法工作。我需要知道参数的大小以及参数是否被明确声明为指针,例如(void*、char*、int*等)。
换句话说,如果我定义一个函数原型,类似于:
我需要在编译时获取参数的大小,并确定哪些是指针。这里我们假设远程函数是一个stdcall或_cdecl调用。
我使用的IDE是Microsoft Visual Studio 2007,如果解决方案针对特定产品,请告知。
我的计划如下:
1.创建一个线程,在要调用的函数的源头使用CreateRemoteThread,但我会将其置于挂起状态。 2.设置堆栈,使返回地址为进程内分配的代码存根,该代码将调用ExitThread(eax),这将以函数的返回值退出线程。然后我将通过使用GetExitCodeThread来恢复此值。 3.我还将把函数调用的参数从我的本地堆栈复制到新创建的线程的堆栈中 - 这就是我需要了解函数参数是否为指针以及参数的大小的原因。 4.恢复线程并等待它退出,然后我将返回带有线程退出代码的调用者。
我知道这应该可以在编译时完成,但编译器是否有我可以使用的方法我不确定。我也知道,所有这些数据都可以很容易地从编译代码后创建的PDB文件中恢复,如果编译器执行优化,则参数的大小可能会发生变化。我无需被告知这有多危险,因为我完全意识到这一点,但这不是商业产品,而是我必须为学校完成的一个小项目。
问题是:如果我有这样的函数原型 typedef void (__cdecl testFunc_t)(int pData);
是否有办法在编译时获取此原型参数的大小(例如,在上面的示例中,参数总大小为sizeof(int*))?如果我有以下函数:
如果我可以在编译时从远程函数的函数原型中获取具体信息,我将能够使此方法工作。我需要知道参数的大小以及参数是否被明确声明为指针,例如(void*、char*、int*等)。
换句话说,如果我定义一个函数原型,类似于:
typedef void (__cdecl *testFunc_t)(int* pData);
我需要在编译时获取参数的大小,并确定哪些是指针。这里我们假设远程函数是一个stdcall或_cdecl调用。
我使用的IDE是Microsoft Visual Studio 2007,如果解决方案针对特定产品,请告知。
我的计划如下:
1.创建一个线程,在要调用的函数的源头使用CreateRemoteThread,但我会将其置于挂起状态。 2.设置堆栈,使返回地址为进程内分配的代码存根,该代码将调用ExitThread(eax),这将以函数的返回值退出线程。然后我将通过使用GetExitCodeThread来恢复此值。 3.我还将把函数调用的参数从我的本地堆栈复制到新创建的线程的堆栈中 - 这就是我需要了解函数参数是否为指针以及参数的大小的原因。 4.恢复线程并等待它退出,然后我将返回带有线程退出代码的调用者。
我知道这应该可以在编译时完成,但编译器是否有我可以使用的方法我不确定。我也知道,所有这些数据都可以很容易地从编译代码后创建的PDB文件中恢复,如果编译器执行优化,则参数的大小可能会发生变化。我无需被告知这有多危险,因为我完全意识到这一点,但这不是商业产品,而是我必须为学校完成的一个小项目。
问题是:如果我有这样的函数原型 typedef void (__cdecl testFunc_t)(int pData);
是否有办法在编译时获取此原型参数的大小(例如,在上面的示例中,参数总大小为sizeof(int*))?如果我有以下函数:
template<typename T> unsigned long getPrototypeArgLength<T>()
{
//would return size of arguments described in the prototype T
}
//when called as
getPrototypeArgLength<testFunc>()