Pesquisar na Comunidade
Mostrando resultados para as tags ''virtualqueryex''.
Encontrado 1 registro
-
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 [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.
