Como alguém leria a memória de um processo? O sistema operacional é diferente?


11

Como um desenvolvedor web experiente, mas um programador iniciante de "baixo nível", esse tipo de coisa ainda é um vodu para mim.

Estou curioso para saber como começar a encontrar um bloco de memória e depois lê-lo (por exemplo, ler o cronômetro em um jogo de minas)? Isso é diferente na versão do OS / OS?

Respostas:


14

Essa é uma pergunta um tanto complicada e até complexa, no sentido de que você pode se aprofundar nisso. Mas para simplificar um pouco as coisas:

Considerando o seu exemplo de " leitura do cronômetro em um jogo de minas ":

O primeiro passo é encontrar o endereço da memória . Isso geralmente é feito com uma ferramenta chamada editor de memória (o depurador também usaria, em alguns casos), que pode usar vários métodos para encontrar a localização de uma variável na memória do processo . A maneira comum é procurar um determinado valor (por exemplo, o valor do timer) no espaço de memória do processo de destino, depois alterar o valor desejado (por exemplo, avançar o timer) e procurar correspondências novamente. Esse processo define os candidatos a cada iteração até restar apenas a variável exata. Tomar o endereço dessa variável no espaço de memória do processo é apenas uma questão de clicar com o mouse com um editor de memória.

O segundo passo é modificar os dados nesse endereço específico . Como isso é feito depende do sistema operacional. No Windows , há uma chamada WinAPI denominada WriteProcessMemoryque pode ser usada para gravar dados predefinidos em um determinado endereço no espaço de memória do processo de destino. No nosso exemplo, você usaria essa função para substituir a variável do cronômetro no processo de destino com o seu próprio valor desejado, alterando efetivamente o cronômetro no jogo.

Na prática, você teria que encontrar o ID do processo do processo de destino e, em seguida, anexar seu processo não autorizado ao processo de destino para obter a capacidade de modificar seu espaço de memória. Essa é uma tarefa bastante trivial, mas não contribui para responder à pergunta, por isso deixei de fora como um exercício para o leitor. ;)


A localização da variável será a mesma sempre que o processo for executado?
Brunoqc

1
@brunoqc Não, quase certamente não.
Dan

2

É totalmente diferente no sistema operacional. Alguns não permitem que você faça isso, e você precisa ter alguns meios de saber onde os dados que você deseja estão no espaço de memória do alvo.

Aqui está como fazer isso no Linux: /unix/6301/how-do-i-read-from-proc-pid-mem-under-linux


qual sistema operacional não permitiria isso? Parece que você pode fazê-lo no Linux e Windows, pelo menos
Eva

@Evan Todo sistema operacional deve permitir (restrito, por razões de segurança) meios para modificação remota da memória do processo para fins de depuração. No entanto, observe que, por exemplo, incompatibilidades de privilégios por motivos de segurança podem impedir que seja possível ler / gravar a memória do processo de um processo com privilégios mais altos. Um bom exemplo disso é não permitir que um processo com privilégios de usuário convidado leia / grave a memória de um processo com direitos de administrador, pois isso pode comprometer todo o sistema e ser uma maneira direta de um usuário convidado obter privilégios de administrador em o sistema.
Zxcdw 24/10/12

1

Um aplicativo recebe um intervalo de memória pelo sistema operacional. Geralmente, o aplicativo precisa solicitar a memória, mas essa funcionalidade pode ser obscurecida para o programador por causa da linguagem.

Idiomas como C permitem solicitações de bloco para tamanhos específicos, enquanto outros idiomas como C ++, C # e Java permitem solicitações através do uso de palavras-chave como new. Cada idioma possui várias maneiras de alocar memória, portanto, essa é apenas uma breve visão geral. A liberação da memória de volta para o sistema operacional pode ser feita explicitamente ou através de um coletor de lixo.

O acesso à memória no aplicativo depende de como ele foi alocado. C e C ++ são os mais conhecidos por usar o conceito de ponteiros para indicar / rastrear onde a memória está localizada. Caso contrário, o acesso à memória é tratado através da classe ou variável que foi criada.

Na maioria das vezes, você não precisa se preocupar com acesso específico à memória dentro do seu programa. As construções de linguagem e o SO efetivamente ocultam essa preocupação para você.

Seu exemplo de cronômetro em um jogo é um ótimo exemplo de onde você não precisa se preocupar com a alocação de memória subjacente. Você terá uma variável que representa o cronômetro e apenas lerá a partir da variável.

Minha resposta é relevante para quando você está escrevendo o aplicativo, enquanto a resposta do zxcdw é relevante para acessar a memória que pertence a outro aplicativo. Seus termos LMGTFY seriam "depuração" e "engenharia reversa" para aprofundar esse tópico.

Algumas leituras adicionais:

  • O artigo da Wikipedia sobre Memória do computador fornecerá uma visão geral decente das coisas.
  • Em seguida, consulte o artigo da Wikipedia sobre E / S mapeada na memória para obter uma compreensão mais profunda das maquinações que continuam.
  • Por fim, consulte o artigo sobre Memória virtual para obter uma resposta melhor sobre como cada sistema operacional lidará com o mapeamento de memória um pouco diferente dos outros.

resposta excelente, embora sim, neste caso, estou mais preocupado com a leitura de memória de um aplicativo que não escrevi sozinho. Vou upvote, logo que eu tenho 15 rep;)
Eva

@ Evan - definitivamente leia o artigo sobre Memória Virtual então. Isso lhe dará uma melhor compreensão do mapeamento que continua. Você precisa entender o mapeamento para separar um aplicativo. A maioria dos depuradores permitirá que você se conecte a um processo em execução que permitirá ver as instruções e a memória do aplicativo.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.