-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);
}

upd

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、適切なキャストを使用して呼び出しの 2 番目のパラメーターとして渡すだけで、これを「機能」(コンパイル) させることができます。

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

これは、入力バッファーと出力バッファーが同じであることを意味し、呼び出された関数で問題になる可能性があります。

また、この場合 (そしていずれの場合も)、復号化されたデータを保持するのに十分なスペースが出力バッファーにあることを確認する必要があります。そうしないと、バッファー オーバーランが発生し、大きな問題が発生します。たとえば、コードで、1024 バイトではなく 2048 バイトであると想像してください。(復号化によってデータ長が変わらないと仮定して) received`ReceiveBuffer.

to の割り当てにReceiveBufferbuffローカル スコープしかありません。呼び出し元にはこの変更は表示されません。これを行うと、入力値が変更される場合と変更されない場合があるため、いずれにしても関数の使用が非常に混乱します。

于 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入力と出力の両方に同じバッファーを使用することをサポートしていないReceiveBuffer場合) はbuff、おそらくstrcpy(null で終了している場合) またはmemcpy(そうでない場合)。

于 2012-05-19T15:15:51.860 に答える