-1

在下面的截获函数中,我有buff一个指向缓冲区的指针,如何在不创建自己的新缓冲区的情况下更改数据?

int WINAPI OwnRecv(SOCKET s, char FAR *buff, int len, int flags)
{
    if(s == ServerSocket)
    {
        int received = pTrampolineRecv(s, buff, len, flags);

        if(received <= 0)
        {
            return received;
        }

            unsigned char ReceiveBuffer[1024]; // how can i avoid creatin this by changing buff directly?
        do_decrypt((const unsigned char *) buff, ReceiveBuffer, received, KeyTest, NULL);
        buff = (char *) ReceiveBuffer;

        return received;
    }
    return pTrampolineRecv(s, buff, len, flags);
}

更新

我添加了我的do_decrypt功能

bool do_decrypt(const unsigned char *in, unsigned char *out, int inlen)
{
  int buflen, tmplen;

  if(!EVP_DecryptUpdate(&Decrypt_ctx, out, &buflen, in, inlen))
  {
        return false;
  }

  if(!EVP_DecryptFinal_ex(&Decrypt_ctx, out + buflen, &tmplen))
    {
        return false;
  }

  return true;
}
4

3 回答 3

1

如果do_decrypt不排除它,只需buff作为调用的第二个参数传入,并进行适当的转换以使此“工作”(编译)。

do_decrypt((const unsigned char *) buff, buff, received, KeyTest, NULL);

这意味着您的输入和输出缓冲区是相同的,这可能在被调用函数中存在问题。

在这种情况下(以及在任何情况下),您还需要确保输出缓冲区中有足够的空间来保存解密的数据,否则会发生缓冲区溢出,您将遇到大麻烦。例如 - 在您的代码中,假设有 2048 个字节而不是 1024 个字节。似乎您应该(假设解密不会改变数据长度)允许received在 `ReceiveBuffer.

您对ReceiveBufferto的分配buff仅具有本地范围:调用者将看不到此更改。在任何情况下,这样做都会使函数的使用变得非常混乱,因为它可能会也可能不会更改输入值。

于 2012-05-19T15:15:52.107 回答
0

在直接跳到 WinAPI 代码之前,你绝对应该看一下关于指针的 C++ 教程。

此外,不推荐使用 FAR 关键字。

最简单的想法是

do_decrypt ((const unsigned char*) buff, (unsigned char *) buff, received, KeyTest, NULL);

所以基本上 -buff作为输入和输出变量。

但我不推荐使用它,因为我不知道do_decrypt函数是如何工作的——解密时你可能会弄乱自己的数据。仅在 do_decrypt 使用某种(可能更小的)内部缓冲区时才使用上述内容。

也许尝试进一步澄清这个问题,因为现在我无法就这个问题给你更多建议。

编辑:因此,由于其他答案,您可以在以下情况下使用上述解决方案:

  1. 结果数据将适合输入缓冲区(输出大小 <= 输入大小)
  2. do_decrypt功能允许就地操作 - 因此,修改正在读取的数据。
于 2012-05-19T15:13:43.990 回答
0

如果 Bartek 的答案不起作用——即,如果do_decrypt不支持对输入和输出使用相同的缓冲区——那么你需要将数据从ReceiveBufferinto复制buff,可能使用strcpy(如果它是空终止的)或memcpy(如果不)。

于 2012-05-19T15:15:51.860 回答