0

アプリにフックし、受信したパケットを INI ファイルに書き込む C++ を使用して、単純な dll パケット スニファーを作成しています。残念ながら、20〜30分後にメインアプリがクラッシュしました.

パケットが受信receivedPacket()されると、 が呼び出されます。20 分以上経過すると、WriteCount の値は約 150,000 ~ 200,000 になり、C++ ランタイム エラー/クラッシュが発生し始めます。取得するGetLastError()コードは 0x8、つまりERROR_NOT_ENOUGH_MEMORYであり、0WritePrivateProfileStringA()が返されます。

void writeToINI(LPCSTR iSec,LPCSTR iKey,int iVal){
    sprintf(inival, _T("%d"), iVal);
    WritePrivateProfileStringA(iSec,iKey,inival,iniloc);

//sprintf(strc, _T("%d \n"), WriteCount);
//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), strc, strlen(strc), 0, 0);

    WriteCount++;

}

void receivedPacket(char *packet,WORD size){
    switch ( packet[2] )
    {
    case 0x30:
        // Size : 0x5F
        ID = *(signed char*)&packet[0x10];
        X = *(signed short*)&packet[0x20];
        Y = *(signed short*)&packet[0x22];
        Z = *(signed short*)&packet[0x24];

        sprintf(inisec, _T("PACKET_%d"), (ID+1));

        writeToINI(inisec,"id",ID);
        writeToINI(inisec,"x",X);
        writeToINI(inisec,"y",Y);
        writeToINI(inisec,"z",Z);
     }

     [.....OTHER CASES.....]

}

ありがとう :)

4

2 に答える 2

2

WritePrivateProfileString()非常にGetPrivateProfileString()低速です(呼び出しごとにINIファイルを解析するため)。代わりに、次のことができます。

  • 既存の解析ライブラリの1つを使用しますが、メモリ効率やシーケンシャル書き込みのサポートについてはよくわかりません。
  • 独自のシーケンシャルINIライターを作成します。
    1. ファイルの読み取り(または、大きすぎる場合は部分的にのみ)
    2. セクションとキーを検索し(見つからない場合はファイルの最後に新しいセクションを作成し、セクションを並べ替える場合は挿入位置を検索します)、キーと次のキーのファイル位置を保存します
    3. 値を変更する
    4. 保存(元のファイルの先頭からキーの位置+実際に変更されたキー+元のファイルの次のキーの位置からファイルの終わりまで)(新しいセクションが最後に作成された場合、元のファイルに新しいセクションを追加するだけです)(パケットが書き換えられた場合多くの場合、同じIDで、各キーの後にパディング空白を追加できます。これは、目的のタイプの値を保持するために大きくなります(例:(空白に変更)に変更X=1---\nすると、キーのサイズが一定になり、ファイルの一部のみを更新できます))X=100-\n-
  • データベース、たとえばMySQL
  • バイナリファイル(最速のソリューション)を作成し、値を読み取る、またはテキストに変換するプログラムを作成します

ちょっとした注意:私はGetPrivateProfileString()数年前に設定ファイル(約1KBのサイズ)を読み取り、HDDから読み取る:50ms、USBフラッシュディスクから読み取る:1000ms!、変更後(1.ファイルをメモリに読み取る2.自分のパーサーを実行する) HDDとUSBの両方で1msで動作します。

于 2012-08-19T08:08:59.730 に答える
0

返信ありがとうございます。問題の原因は ではないようですWritePrivateProfileStringA()

malloc()フックのサイズを追加するだけです。

:)

于 2012-08-19T11:34:22.343 に答える