1

次のコードを使用してプロセス メモリを読み取ろうとしています。

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 を使用したため、phandle と paddress がわかりました。そこからの価値観を持っています。データサイズも知られています。

以下を除いて、機能は正常に動作します。ReadProcessMemory() は dataread = 41 を返します (これは正しいです。datasize に 41 を渡しました) が、実際のバフの長さは 49 です。バフを出力すると、文字列とガベージが得られます。

私は何を間違っていますか?

コードは大歓迎です。

ありがとう!

4

2 に答える 2

2

文字列の末尾にある '\0' は、書き込み時にバッファーから、または読み取り時にバッファーにコピーされていない可能性があります。その結果、printf() は、文字列の先頭から '\0' が表示されるまで印刷を続けます。これは、いくつかの不要な文字の後にある可能性があります。

于 2009-08-20T14:05:17.490 に答える
1

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

于 2009-08-20T14:04:52.733 に答える