Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;_C++_Security - Fatal编程技术网

C++ 如何在C++;

C++ 如何在C++;,c++,security,C++,Security,我知道线程问题等,这可能会导致和它的危险,但我需要知道如何做到这一点,我在学校做的安全项目。我需要知道如何使用参数在给定调用约定的远程地址空间中调用函数——最好是恢复远程函数返回的数据,尽管我确实不需要这样做 如果我能在编译时从远程函数的函数原型中获得细节,我将能够使这个方法工作。我需要知道参数有多大,参数是否显式声明为指针(void*、char*、int*等) 也就是说,如果我定义一个函数原型,比如: typedef void (__cdecl *testFunc_t)(int* pData)

我知道线程问题等,这可能会导致和它的危险,但我需要知道如何做到这一点,我在学校做的安全项目。我需要知道如何使用参数在给定调用约定的远程地址空间中调用函数——最好是恢复远程函数返回的数据,尽管我确实不需要这样做

如果我能在编译时从远程函数的函数原型中获得细节,我将能够使这个方法工作。我需要知道参数有多大,参数是否显式声明为指针(void*、char*、int*等)

也就是说,如果我定义一个函数原型,比如:

typedef void (__cdecl *testFunc_t)(int* pData);
我需要在编译时至少获得参数的大小,如果可以,哪些参数是指针,哪些不是指针。这里我们假设远程功能是一个
stdcall
\u cdecl
调用

我使用的IDE是MicrosoftVisualStudio2007,以防解决方案特定于特定产品

以下是我的计划:

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

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

  • 我还将函数调用的参数从本地堆栈复制到新创建的线程的堆栈中——这是我需要知道函数参数是否为指针以及参数的大小的地方

  • 恢复线程并等待它退出,在这一点上,我将使用线程退出代码返回调用方

  • 我知道这在编译时应该是可行的,但是编译器是否有一些方法我可以使用,我不确定。我还知道,所有这些数据都可以从编译代码后创建的PDB文件中轻松恢复,如果编译器执行优化,参数的大小可能会改变。我不需要别人告诉我这有多危险,因为我完全知道,但这不是一个商业产品,而是我必须为学校做的一个小项目

    问题是: 如果我有一个功能原型,比如 typedef void(uu cdecl testFunc_ut)(内部数据)

    我是否可以在编译时得到这个原型参数的大小(即在上面的示例中,如果我有一个函数,例如:

    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()
    
    这似乎是一个相当不错的学校项目

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

  • 你是否考虑过使用COM来完成整个事情?如果你使用一个专门为它设计的机制,你可能会更容易完成任务。


    好的,我发现我可以使用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)>();