C++ 如何在C++;
我知道线程问题等,这可能会导致和它的危险,但我需要知道如何做到这一点,我在学校做的安全项目。我需要知道如何使用参数在给定调用约定的远程地址空间中调用函数——最好是恢复远程函数返回的数据,尽管我确实不需要这样做 如果我能在编译时从远程函数的函数原型中获得细节,我将能够使这个方法工作。我需要知道参数有多大,参数是否显式声明为指针(void*、char*、int*等) 也就是说,如果我定义一个函数原型,比如:C++ 如何在C++;,c++,security,C++,Security,我知道线程问题等,这可能会导致和它的危险,但我需要知道如何做到这一点,我在学校做的安全项目。我需要知道如何使用参数在给定调用约定的远程地址空间中调用函数——最好是恢复远程函数返回的数据,尽管我确实不需要这样做 如果我能在编译时从远程函数的函数原型中获得细节,我将能够使这个方法工作。我需要知道参数有多大,参数是否显式声明为指针(void*、char*、int*等) 也就是说,如果我定义一个函数原型,比如: typedef void (__cdecl *testFunc_t)(int* pData)
typedef void (__cdecl *testFunc_t)(int* pData);
我需要在编译时至少获得参数的大小,如果可以,哪些参数是指针,哪些不是指针。这里我们假设远程功能是一个stdcall
或\u cdecl
调用
我使用的IDE是MicrosoftVisualStudio2007,以防解决方案特定于特定产品
以下是我的计划:
CreateRemoteThread
在远程进程中创建线程,尽管我会在挂起状态下这样做ExitThread(eax)
的进程内部分配的代码存根的地址-因为这将使用函数的返回值退出线程-然后我将使用GetExitCodeThread
template<typename T> unsigned long getPrototypeArgLength<T>()
{
//would return size of arguments described in the prototype T
}
//when called as
getPrototypeArgLength<testFunc>()
模板无符号长getPrototypeArgLength()
{
//将返回原型T中描述的参数大小
}
//当被称为
getPrototypeArgLength()
这似乎是一个相当不错的学校项目
好的,我发现我可以使用BOOST库在编译时获取大量类型信息。具体来说,我使用的是BOOST::function_traits。但是,如果您查看BOOST库,您会发现您可以恢复相当多的信息。下面是我编写的一些代码,演示如何获取功能原型 (实际上,我还没有测试下面的代码,这只是我从另一个我已经制作和测试过的函数中拼凑出来的东西。)
模板
无符号长getArgCount()
{
返回boost::function_traits::arity;
}
无效(*pFunc)(整数,整数);
2=getArgCount();
我不太确定你的问题是什么。你已经描述了你想要做什么……那么它对你有用吗?对不起,格雷格,我应该更清楚。如果我有一个函数原型,比如typedef void(u cdecl testFunc_t)(int pData);我是否可以在编译时得到这个原型参数的大小(例如,在上面的示例中,如果我有一个类似于:template unsigned long getPrototypeArgLength()的函数,{//将返回原型T}中描述的参数大小,那么参数的总和将为sizeof(int*)的总大小。如果我在这里使用了错误的术语,请原谅。谢谢:)具体地说,我需要帮助w\step 3我认为您只需要查找函数调用约定的详细信息(幸运的是,在32位代码中,它们非常简单)没有可移植的方法来获取此信息,因为它不可移植。您可以始终使用正确的签名编写一个伪函数,在关闭优化的情况下编译对它的调用,并查看生成的汇编代码的确切功能。感谢Alan-我已经知道stdcall和cdecl调用在32位系统上是如何工作的(谢天谢地,它们并不太难理解。)问题是试图在编译时计算给定函数原型的参数大小。请查看我的编辑,在那里我澄清了我需要的帮助,它显示了我想要对模板函数执行的操作。感谢您的帮助。谢谢:)嗯,远程进程的设计不是为了调用它的函数,但是通过研究发现它们可以在不中断进程的情况下被调用。我想你是在谈论我提出的2ns点。我的意思是,你要创建一个线程来启动COM并公开函数的包装器。这将允许你轻松地进行ext将其发送到您可能需要的其他函数
template<typename T>
unsigned long getArgCount()
{
return boost::function_traits<boost::remove_pointer<T>::type>::arity;
}
void (*pFunc)(int, int);
2 = getArgCount<BOOST_TYPEOF(pFunc)>();