Jump to content

Turbine o seu Perfil

Confira a atualização e participe do clube!
Clique e saiba mais

Junte-se ao Clube de Membros VIP

Tenha destaque e diversos benefícios!
Confira Aqui

Acesse nosso Discord

Conheça nossos canais interativos
Confira Aqui
Notícia
  • Adquira já o seu VIP!

Recommended Posts

Recomenda-se a prévia leitura destes tópicos:

- Memória - 1. Introdução

- Sobre ReadProcessMemory

- Sobre Scanners de Memória (Memory Scanner)

 

VirtualQueryEx recupera informação sobre uma séria de páginas dentro do espaço de endereço virtual de um processo.

 

Sintaxe:

SIZE_T WINAPI VirtualQueryEx(
 _In_      HANDLE hProcess,  //Handle do processo
 _In_opt_  LPCVOID lpAddress,  //Ponteiro da página de memória
 _Out_     PMEMORY_BASIC_INFORMATION lpBuffer,  //Ponteiro para um MEMORY_BASIC_INFORMATION que receberá as informações
 _In_      SIZE_T dwLength  //Tamanho da área alocada para lpBuffer
);

 

VirtualQueryEx function (Windows)

 

O mais importante está em lpBuffer, que é do tipo PMEMORY_BASIC_INFORMATION.

O struct MEMORY_BASIC_INFORMATION contém os seguintes dados:

 

typedef struct _MEMORY_BASIC_INFORMATION {
 PVOID  BaseAddress;  //Ponteiro para o endereço base da região de páginas
 PVOID  AllocationBase;  //Ponteiro para uma série de páginas alocadas por VirtualAlloc. A página apontada por BaseAddress está dentro desta série
 DWORD  AllocationProtect; //O estado de proteção da memória quando ela foi alocada
 SIZE_T RegionSize; //Tamanho em bytes da região, começando no endereço base, no qual todas as páginas tem atributos iguais
 DWORD  State;  //Estado das páginas na região de memória
 DWORD  Protect;  //Estado atual da proteção de memória das páginas na região
 DWORD  Type;  //O tipos das páginas na região de memória
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

 

MEMORY_BASIC_INFORMATION structure (Windows)

 

Sobre o tipo de proteção temos diversas constantes, sendo alguns exemplos: PAGE_NOACCESS, PAGE_EXECUTE, PAGE_EXECUTE_READWRITE, PAGE_READONLY.

Memory Protection Constants (Windows)

 

Sobre o State temos as constantes:

 

[table=class: grid, align: left]

[tr]

[td]Estado[/td]

[td]Significado[/td]

[/tr]

[tr]

[td]MEM_COMMIT (0x1000)[/td]

[td]Indica que o estado em que uma área de memória física foi alocada[/td]

[/tr]

[tr]

[td]MEM_FREE (0x10000)[/td]

[td]Indica páginas livres, não acessível por processos. Para páginas livres as informações de AllocationBase, AllocationProtect, Protect, e Type são indefinidas[/td]

[/tr]

[tr]

[td]MEM_RESERVE (0x2000)[/td]

[td]Indica uma série de páginas reservadas no processo que não estão em uso, mas prontas para receber alocação física[/td]

[/tr]

[/table]

 

É importante notar que o State é a primeira coisa a se verificar quando se está construindo um Memory Scanner.

 

O Type não será abordado, vide o disclaimer. Para mais informações, pesquise sobre mapeamento de memória.

 

Para um scanner de memória é importante:

 

- Ler as páginas que estejam alocadas, ou seja, o State deve ser MEM_COMMIT;

- Ter acesso à página de memória, ou seja, o Protect não pode ser PAGE_NOACCESS;

- O tamanho da página lida pode ser alocado e copiado diretamente para o processo do Memory Scanner em um único bloco, pois páginas geralmente possuem um tamanho relativamente pequeno.

 

Com essas informações é possível ter uma imagem da memória de um processo e saber onde se deve ou não ler memória.

Deve-se ter atenção em relação aos parâmetros de escolha da página de memória a ser lida, principalmente sobre páginas protegidas com PAGE_GUARD.

 

Projeto Iustrativo

 

jbkxefFqr9i3UO.png

 

[DOWN]Download[/DOWN]

[sCAN]Scan[/sCAN]

 


Disclaimer

 

Esse tópico foi escrito com objetivo de usar VirtualQueryEx para Memory Scanners. Alguns itens importantes sobre a função e seus membros podem não ter sido abordados, ou foram abordados superficialmente.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...