Pergunta

Eu estou tentando ler uma memória do processo usando o seguinte código:

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

Agora, phandle e PADDRESS são conhecidos becuase I utilizado WriteProcessMemory. Eu tenho os valores de lá. datasize também é conhecido.

A função funciona ok, exceto para o seguinte. ReadProcessMemory () retorna dataread = 41 (o que é correto, eu passei 41 a datasize), mas o comprimento real do lustre é 49. quando eu imprimir lustre eu recebo minha corda + algum lixo.

O que estou fazendo de errado?

código é apreciado.

Obrigado!

Foi útil?

Solução

O '\ 0' no final de sua seqüência não é susceptível de ser copiado, seja por seu buffer quando você escreve, ou em seu buffer quando você lê. Como resultado, printf () é apenas vai imprimir a partir do início de sua seqüência até que vê um '\ 0', que pode ser após um número de caracteres de lixo.

Outras dicas

Você sabe que os dados que você lê é uma string? Ie. que é um terminador nulo? Se não, então usando strlen () é garantido para não ser confiáveis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top