質問

私は、次のコードを使用して、プロセスのメモリを読み取るしようとしています:

void readdata(HANDLE phandle, LPCVOID paddress, SIZE_T datasize)
{
    char *buff;
    SIZE_T dataread;
    BOOL b = FALSE;

    buff = (char *) malloc (datasize);

    b = ReadProcessMemory(phandle, paddress, (LPVOID)buff, datasize, &dataread); 
    if(!b)
    {
        printf("error reading memory, err = %d\n", GetLastError());
        return;
    }

    printf("Data Read             = %d\n", dataread);
    printf("Len of actual buffer  = %d\n", strlen(buff));
    printf("Data = %s\n", buff);

    free(buff);
    return;
}
私はWriteProcessMemoryを使用becuase

さて、phandleとpaddressが知られています。私はそこから値を持っています。データサイズも知られています。

この関数は、以下を除いて、[OK]を動作します。 ReadProcessMemory()は= 41 dataread返します(正確である、私はDATASIZEする41を通過した)が、バフの実際の長さは49、私はバフを印刷するとき、私は私の文字列+いくつかのゴミを取得することです。

私が間違って何をしているのですか?

のコードを理解されたい。

ありがとうございます。

役に立ちましたか?

解決

「\ 0」あなたの文字列の最後には、あなたが読んだときにあなたが書くとき、あなたのバッファのうちのいずれか、コピー、またはあなたのバッファにされていない可能性があります。その結果、printfの()はちょうどそれが文字化けの番号の後かもしれ「\ 0」を、見るまであなたの文字列の先頭から印刷しようとしている。

他のヒント

あなたが読み込まれたデータが文字列であることを知っていますか?すなわち。それがnullで終了だと?その後、()はstrlenを使用していない場合は信頼できないことが保証されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top