
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:
# pmem insmod caminho/para/linpmem.ko
A vantagem de usar a ferramenta pmem para carregar o driver é que você não precisa criar o arquivo de dispositivo você mesmo, e ela oferecerá (nas próximas versões) a opção de escolher quem possui o dispositivo linpmem.
A interface de linha de comando pmem é apenas um invólucro fino em torno de uma pequena biblioteca Rust que expõe uma API para interfacear com o driver. Usuários mais avançados também podem usar esta biblioteca. A biblioteca é automaticamente compilada (como biblioteca estática portátil) junto com a ferramenta cli pmem ao compilar a partir de https://github.com/vobst/linpmem-cli, mas também incluída (pré-compilada) aqui (assinada). Nota: esta é uma versão preliminar, mais em breve.
Se você não quiser usar a biblioteca de modo de usuário e preferir interfacear com o driver diretamente por conta própria, você pode encontrar sua API/interface de espaço do usuário e documentação em ./userspace_interface/linpmem_shared.h. Também fornecemos código de exemplo em demo/test.c que explica como usar o driver diretamente.
LinPyMem: Um wrapper Python para o driver linpmem. Disponível no PyPI.
Ainda não implementada.
Se o sistema relatar a seguinte mensagem de erro ao carregar o módulo, pode ser por causa do secure boot:
$ sudo insmod linpmem.ko
insmod: ERROR: could not insert module linpmem.ko: Operation not permitted
Existem diferentes maneiras de ainda assim carregar o módulo. A óbvia é desabilitar o secure boot nas configurações UEFI.
Se sua distribuição suportar, uma solução mais elegante seria assinar o módulo antes de usá-lo. Isso pode ser feito usando os seguintes passos (testado no Ubuntu 20.04).
$ sudo apt install mokutil
$ openssl req -new -newkey rsa:4096 -keyout mok-signing.key -out mok-signing.crt -outform DER -days 365 -nodes -subj "/CN=Algum nome descritivo/"
$ sudo mokutil --import mok-signing.crt
$ /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 caminho/para/sua/MOK.key caminho/para/sua/MOK.cert caminho/para/linpmem.ko
Depois disso, você deve conseguir carregar o módulo.
Observe que, de uma perspectiva de prontidão forense, você deve preparar um módulo assinado antes de precisar dele, pois o sistema será reiniciado duas vezes durante o processo descrito acima, destruindo a maioria dos seus dados voláteis na memória.
(Por favor, reporte problemas potenciais se encontrar algo.)
Linpmem, assim como Winpmem, não existiriam sem o trabalho de nossos predecessores do projeto REKALL (agora aposentado): https://github.com/google/rekall.
Nossos contribuidores de código aberto: