Caixas de diálogo Abrir e Salvar como (OpenSaveMRU)¶
O que é o histórico das caixas de diálogo¶
Quando um programa exibe a caixa de diálogo comum Abrir ou Salvar como, o Windows registra no
NTUSER.DAT do usuário:
- qual arquivo foi aberto ou salvo:
OpenSavePidlMRUtem uma subchave por extensão (docx,ps1, …) e*para todas as extensões, cada uma com uma lista dos itens usados mais recentemente; - qual programa usou a caixa de diálogo e a pasta em que ela estava:
LastVisitedPidlMRU(eLastVisitedPidlMRULegacypara programas que usam as caixas de diálogo mais antigas); - programas que exibiram a caixa de diálogo:
CIDSizeMRU(o tamanho da caixa de diálogo por programa) eFirstFolder(o caminho de um programa e uma pasta); - no Windows 2000 e XP,
OpenSaveMRU(caminhos por extensão) eLastVisitedMRU(programas e suas pastas como caminhos).
Desde o Windows Vista, os arquivos e pastas são listas de itens de shell, as mesmas estruturas do destino de um atalho: cada item é uma parte do caminho (Este Computador, uma unidade, uma pasta, o arquivo), e um item de arquivo ou pasta pode trazer seus próprios horários e a referência de arquivo NTFS.
Melhor conclusão: um programa usou a caixa de diálogo Abrir ou Salvar como para abrir ou salvar este arquivo, ou nesta pasta, na sessão deste usuário. Apenas a entrada mais recente de cada lista é datada: pelo horário da última gravação de sua chave.
Localização¶
C:\Users\<user>\NTUSER.DAT
Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\
OpenSavePidlMRU\<extension> shell item lists, MRUListEx order (Vista and later)
OpenSavePidlMRU\* every extension
LastVisitedPidlMRU program name, then a shell item list
LastVisitedPidlMRULegacy the same
CIDSizeMRU program name
FirstFolder program path, then a folder path
OpenSaveMRU\<extension> paths, MRUList order (2000 and XP)
LastVisitedMRU program name, then a folder path (2000 and XP)
Colete o NTUSER.DAT com seus logs de transação para todos os perfis.
Cuidados para o analista¶
- Um horário por lista. O horário da última gravação de uma chave muda quando uma de suas entradas passa para a
frente da lista, por isso ele data apenas a entrada na posição 0 (
IsMostRecent,LastUsedUTC). As outras entradas estão em ordem, da mais nova para a mais antiga ao longo da lista, mas sem data. - O mesmo arquivo em duas listas. Um arquivo está na lista de sua extensão e em
*; não o conte como dois usos.*fornece a ordem entre extensões. - Aberto ou salvo. As listas não dizem qual. Correlacione com os registros do
$MFTe do Diário USN do arquivo, com arquivos LNK e com Jump Lists. - Os horários dos itens são do arquivo, não da caixa de diálogo.
ItemModifiedUTC,ItemCreatedUTCeItemAccessedUTCsão os horários do arquivo quando o item foi gravado, com precisão de 2 segundos (FAT). Itens de pastas conhecidas (CLSID_ThisPCDocumentsRegFolder,Downloads, …) muitas vezes não têm nenhum. Esses carimbos de data/hora FAT não têm deslocamento de fuso horário. O sufixoUTCda coluna é uma convenção de exibição, não uma evidência de que o relógio original estava em UTC; correlacione com o fuso horário do sistema de origem e com outros carimbos de data/hora antes de compará-los com os FILETIMEs do Registro. Consulte as orientações sobre horários de arquivos da Microsoft. - Os caminhos são caminhos de shell. Eles começam na área de trabalho:
This PC\C:\Users\…, uma pasta conhecida, uma biblioteca (UsersLibraries\Documents\…) ou um local de rede. Um caminho que começa com uma pasta ou um arquivo está na área de trabalho. Um caminho vazio é a própria área de trabalho. - Itens não decodificados. Um item de um tipo que o analisador de itens de shell não conhece é exibido pela sua
classe (
[class 0x00]), seu tipo éunknowne os bytes da lista ficam emDataRaw. - Os programas são nomes.
LastVisitedPidlMRUeCIDSizeMRUguardam um nome de arquivo (WINWORD.EXE), não um caminho.FirstFolderguarda um caminho. - As listas são curtas e são limpas. Cada lista mantém um número limitado de entradas, e ferramentas de limpeza
excluem as chaves. Use
parse-registry read --recover-deletedpara valores excluídos.
Analisar com o Juntei¶
Usage: juntei parse-registry open-save-mru <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find NTUSER.DAT hives
-f, --file <FILE> Parse one NTUSER.DAT
--log1/--log2 Supply transaction logs explicitly
--no-logs Do not replay logs
--code-page <CP> Code page of shell item names that aren't Unicode (default 1252)
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry open-save-mru -d evidence/ -o opensavemru.csv
juntei parse-registry open-save-mru -f NTUSER.DAT -t jsonl \
| jq 'select(.List == "OpenSavePidlMRU" and .Extension != "*")'
O resumo lista as entradas por lista, os programas que usaram as caixas de diálogo e o arquivo mais
recente de cada hive (a primeira entrada de *).
Campos de saída¶
| Campo | Interpretação |
|---|---|
Host, User, UserSID, SourcePath |
Host, o dono do perfil (a partir do caminho ou das pastas do shell), o SID a partir do ProfileList do sistema e o hive. |
List |
OpenSavePidlMRU, LastVisitedPidlMRU, LastVisitedPidlMRULegacy, CIDSizeMRU, FirstFolder, OpenSaveMRU ou LastVisitedMRU. |
Extension |
A subchave da extensão (docx, *); vazio para as outras listas. |
MRU-Position, IsMostRecent |
A posição na lista da chave (0 é a mais recente); vazio quando a lista não menciona o valor. |
ValueName |
O número (MRUListEx) ou a letra (MRUList) do valor. |
Program |
O programa que exibiu a caixa de diálogo. |
Path |
O arquivo ou a pasta: os nomes dos itens de shell unidos, ou o caminho armazenado como texto. |
ItemType |
O tipo do último item de shell: file, directory, root_folder, volume, network_location, property_view, unknown, … |
ItemModifiedUTC, ItemCreatedUTC, ItemAccessedUTC |
Os horários do arquivo ou da pasta, conforme registrados pelo seu item de shell. |
MFT-Entry, MFT-Sequence |
A referência de arquivo NTFS registrada pelo item de shell. |
LastUsedUTC |
O horário da última gravação da chave, apenas para a entrada mais recente. |
KeyPath, KeyLastWrittenUTC |
A chave e sua última gravação: o horário de sua entrada mais recente, não de cada linha. |
DataRaw |
Os bytes do valor (hex) quando não são decodificados, ou a lista de itens de shell quando o tipo de um item é desconhecido. |
TransactionLogStatus, LogsApplied |
Contexto de recuperação do Registro. |
Problems |
Valores que a lista menciona, mas a chave não tem, valores que ela não menciona, tipos errados, nomes ou listas truncados. |
Estratégia de investigação¶
- Leia
*em ordem, por usuário, eLastUsedUTCpara o arquivo mais recente. - Procure scripts, arquivos compactados, executáveis e documentos em locais graváveis pelo usuário, removíveis ou de rede, e arquivos com nomes que sugiram credenciais ou exportações.
- Use
LastVisitedPidlMRUpara vincular um programa à pasta que ele usou por último, eCIDSizeMRUeFirstFolderpara identificar os programas que chegaram a usar as caixas de diálogo. - Correlacione os caminhos e o
MftEntrycom o$MFT, o Diário USN, arquivos LNK, Jump Lists, ShellBags e RecentDocs.