C++ C++;-将函数从内存转储到文件上,然后在另一个进程上运行

C++ C++;-将函数从内存转储到文件上,然后在另一个进程上运行,c++,function,assembly,memory,stack,C++,Function,Assembly,Memory,Stack,我有一段代码: // This is supposed to be used in order to dump "DummyFunc" in a file. Using a simple fwrite() call once we get the data inside the function. int DummyFunc(LPVOID, LPVOID) { return 0; } DWORD GetFuncSize(LPVOID function) { DWORD size

我有一段代码:

// This is supposed to be used in order to dump "DummyFunc" in a file. Using a simple fwrite() call once we get the data inside the function.
int DummyFunc(LPVOID, LPVOID)
{
    return 0;
}

DWORD GetFuncSize(LPVOID function)
{
    DWORD size = 1;
    while (*(DWORD*)(((DWORD)function) + size) != 0xC3)
        size++;
    return size;
}

void DumpFunction(LPVOID dest, DWORD size, LPVOID function)
{
    memcpy(dest, function, size);
}

typedef     int(__cdecl* FUNC_T)(LPVOID, LPVOID);
然后,我做以下工作:

int main()
{
    FILE *file;
    fopen_s(&file, "data.txt", "r");  // Where I actually write the function's dump.
    if (file != NULL)
    {
        LPVOID func = VirtualAlloc(NULL, 5000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
        fread_s(func, 5000, 0, 1, file);

        FUNC_T tt = (FUNC_T)func;  //FUNC_T is declared above.
        int retval = tt(NULL, NULL);

        cout << retval << endl;
    }
    system("pause");
    return 0;
}
^上面的地址是我获取访问冲突的地址。现在我的猜测是,要么我在检索函数数据时出错,要么我在内存中分配转储函数的方式完全错误。也许函数使用了当前进程中未分配的.data部分?或者,用这种方式将一个函数从一个进程转移到另一个进程是不可能的? 基本上,我希望能够通过运行在不同机器上的另一个程序中的套接字传输函数。 我不擅长这些,所以请原谅我的无知=[

基本上,我希望能够通过运行在不同机器上的另一个程序中的套接字传输函数

这是不可能的(想想……等等)

(即使您碰巧做了一些东西,它也会非常脆弱,对微小的更改非常敏感,例如在运行时、所使用的库、编译器或操作系统版本或选项等中;所以不要尝试)

您可以考虑:传递函数的更高级表示。如果您知道,它可以是函数名。函数的代码可能有一些(对于您来说编程语言方便)(并且需要考虑关闭值等;阅读有关)。它甚至可以是C++源代码。

例如,你可以共享一些C++源代码,并传输C++源代码,并将它编译到目标机器上,然后插入到插件中。 或者您可以在应用程序中嵌入一些(例如,…)和/或一些(例如,…),并传输闭包。即使这样也非常困难

您需要重新设计整个程序

(遗憾的是,您需要抛出大量代码)

还可以阅读关于和关于


注:遗憾的是,您没有更多地激发您的问题,没有解释您的实际应用程序和上下文。您的问题看起来像一些。

请注意。您不能以可移植的方式转储函数。您的方法是错误的,您需要激发您的问题(并解释整个程序的目标)BTW,一个C++函数可能不会被编译成一个连续的字节序列。你不能用这种方式把代码注入到另一个进程中。我可以诚实地说,经过25年的C++黑客攻击,我从来没有发现自己处于一个需要“转储”的情况。将函数代码复制到文件中,读回并尝试执行它。无论这是要解决什么问题,它都不会起作用。你真的不想使用文本模式文件来处理二进制数据。@SamVarshavchik:这个回答实际上让我发笑。简言之,我希望能够通过套接字将一段数据发送到另一台机器,并将数据与e关于如何操作它的说明(也称为函数)。然而,我开始认为我所做的是非常愚蠢的。我可以将所有函数存储在一个DLL中,然后简单地将DLL与要处理的数据一起发送。然后使用DLL获取函数吗?即使这样也可能不起作用。DLL是为特定的系统编译的,并不像您希望的那样可移植。@ElioDecolli如果您正在寻找一种脚本语言,它允许您将源代码发送到另一个程序,然后运行它,那么您可以研究类似Lua的东西(google for
c++Lua
),或。@NikosC。这实际上可能是一个更好的方法。Basile感谢你们所做的一切,是的,我想做的是在两台机器之间交换函数。但为什么你们要在两台机器之间交换代码和函数?你们想做什么样的应用程序?你们的软件设计可能是错误的……如果你们告诉我们你们的你可以得到更多有用的提示。
00382000  add         byte ptr [eax],al