C++ 是否可以在传入函数的输入缓冲区中写入超出预期的内容?(无堆栈溢出)

C++ 是否可以在传入函数的输入缓冲区中写入超出预期的内容?(无堆栈溢出),c++,c,buffer,recv,C++,C,Buffer,Recv,我正在做一些包翻译补丁。 我的dll注入到中文游戏中,钩住recv,监听数据包并翻译接收到的中文字符串。 我在编码,编码,编码。。。直到我发现我应该如何用buf写超过数据包长度 int __stdcall Hooked_recv(SOCKET s, char *buf, int len, int flags) { h_recv.PreHook(); int ret_val = recv(s, buf, len, flags); //ret_val is the number o

我正在做一些包翻译补丁。 我的dll注入到中文游戏中,钩住recv,监听数据包并翻译接收到的中文字符串。 我在编码,编码,编码。。。直到我发现我应该如何用buf写超过数据包长度

int __stdcall Hooked_recv(SOCKET s, char *buf, int len, int flags)
{
    h_recv.PreHook();

    int ret_val = recv(s, buf, len, flags);
//ret_val is the number of bytes received. Ok, I can increase it, but...
//what to do with buf? Sure I can write there as much as no access violation appears.
//but I need a safe way.
//I guess if I do buf = new char[NEW_SIZE] then caller will fail to read buf because of pointer changed?
//what could I do to make received packet longer?
//I no want to reverse exe and increase buffer in hex editor. at least for now.

    h_recv.PostHook();

    return ret_val;
}

尽可能多地填满缓冲区。如果您有任何剩余,请将其保存,以便下次调用钩住的接收函数时使用(将其放在第一位,如果已填满,请重复保存新的剩余)。您将需要使用缓冲区,这是不可避免的。

我不知道buf大小。我所能做的就是把它填满,直到违反访问权限为止。也许有什么方法可以扫描整个进程内存中指向buf的指针并对其进行修改?len的目的是告诉您可以在缓冲区中放入多少字节。但是buf具有预定义的大小。ppls声明一些char*buf[1024]并将其传递给recv函数。只有在recv调用后,他们才知道实际接收的字节数。buf大小永远不会改变。我的坏:(你是对的。没有注意到lenCorrect解决方案的含义,但可能需要指出的是,如果你有足够的缓冲数据来满足调用,你应该避免转发到底层的
recv
。风险是,如果翻译添加了额外的数据,缓冲区可能会变得无限。例如,假设钩子添加了每1KB接收一个字节。这将缓慢增加缓冲区,但在读取1GB后,缓冲区将包含1MB。正确的解决方案是在第1025次调用时仅返回缓冲区。