2009-08-20 4 views
1

Я пытаюсь прочитать память процесса, используя следующий код:ReadProcessMemory возвращает буфер большего размера (C, окна)

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. Когда я печатаю buff, я получаю свою строку + некоторый мусор.

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

код оценивается.

Спасибо!

ответ

2

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

+0

ОК, как бы я это исправить (если это так)? Я сам пишу там строку. строка (для тестирования): «<1234567890><1234567890> \ 0" – wonderer

+0

Вы пишете strlen (string) байты? Если это так, strlen() не включает '\ 0', поэтому вам нужно добавить его в счет. – Jonathan

+0

получил. благодаря! – wonderer

1

Знаете ли вы, что данные, которые вы читаете, являются строкой? То есть. что он недействителен? Если нет, то использование strlen() гарантируется ненадежностью.

+0

Да, это строка. Я положил его туда (включая символ NULL в конце) – wonderer

+0

вы положили ** strlen() + 1 ** байты? Тогда, извините, guv, не знаю. – djna

Смежные вопросы