
Driver de kernel Linux para aquisição de memória física, permitindo acesso de leitura a qualquer endereço físico, incluindo memória reservada e buracos de memória, com informações de CR3 e serviços de tradução de virtual para físico.

Assim como sua contraparte Windows, Winpmem, este não é um despejador de memória tradicional. O Linpmem oferece uma API para leitura de qualquer endereço físico, incluindo memória reservada e buracos de memória, mas também pode ser usado para despejo de memória normal. Além disso, o driver oferece uma variedade de modos de acesso para ler memória física, como byte, word, dword, qword e modo de acesso buffer, onde o modo de acesso buffer é apropriado na maioria dos casos padrão. Se a leitura exigir uma leitura alinhada de byte/word/dword/qword, o Linpmem fará exatamente isso.
Atualmente, os recursos do Linpmem incluem:
O Controle de Cache será adicionado no futuro para suporte aos modos de acesso de leitura especializados.
Pelo menos por agora, você deve compilar o driver Linpmem você mesmo. Um método para carregar um driver Linpmem pré-compilado em outros sistemas Linux está atualmente em andamento, mas ainda não está finalizado. Dito isso, compilar o driver Linpmem não é difícil, basicamente é executar 'make'.
Você precisa do make e de um compilador C. (Recomendamos gcc, mas clang também deve funcionar).
Certifique-se de ter os linux-headers instalados (usando qualquer gerenciador de pacotes que sua distribuição Linux alvo tenha). O nome exato do pacote pode variar conforme sua distribuição.
Uma maneira rápida (independente de distribuição) de verificar se você tem o pacote instalado:
ls -l /usr/lib/modules/`uname -r`/
É isso, você pode prosseguir para o passo 2.
Sistema estrangeiro: Atualmente, se você quiser compilar o driver para outro sistema, por exemplo, porque você quer criar um despejo de memória mas não pode compilar no alvo, você precisa baixar o pacote de cabeçalhos diretamente dos repositórios de pacotes da distribuição Linux daquele sistema. Verifique se a versão do pacote corresponde exatamente à versão do release e do kernel em execução no sistema estrangeiro. Caso o outro sistema esteja usando um kernel compilado por você, você deve obter uma cópia do diretório de build daquele kernel. Em seguida, coloque a localização de qualquer um dos diretórios na variável de ambiente KDIR.
export KDIR=caminho/para/pacote/de/cabeçalhos/extraído/ou/raiz/do/kernel
Compilar o driver é simples, basta digitar:
make
Isso deve produzir linpmem.ko no diretório de trabalho atual.
Você pode querer verificar precompiler.h antes e escolher se compilará para release ou debug (por exemplo, com impressão de debug). Não há muitas outras configurações de pré-compilador agora.
O módulo linpmem.ko pode ser carregado usando insmod caminho-para-linpmem.ko, e descarregado com rmmod caminho-para-linpmem.ko. (Isso carregará o driver apenas para este tempo de atividade.) Se você compilou para debug, dê uma olhada também no dmesg.
Após carregar, para se comunicar com o driver, você precisa criar o dispositivo:
mknod /dev/linpmem c 42 0
Se você não conseguir se comunicar com o driver, verifique potencialmente no log dmesg para confirmar que '42' foi de fato o major registrado:
[12827.900168] linpmem: registered chrdev with major 42
Embora normalmente o kernel tente realmente atribuir esse número.
Você pode usar chown no dispositivo para dá-lo ao seu usuário, se não quiser ter um console root aberto o tempo todo. (Ou apenas continue usando-o em um console root.)
Há um código de exemplo demonstrando e explicando (em detalhes) como interagir com o driver. A referência da API do espaço do usuário também pode ser encontrada em ./userspace_interface/linpmem_shared.h.
Este código é importante se você quiser entender como interagir diretamente com o driver em vez de usar uma biblioteca. Também pode ser usado como um teste de função curto.
Existe uma ferramenta de interface de linha de comando (opcional) básica para o Linpmem, a ferramenta CLI pmem. Ela pode ser encontrada aqui: https://github.com/vobst/linpmem-cli. Além do código fonte, há também uma ferramenta CLI pré-compilada, bem como a biblioteca estática pré-compilada e cabeçalhos que podem ser encontrados aqui (assinados). Nota: esta é uma versão preliminar, certifique-se de verificar atualizações, pois muitas adições e melhorias virão em breve.
A ferramenta CLI pmem pode ser usada para testar as várias funções do Linpmem de uma maneira (relativamente) segura e conveniente. O Linpmem também pode ser carregado por esta ferramenta em vez de usar insmod/rmmod, com algumas opções extras no futuro. Isso também tem a vantagem de que pmem cria automaticamente o dispositivo certo para você para uso imediato. É extremamente portátil e roda em qualquer sistema Linux (e, de fato, foi testado até mesmo em um Linux 2.6).
$ ./pmem -h
Cliente de linha de comando para o driver linpmem
Uso: pmem [OPÇÕES] [COMANDO]
Comandos:
insmod Carregar o driver linpmem
help Imprimir esta mensagem ou a ajuda do subcomando dado
Opções:
-a, --address <ENDEREÇO> Endereço para operações de leitura física
-v, --virt-address <VIRT_ENDERECO> Traduzir endereço no espaço de endereço do processo alvo (padrão: processo atual)
-s, --size <TAMANHO> Tamanho das operações de leitura de buffer
-m, --mode <MODO> Modo de acesso para operações de leitura [valores possíveis: byte, word, dword, qword, buffer]
-p, --pid <PID> Processo alvo para informações cr3 e traduções virtual-para-físico
--cr3 Consultar valor cr3 do processo alvo (padrão: processo atual)
--verbose Exibir saída de debug
-h, --help Imprimir ajuda (veja mais com '--help')
-V, --version Imprimir versão
Se você quiser compilar a ferramenta cli você mesmo, mude para seu diretório e siga as instruções no Readme (cli) para compilá-la. Caso contrário, basta baixar o programa pré-construído, ele deve funcionar em qualquer Linux. Para carregar o driver do kernel com a ferramenta cli: