ReadProcessMemory возвращает буфер большего размера (C, windows)

Я пытаюсь прочитать память процесса, используя следующий код:

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

Итак, phandle и paddress известны, потому что я использовал WriteProcessMemory. У меня есть ценности оттуда. размер данных также известен.

Функция работает нормально, за исключением следующего. ReadProcessMemory () возвращает dataread = 41 (что верно, я передал 41 в datasize), но фактическая длина баффа составляет 49. Когда я печатаю бафф, я получаю свою строку + немного мусора.

Что я делаю неправильно?

код приветствуется.

Спасибо!


person wonderer    schedule 20.08.2009    source источник


Ответы (2)


'\ 0' в конце строки, скорее всего, не копируется ни из буфера при записи, ни в буфер при чтении. В результате printf () просто будет печатать с начала вашей строки до тех пор, пока не увидит '\ 0', который может быть после нескольких символов мусора.

person Jonathan    schedule 20.08.2009
comment
Хорошо, как бы это исправить (если это так)? Я сам пишу туда строку. строка (для тестирования): ‹1234567890› ‹hello› ‹world› ‹1234567890› \ 0 - person wonderer; 20.08.2009
comment
Вы пишете байты strlen (string)? Если это так, strlen () не включает '\ 0', поэтому вам нужно добавить его к счетчику. - person Jonathan; 20.08.2009

Вы знаете, что данные, которые вы читаете, представляют собой строку? Т.е. что это завершено null? В противном случае использование strlen () гарантированно ненадежно.

person djna    schedule 20.08.2009
comment
да, это строка. Я положил его туда (включая символ NULL в конце) - person wonderer; 20.08.2009
comment
вы положили strlen () + 1 байт? Тогда, извините, чувак, не знаю. - person djna; 20.08.2009