Programas instalados¶
O que o Windows mantém¶
O Windows e os instaladores registram o software instalado em várias listas do Registro. Cada lista tem uma chave por programa, produto, distribuição ou pacote; o Juntei gera um registro por chave.
| Fonte | Hive e chave | O que contém |
|---|---|---|
uninstall |
SOFTWARE e NTUSER.DAT …\CurrentVersion\Uninstall\*, e SOFTWARE\Wow6432Node\… |
O que Configurações e Programas e Recursos listam: nome, versão, editor, data de instalação, pastas, comandos de desinstalação, tamanho, se está oculto |
msi_product |
SOFTWARE\Classes\Installer\Products\*, NTUSER.DAT Software\Microsoft\Installer\Products\* |
Produtos do Windows Installer: nome e versão do produto, o nome do arquivo do pacote e a pasta a partir da qual foi instalado |
app_path |
SOFTWARE e NTUSER.DAT …\CurrentVersion\App Paths\* |
Programas que o Windows inicia pelo nome (Win+R, start tool): o caminho do programa e sua pasta |
wsl |
NTUSER.DAT …\CurrentVersion\Lxss\{GUID} |
Distribuições do Subsistema do Windows para Linux: nome, onde estão seus arquivos ou disco, WSL 1 ou 2 |
package |
SOFTWARE …\Appx\AppxAllUserStore |
Aplicativos empacotados (da Store): provisionados para todos os usuários, do próprio Windows, preparados (staged), desprovisionados e os de cada usuário |
Melhor conclusão: este programa, produto ou pacote foi instalado (ou registrado) no sistema, para todos os usuários ou para este usuário. A data de instalação é o que o instalador gravou; a última gravação da chave é quando a entrada foi alterada pela última vez.
Localização¶
C:\Windows\System32\config\SOFTWARE
Microsoft\Windows\CurrentVersion\Uninstall\<name or {ProductCode}>
Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\<…> 32-bit programs
Classes\Installer\Products\<packed product code>[\SourceList]
Microsoft\Windows\CurrentVersion\App Paths\<program.exe>
Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\{Applications,InboxApplications,Staged,Deprovisioned,<SID>,EndOfLife\<SID>}\<package>
C:\Users\<user>\NTUSER.DAT
Software\Microsoft\Windows\CurrentVersion\Uninstall\<…>
Software\Microsoft\Installer\Products\<packed product code>
Software\Microsoft\Windows\CurrentVersion\App Paths\<program.exe>
Software\Microsoft\Windows\CurrentVersion\Lxss\{GUID}
Colete o SOFTWARE, todos os NTUSER.DAT e seus logs de transação. O SYSTEM nomeia o host, e
o ProfileList do SOFTWARE fornece o SID de cada usuário.
Cuidados para o analista¶
- Data de instalação e horário da chave.
InstallDateé uma data (sem hora) gravada pelo instalador, no horário local; alguns instaladores não a gravam, e outros gravam em outro formato (mantido como gravado emInstallDateRaw). Uma atualização pode regravar a entrada sem alterar a data, ou alterar a data sem que o programa mude muito: compareInstallDatecomKeyLastWrittenUTC. - Software desinstalado. Um programa removido de forma limpa perde suas chaves. Use
parse-registry read --recover-deletedpara chavesUninstallexcluídas, e o Amcache, o Prefetch e o$MFTpara os vestígios deixados. - Registros por usuário. As entradas do
NTUSER.DATidentificam software registrado para um perfil. Esse escopo não estabelece quem executou o instalador nem se foram usados direitos de administrador. - Entradas ocultas.
SystemComponentoculta uma entrada de Programas e Recursos; entradas semDisplayName(atualizações, componentes) também não são exibidas. Todas são relatadas. - Códigos de produto. Uma chave
Uninstallcom formato de GUID pode ser associada a uma chavemsi_productcompactada por meio deProductCode. O nome em formato de GUID, por si só, não prova que o Windows Installer criou a entrada. - App Paths. São registros usados para localizar programas, não registros de
execução. O valor
Pathpode conter vários diretórios de pesquisa e não é necessariamente o diretório de instalação. - Editor. São metadados do Registro fornecidos pelo instalador, não informações de assinatura verificadas.
- Arquitetura.
Wow6432Nodecontém programas de 32 bits no Windows de 64 bits (Architecturex86,Wow64True); as demais entradas são da arquitetura própria do sistema (vazio). A arquitetura de um pacote é a dele próprio (x64,neutral, …). - WSL.
Versioné a versão do WSL obtida dasFlagsda distribuição (0x8: ela é executada na máquina virtual do WSL 2). O próprio valorVersionda distribuição (emDetails) é a versão do seu sistema de arquivos, 2 também em distribuições WSL 1.BasePathcontém seuext4.vhdx(WSL 2) ourootfs(WSL 1): colete-o para examinar seu conteúdo. - Pacotes. As listas
<SID>são os pacotes registrados para cada usuário; a maioria é do próprio Windows. PacotesDeprovisionedforam removidos para novos usuários; os deEndOfLife\<SID>, para aquele usuário. - Valores danificados. Números malformados, tipos de valor incorretos e UTF-16 inválido são relatados em
Problemse mantidos emDataRaw, incluindo uma string hex vazia para um valor presente com zero bytes. Uma string vazia sem problemas em um campo numérico opcional é tratada como ausente. A versão de um pacote deve conter quatro componentes decimais, cada um dentro do intervalo de 16 bits sem sinal. Os avisos no nível do hive permanecem no stderr quando-ttransmite os registros para o stdout.
Analisar com o Juntei¶
Usage: juntei parse-registry installed-programs <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find SOFTWARE and NTUSER.DAT hives
-f, --file <FILE> Parse one SOFTWARE or NTUSER.DAT hive
--log1/--log2 Supply transaction logs explicitly
--no-logs Do not replay logs
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry installed-programs -d evidence/ -o installed.csv
juntei parse-registry installed-programs -d evidence/ -t jsonl \
| jq 'select(.Scope == "user" and .Source != "package")'
O resumo lista os programas instalados por último (por InstallDate), o que os usuários instalaram para
si mesmos e as distribuições WSL.
Campos de saída¶
| Campo | Interpretação |
|---|---|
Host, SourcePath, HiveType |
Host, arquivo do hive e SOFTWARE ou NTUSER.DAT. |
User, UserSID |
O usuário de um hive de usuário (sua pasta de perfil e o SID do ProfileList) ou o usuário para o qual um pacote está listado. |
Source, Scope |
A lista (uninstall, msi_product, app_path, wsl, package) e machine ou user. |
Name, Version, Publisher |
DisplayName, DisplayVersion, Publisher; ProductName e Version de um produto; o nome do arquivo do programa de um App Path; o nome e a versão do WSL de uma distribuição; o nome e a versão de um pacote. |
InstallDate, InstallDateRaw |
InstallDate como data quando gravado como YYYYMMDD; caso contrário, como foi gravado. |
KeyLastWrittenUTC |
Quando a chave da entrada foi alterada pela última vez. |
InstallLocation, InstallSource |
InstallLocation (o Path de um App Path, o BasePath de uma distribuição, o Path de um pacote); InstallSource (a última pasta de origem usada por um produto). |
Program |
O programa de um App Path. |
UninstallCommand, QuietUninstallCommand |
UninstallString, QuietUninstallString. |
SizeKB, SystemComponent, WindowsInstaller |
EstimatedSize em KiB; se está oculto; se o Windows Installer o instalou. |
ProductCode |
O código de produto do Windows Installer ({GUID}). |
Architecture, WOW64 |
x86 sob Wow6432Node ou a arquitetura de um pacote; se a chave está sob Wow6432Node. |
Details |
Mais informações: DisplayIcon, ModifyPath, ParentKeyName, ReleaseType, Inno Setup: User (a conta que executou um instalador Inno Setup); PackageCode e PackageName de um produto; Flags, State, DefaultUid, Version, PackageFamilyName e Default de uma distribuição; List, ResourceId e PublisherId de um pacote. |
KeyPath |
A chave da entrada. |
DataRaw |
Os bytes (hex) de valores que não são o que seus nomes indicam. |
TransactionLogStatus, LogsApplied |
Contexto de recuperação do Registro. |
Problems |
Valores que não puderam ser lidos ou que não são o que seus nomes indicam. |
Estratégia de investigação¶
- Ordene por
InstallDateeKeyLastWrittenUTCem torno do incidente; examine ferramentas de acesso remoto, clientes de tunelamento e de transferência de arquivos, compactadores, runtimes de scripts e ferramentas de segurança. - Revise os registros com
Scopeuser: software instalado sem direitos de administrador. - Verifique
InstallLocation,InstallSourceeUninstallCommandem busca de pastas graváveis pelo usuário (Downloads,AppData,Temp,ProgramData). - Procure distribuições WSL e colete seu
BasePath. - Correlacione com o Amcache e o Prefetch (o instalador e o programa em execução), o
$MFT(a criação da pasta de instalação) e o log de eventos Application (eventos do MsiInstaller).