https://github.com/ShaneK2/inVtero.net/blob/master/quickdumps/publish.zip
O Linux usa servidores de símbolos para resolução de tipo, simplesmente funciona;)
Confira o lançamento do inVteroCore para fornecer integridade para XEN e VMWare no Linux (ou em qualquer lugar que CORECLR seja executado, OSX e FBSD)
##$ IMPORTANTE (usuários do Windows em .NET) => Você precisa ter msdia140.dll registrado "cmd /c regsvr32 msdia140.dll" (ver zip)
Nenhuma configuração necessária, digitação completamente dinâmica/pato
Nova UI para edição de memória (desmontagem e correção) de formatos suportados. Use "Loader()" em uma instância vtero como;
Loader(test(MemList))
Altere a string MemoryDump para apontar para um despejo de memória. Exemplo de caminhada de despejo de memória e tipo de explicação do sistema em analyze.py, consulte WalkProcListExample()
quickdumps
>>> MemList = [ "c:\temp\win10.64.xendump" ]
>>> test(MemList)
++++++++++++++++++++++++++++++ ANALYZING INPUT [c:tempwin10.64.xendump] ++++++++++++++++++++++++++++++
PART RUNTIME: 00:00:08.5211677 (seconds), INPUT DUMP SIZE: 4,303,692,448.00 bytes.
SPEED: 466,980 KB / second (all phases aggregate time)
++++++++++++++++++++++++++++++ DONE WITH INPUT [c:tempwin10.64.xendump] ++++++++++++++++++++++++++++++
>>> Loader(vtero)
Processos de localização/extração, hipervisores (incluindo aninhados) em dumps de memória usando técnicas de introspecção de máquina virtual independentes de microarquitetura. Ferramentas de análise de memória física de alto desempenho, multiplataforma e multiarquitetura.
Versão x64 |
---|
Quickdumps é um exemplo de uso da API inVtero.net para extrair e validar memória física.
Da forma como inicializamos nossa tradução de endereço virtual para físico, não há dependências no formato do arquivo de entrada. Qualquer .DMP, .RAW, .DD deve servir. Infelizmente, há um grande problema: se o formato de captura subjacente usar alguma forma de armazenamento de extensões (ou seja, não consumir armazenamento físico para páginas NULL ou NOT PRESENT), sua milhagem poderá variar. Existem muitas ferramentas para converter despejos de memória e volatilidade - rekal são alguns bons lugares para começar. BITMAP. Os arquivos DMP estão na lista de tarefas para facilitar a análise do liveump (atualmente as coisas funcionam melhor se você fizer uma tela azul iniciada manualmente com um dump completo configurado ou usar uma ferramenta do tipo dd bruto de terceiros).
Vários conceitos são utilizados para garantir que interagimos com o usuário somente quando necessário. Da mesma forma, para o projeto Actaeon github @eurecom-s3/acteon, o objetivo principal é localizar e aproveitar a página VMCS para localizar o EPTP (ponteiro de tabela de página estendida) configurado que é necessário para localizar as páginas físicas que pertencem a um instância do sistema operacional convidado. O Google @google/rekall rekal implementou posteriormente uma implementação mais expansiva que exige que o usuário execute um módulo do kernel Linux no sistema originado de um determinado despejo de memória, destinado a construir um perfil especializado que pode ser usado para importar para um rekal local profile que permitirá isolar/extrair a memória guest de um dump de host físico.
Durante CanSecWest/DC22 apresentei uma técnica de alta qualidade (baseada na interação da camada mais baixa entre as camadas CPU e OS mm) para identificar qualquer processo em execução em um sistema, inspecionando instantâneos de memória física. Este mecanismo é baseado no que é chamado de ponteiro automático (Windows) ou ponteiro de diretório de página recursivo (*BSD) que sempre se espera ser encontrado (a menos que seu sistema Windows tenha um mm fortemente modificado/corrigido ou simplesmente um kernel personalizado para * BSD). O resultado líquido disso é que conhecemos todos os valores de registro CR3 fornecidos. Como o VMCS contém pelo menos 1 valor CR3 conhecido (um segundo pode ser emulado ou remapeado dinamicamente), temos confiança de que um despejo de memória abrangente pode ser executado sem saber nada sobre a versão do sistema operacional subjacente (por exemplo, XP(64 bits)->Win2016 são consistente) ou microarquitetura.
A força bruta sempre vence no final do dia! Ou pelo menos foi o que ouvi... Em qualquer caso, se um mapeamento VMCS desconhecido for encontrado (índice EPTP), os quickdumps emitirão um conjunto de valores/índices possíveis. A lista geralmente é pequena, de 10 a 20 no máximo. Um próximo recurso é automatizar tentativas para cada valor possível até que um que “funcione” seja encontrado. Isso deve garantir que trabalharemos para as próximas microarquiteturas de CPU sem quaisquer alterações de código (ou provavelmente configurarei algumas classes que as especificam para facilitar a vida). De qualquer forma, a força bruta deve ser bastante rápida. Eu tento aproveitar ao máximo as CPUs multi-core, então se você tiver núcleos extras, eles provavelmente irão se exercitar se você estiver analisando um grande despejo com muitas VMs.
Exemplo executado em um laptop:
Process CR3 [00000002DD41F000] File Offset [0000000293A12000] Diff [FFFFFFFFB65F3000] Type [Windows]
159 candiate process page tables. Time so far: 00:01:01.4826693, second pass starting. rate: 32588.149 MB/s
Hypervisor: VMCS revision field: 16384 [00004000] abort indicator: NO_ABORT [00000000]▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Hypervisor: Windows CR3 found [00000000016A0000)] byte-swapped: [00006A0100000000] @ PAGE/File Offset = [00000001262DA000]
[435][00000000006F0054]
Hypervisor: VMCS revision field: VMWARE_NESTED [00000001] abort indicator: NO_ABORT [00000000]
Hypervisor: Windows CR3 found [00000000001AB000)] byte-swapped: [00B01A0000000000] @ PAGE/File Offset = [00000001308D3000]
[14][000000007433301E]
Hypervisor: VMCS revision field: VMWARE_NESTED [00000001] abort indicator: NO_ABORT [00000000]
Hypervisor: Windows CR3 found [00000000001AB000)] byte-swapped: [00B01A0000000000] @ PAGE/File Offset = [0000000130AD1000]
[14][000000007433301E]
Hypervisor: VMCS revision field: VMWARE_NESTED [00000001] abort indicator: NO_ABORT [00000000]
Hypervisor: Windows CR3 found [00000000001AB000)] byte-swapped: [00B01A0000000000] @ PAGE/File Offset = [00000001314CF000]
[14][000000007433301E]
Hypervisor: VMCS revision field: 0 [00000000] abort indicator: NO_ABORT [00000000]
Hypervisor: Windows CR3 found [00000000016A0000)] byte-swapped: [00006A0100000000] @ PAGE/File Offset = [0000000160643000]
[106][00000000001E001C]
Hypervisor: VMCS revision field: VMWARE_NESTED [00000001] abort indicator: NO_ABORT [00000000]
Hypervisor: Windows CR3 found [00000000001AB000)] byte-swapped: [00B01A0000000000] @ PAGE/File Offset = [0000000195922000]
[14][000000007433301E]
Hypervisor: VMCS revision field: VMWARE_NESTED [00000001] abort indicator: NO_ABORT [00000000]
Hypervisor: Windows CR3 found [00000000001AB000)] byte-swapped: [00B01A0000000000] @ PAGE/File Offset = [00000001959A3000]
[14][000000007433301E]
159 candiate VMCS pages. Time to process: 00:02:51.8973861
Data scanned: 34,171,150,654.00Second pass done. rate: 1277.967 MB/s▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
grouping and joinging all memory
Scanning for group correlations
MemberProces: Groupt 1 Type [Windows] Group Correlation [100.000 %] PID [1AB000]
MemberProces: Groupt 1 Type [Windows] Group Correlation [90.909 %] PID [16A0000]
MemberProces: Groupt 1 Type [Windows] Group Correlation [90.909 %] PID [1FCA000]
MemberProces: Groupt 1 Type [Windows] Group Correlation [90.909 %] PID [62AB000]
MemberProces: Groupt 1 Type [Windows] Group Correlation [90.909 %] PID [34CE8000]
MemberProces: Groupt 1 Type [Windows] Group Correlation [90.909 %] PID [37300000]
MemberProces: Groupt 1 Type [Windows] Group Correlation [90.909 %] PID [7DCC6000]
Finished Group 1 collected size 48 next group
Scanning for group correlations
MemberProces: Groupt 2 Type [FreeBSD] Group Correlation [100.000 %] PID [65C8000]
MemberProces: Groupt 2 Type [FreeBSD] Group Correlation [100.000 %] PID [6B51000]
MemberProces: Groupt 2 Type [FreeBSD] Group Correlation [100.000 %] PID [6CC9000]
No exemplo acima, o EPTP do VMWARE está no índice 14 no VMCS.
* Veremos se consigo eliminar este, mas no momento ele está apenas despejando memória do kernel de cada camada. Trabalhando no espaço do usuário das VMs do sistema operacional convidado.
Muitos TODO's, mas vou adicionar o mais rápido possível. O principal problema agora é que estou realmente hesitante em adicionar qualquer coisa fornecida pelo sistema operacional, mesmo que seja uma grande ajuda. Acho que há contexto suficiente disponível para evitar a adição de dependências lógicas do sistema operacional. Gosto de como Rekal promete isso, mas parece que o arquivo de perfil deles também é muito grande, então um pouco dos dois.
Ainda há um pouco de limpeza a fazer. Isso ainda é alfa, mas estará em desenvolvimento ativo.
Expanda para tipos de EPTP mais conhecidos, sem necessidade de força bruta
Iremos criar um índice de bitmap PFN para determinar automaticamente as execuções (atualmente, se você tentar despejar/consultar qualquer coisa após uma execução, isso causará problemas ou será perdido, etc. Estaremos adicionando isso a seguir para garantir que obteremos despejos 100% abrangentes .
Abster-se de usar estruturas lógicas do sistema operacional para apoiar a análise de memória. É provável que a maioria das estruturas, dados, códigos e objetos da camada do sistema operacional possam ser manipulados por um invasor para direcionar mal os esforços de um analista.
Futura funcionalidade para renderizar um mapa de integridade para páginas de código que podem ser mapeadas de volta para valores de hash de bloco/página criptograficamente seguros (ou seja, SHA256 ou TIGER192). Nossos resultados indicam taxas de verificação pré-win10 superiores a 99%, a memória volátil pós-win10 é virtualmente 100% atestável. Isso elimina suposições substanciais e incógnitas devido ao tradicional manuseio/revisão/desmontagem manual da memória ao tentar detectar/analisar vários gigabytes de entrada.
Documentação
Implementação de GUI