Introdução a Memória

Tempo de leitura: 7 minutos

Addresses? RVA? VA? Offsets? Muitos iniciantes ao lerem tais termos logo os associam a cheating e ficam com os seguintes questionamentos: “Pra que servem os addresses?” “Qual a diferença da address XXXY pra YXXX?” “Como eu vou usar essa Address?” “O que eu faço com essa address?” as respostas para tais questões estarão ao longo do artigo de uma forma que você possa realmente entender e compreender o que são, de forma resumida, pois por ser um assunto grande precisaria de inúmeras páginas para entender o seu completo funcionamento.

O que é a memória?

Sem entrar na parte do hardware de um computador ou da estrutura PE vamos entender o que seria a memória, alguns podem pensar: “Memória é o que me lembra de usar o sabonete no banho!” ou “Memória é o que eu uso para saber o que fazer e o que não fazer” ou até mesmo “Memória é onde eu guardo as informações de que preciso como: quem são meus amigos, o que eu gosto de comer, o que eu gosto de fazer e etc” em um software é a mesma coisa (embora os “assuntos” sejam diferentes, o propósito é o mesmo, até porque você não vê o seu navegador tomando banho ainda mais com francis, né? rs) você pode se perguntar como assim a mesma coisa? Deixa eu te fazer uma pergunta; Como um programa rodando no seu sistema operacional sabe o que é pra fazer quando você aperta algum botão? A resposta é simples: Memória! Você provavelmente deve saber que são utilizados códigos para criar um programa, certo? Independente da linguagem que se usa, o local onde esses códigos ficam, assim como suas informações de funcionamento, é na memória do computador. Você pode estar se perguntando: Onde seria essa memória? Onde ela fica? Terei de falar sobre dois tipos de memória para que você possa compreender as respostas para tais perguntas.

Memória Física e Memória Virtual:

Sabe aquele arquivo de texto que você abriu, alterou o que tava escrito e salvou? Ao fazer isso você manipulou os dois tipos de memória que falarei nesse artigo, primeiro você leu a memória física daquele arquivo .txt (exemplo) depois você alterou a memória virtual do notepad (Nessa memória virtual foi colocada a memória física do primeiro arquivo, ou seja o texto, o notepad criou uma “cópia” do que estava no .txt, guardou na sua memória virtual e o mostrou para que você o pudesse manipular) e em seguida o notepad alterou a memória física do .txt para que as mudanças ficassem salvas, mesmo após o reinicio do programa.

Capturar

 

Para um melhor compreendimento olhe a imagem, para alterar o arquivo físico (.txt) você precisa alterar sua memória física, para alterar o texto sem que isso modifique o arquivo original você altera a memória virtual do notepad esse é o motivo pelo qual se você finalizar o notepad com o texto alterado o texto não será salvo, porque o texto editado estava na memória virtual e ele não havia passado para a fisíca ainda (Nesse caso ele só passa da virtual para a física quando você aperta para salvar) esse também é o motivo de você ter perdido aquele trabalhinho que estava fazendo no word quando a luz acabou….

Voltando a parte de Software quando você cria um programa todo o código dele fica nesse arquivo físico incluindo informações de onde o código começa e onde termina, quais dlls o seu programa precisará, quais API’s e etc

Ao abrir esse programa o windows irá ler a memória física para ver do que ele precisa e “preparar o terreno” para a execução do mesmo, mas o seu programa ele não será executado diretamente da memória física, o windows prepara um área e cria uma cópia da memória física nesse local, esse local recém criado é chamado de espaço virtual onde se encontra a memória agora chamada de memória virtual.

Alguns dizem: “nossa que burrice fazer uma cópia, só atrasa o processo!” mas graças a existência da memória virtual hoje podemos fazer aplicativos que armazenam informações e que se auto-modificam sem interferir no arquivo físico(há controvérsias embora eu apoie essa cópia da memória física para um espaço virtual).. “Tudo bem, eu sempre soube que os códigos ficavam no arquivo e que depois eles eram copiados para um espaço virtual mas o que isso tem a ver com addresses?”

Addresses: VA, RVA e Offset

Addresses vem do plural de Address que em inglês significa Endereço. “Ah você vai me dizer então que memória agora tem endereço?” sim, ela tem, com o propósito de: reconhecer, separar e definir o começo ou o fim, bem como o tamanho dos códigos, por exemplo suponhamos que nós tenhamos na memória de um arquivo os seguintes caracteres:

EPILIF

Como você faria para trocar a ordem das letras? Como você mandaria uma maquina inverter a ordem das letras? Graças ao endereço nós podemos fazer isso, seria basicamente assim:

  1. E
  2. P
  3. I
  4. L
  5. I
  6. F

E para a máquina nós só precisamos fazê-la trocar com base no endereço, em delphi ficaria assim:

Capturar2

Ou seja, ela vai pegar a letra que está em 6 (7-1 (no primeiro loop)) e passar para 1 e a letra que estava anteriormente em 1 passar para 6(SWAP de memória), de forma que inverterá e a palavra FILIPE ficará na ordem correta…

Mas o que isso (address) tem a ver com o que as pessoas usam para fazer cheat? É simples, o cheat nada mais é do que uma alteração na memória do jogo, se um jogo possui em sua memória um código dizendo que seu personagem tem que ficar com 0 moedas para você alterar isso você precisará encontrar onde está esse 0 primeiro, ou seja você precisará encontrar o endereço dele primeiro, ou seja a Address. 🙂

“Tá, entendi, agora o que é VA, RVA e Offset?”

VA = Virtual Address = Endereço Virtual

O Endereço que você acha procurando as suas moedas no jogo por exemplo é o VA, que é onde está aquela informação na memória virtual. Normalmente o VA é RVA + Image Base, porém pode acontecer de a Image Base que se encontra na estrutura do arquivo não corresponder com a image base do programa em funcionamento.

RVA = Relative Virtual Address = Endereço Virtual Relativo

RVA seria o VA com o Image base subtraído,  Se a image base do meu programa é 0x00400000 e meu VA é 0x00401000 meu RVA será 0x1000

Enquanto Offset seria o endereço físico daquele VA, lembra que o windows cria uma cópia? então, a cópia ela está em um local diferente o que significa que seu endereço também é diferente, e para encontrar a Offset a partir de um VA assim como encontrar um VA a partir de uma Offset é necessário uma análise do PE, para fazer essa conversão você pode utilizar o LordPE -> PE Editor -> FLC que ele fará os cálculos com base na análise do PE para você ^^

Peço desculpas pela falta de clareza ou pela confusão em algumas partes, porém é extremamente difícil falar sobre memória sem antes ter abordado o funcionamento do windows e a estrutura de um Programa.

Caso encontre algum erro por favor avise, ensinar é bom mas aprender é melhor ainda.

Abraços, ÐarkCoder

2 Comentários

  1. Filipe Torres

    Ótimo artigo, Douglas!
    Só duas observações:

    • Você pode reduzir na metade a quantidade de interações com o laço no algoritmo de inverter =]
    • A memória virtual, abordada no artigo, seria a memória Ram e a física seria o disco rígido(HD,SSD,etc). Outro motivo, além do citado no artigo, pelo qual o SO carrega o código da memória física na memória virtual(Ram) é que a memória Ram é uma memória de rápido acesso, então leitura e escrita são bem mais eficientes(em termos de tempo) comparada a memória física.

    Realmente tem muito o que complementar sobre o assunto desse artigo, e para não ficar muito grande, mais artigos seriam necessários ^^

    Abraço,

    Responder

  2. Parabens Dark!
    Gostei de seu post pode entender os conceitos de address melhor!

    Responder

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *