18.4 Browser Artifact Recovery, Private Browsing, USB Enumeration, Partition Recovery & Packer Unpacking Tools

Key Takeaways

  • Chromium-based browsers store history, downloads, cookies, and autofill in SQLite databases under the User Data profile directory and timestamp them in WebKit time, which counts microseconds since 1601-01-01 UTC, while Firefox uses places.sqlite with PRTime microseconds since the Unix epoch.
  • Private and incognito browsing writes no history to disk, but the session survives in RAM, the pagefile and hibernation file, the DNS resolver cache, and $UsnJrnl and $LogFile records of the temporary cache files that were created and deleted.
  • USB device history is reconstructed from USBSTOR for vendor, product and serial, MountedDevices for the drive letter binding, and setupapi.dev.log for the first-ever connection timestamp, and PowerShell can enumerate all three from a mounted image hive.
  • Partition recovery tools such as TestDisk rebuild a damaged or deleted partition table by scanning for file system boot sectors and superblock backups, which recovers a whole volume that appears as raw unallocated space.
  • Program packers compress and encrypt an executable so static analysis sees only the stub; unpacking tools and memory dumping at the original entry point restore the analyzable payload.
Last updated: September 2026

18.4 Browser Artifact Recovery, Private Browsing, USB Enumeration, Partition Recovery & Packer Unpacking Tools

Quick Answer: Blueprint Domain 6 names tools to examine the cache, cookie, and history recorded in web browsers, private browsing and browser artifact recovery, USB device enumeration using Windows PowerShell, partition recovery tools, and program packers unpacking tools. Two facts anchor the section: Chromium timestamps are WebKit time — microseconds since 1601-01-01 UTC, while Firefox uses PRTime — microseconds since the Unix epoch; and private browsing is not private to a forensic examiner, because RAM, the pagefile, the hibernation file, the DNS cache, and NTFS journal records all retain traces.


Browser Artifact Locations and Schemas

Chromium Family (Chrome, Edge, Brave, Opera, Vivaldi)

Profile base: %LocalAppData%\Google\Chrome\User Data\Default\ (Edge substitutes Microsoft\Edge).

FileTypeKey tables / contents
HistorySQLiteurls (url, title, visit_count, typed_count, last_visit_time), visits (visit_time, transition type), downloads, downloads_url_chains, keyword_search_terms
CookiesSQLitehost_key, name, encrypted_value, creation_utc, expires_utc, last_access_utc
Login DataSQLiteorigin_url, username_value, password_value (DPAPI/AES-GCM protected)
Web DataSQLiteautofill entries, credit-card and address profiles
Top Sites, Favicons, ShortcutsSQLiteFrequency ranking, favicon cache, omnibox shortcuts
Cache\Simple Cacheindex, data_0data_3, and per-entry f_###### files holding cached resources
Sessions\BinarySession_* and Tabs_*open tabs and navigation stacks at last close, including private-window-adjacent state
Preferences, Secure PreferencesJSONInstalled extensions, sync account, homepage, search engines
Network\Network Persistent StateJSONHosts recently connected to, including over QUIC

The typed_count column deserves attention. A URL with a non-zero typed_count was manually typed into the address bar, which distinguishes intentional navigation from a redirect or an embedded resource — a distinction that matters enormously in possession and intent cases. The visits.transition value carries the same information at per-visit granularity (LINK, TYPED, AUTO_BOOKMARK, RELOAD, FORM_SUBMIT).

Firefox

Profile: %AppData%\Mozilla\Firefox\Profiles\<random>.default-release\.

FileContents
places.sqlitemoz_places (URL, title, visit_count, frecency) joined to moz_historyvisits (visit_date, visit_type); also bookmarks
cookies.sqlite, formhistory.sqlite, permissions.sqliteCookies, form autofill, per-site permissions
cache2\entries\Cache entries, each with a metadata trailer holding the source URL and fetch time
sessionstore-backups\recovery.jsonlz4Open tabs and full back/forward history, compressed with mozlz4
logins.json + key4.dbSaved credentials and the NSS key database

Legacy Internet Explorer / Edge Legacy

WebCacheV01.dat is an ESE (Extensible Storage Engine) database holding history, cache, cookies, and download records in container tables. Parse with esedbexport, ESEDatabaseView, or a dedicated parser; dirty databases may need esentutl /r recovery against a working copy only. Older systems use index.dat.

Timestamp Formats — the Recurring Trap

BrowserEpochUnit
Chromium (WebKit time)1601-01-01 00:00:00 UTCMicroseconds
Firefox (PRTime)1970-01-01 00:00:00 UTCMicroseconds
Safari (Cocoa/Mac absolute)2001-01-01 00:00:00 UTCSeconds (often fractional)
-- Chromium History: convert WebKit time to a readable UTC timestamp
SELECT url, title, visit_count, typed_count,
       datetime(last_visit_time/1000000 - 11644473600, 'unixepoch') AS last_visit_utc
FROM urls ORDER BY last_visit_time DESC;

The constant 11,644,473,600 is the number of seconds between 1601-01-01 and 1970-01-01. Applying the Firefox conversion to a Chromium value — or omitting the offset — produces timestamps centuries adrift, and it is one of the most common avoidable errors in browser timeline work.

Tooling

ToolRole
HindsightChromium-focused parser producing a unified timeline across history, cache, cookies, and extensions
NirSoft suite (BrowsingHistoryView, ChromeCacheView, MZCacheView, IECacheView)Fast per-artifact triage
DB Browser for SQLiteManual schema exploration — open read-only
Autopsy / Magnet AXIOM / BelkasoftIntegrated multi-browser recovery including deleted records
sqlite3 + .recover, or WAL/journal carvingRecover deleted rows from -wal and -journal files

[!IMPORTANT] Always collect the -wal and -shm files alongside every browser SQLite database. In WAL mode, recent transactions — including records the browser has "deleted" — live in the write-ahead log and have not yet been merged into the main database. Copying only History without History-wal silently discards the most recent and most relevant activity.


Private Browsing: What Actually Survives

Incognito and Private Browsing suppress disk writes of history, cookies, and cache for the session. They do not make the session invisible.

ResidueWhy it exists
RAMThe full session — URLs, page DOM, form contents, and often credentials — is in the browser process memory. A memory image recovers it directly with string and URL carving.
pagefile.sys / swapfile.sysMemory paged to disk under pressure retains fragments after the browser exits
hiberfil.sysHibernation writes all of RAM to disk; a hibernation file created during or after a private session is effectively a frozen memory image
DNS resolver cacheipconfig /displaydns on a live system lists names resolved regardless of browsing mode (volatile — lost on reboot or flush)
$UsnJrnl and $LogFileNTFS journals record the creation and deletion of the temporary cache files the private session used, proving activity and its timing even though the content is gone
$MFT resident remnantsSmall deleted temporary files may retain resident data in their MFT records
Browser crash dumps / recovery filesA crash during a private session can persist session state
Network- and endpoint-side recordsProxy logs, EDR telemetry, and firewall records are entirely unaffected by browsing mode

[!IMPORTANT] Private browsing changes only what the browser writes. It changes nothing about what the operating system, the network, or the memory subsystem retain. Where the private session is the crux of the case, memory acquisition is the priority action and hiberfil.sys is the fallback if the machine has already been powered down.


USB Device Enumeration with Windows PowerShell

The triangulation from three artifacts is the standard method:

ArtifactYields
SYSTEM\CurrentControlSet\Enum\USBSTOR\<Ven_Prod_Rev>\<serial>Vendor, product, revision, device serial number, FriendlyName
SYSTEM\CurrentControlSet\Enum\USB\VID_xxxx&PID_xxxxUSB VID/PID; the interface-level view of the same device
SYSTEM\MountedDevicesBinds a drive letter and volume GUID to the device
%windir%\INF\setupapi.dev.logFirst-ever connection timestamp — plain text, and the authoritative "first seen" source
SOFTWARE\Microsoft\Windows Portable Devices\DevicesVolume label and friendly name
NTUSER.DAT MountPoints2Which user account mounted the volume
Microsoft-Windows-DriverFrameworks-UserMode/Operational (when enabled)Connect and disconnect event pairs
# Live host: currently and previously enumerated USB storage devices
Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Enum\USBSTOR\*\*' |
    Select-Object FriendlyName, PSChildName, Service, ContainerID

# Present-state view including removed devices
Get-PnpDevice -Class USB -Status OK,Unknown |
    Select-Object FriendlyName, InstanceId, Status

# Mounted image: load the exported SYSTEM hive under a temporary key and query it offline
reg load HKLM\EvidenceSYSTEM E:\evidence\SYSTEM
Get-ChildItem 'HKLM:\EvidenceSYSTEM\ControlSet001\Enum\USBSTOR' -Recurse |
    Select-Object Name
reg unload HKLM\EvidenceSYSTEM

# First-connection times straight out of setupapi.dev.log
Select-String -Path 'C:\Windows\INF\setupapi.dev.log' -Pattern 'Device Install \(Hardware initiated\).*USBSTOR' -Context 0,2

Serial-number caveat: the second character of a USBSTOR serial being & indicates the device did not report a hardware serial and Windows generated an instance identifier instead. Such an identifier is host-specific, so it cannot be used to prove the same device was connected to a different machine.


Partition Recovery Tools

When a partition table is wiped, corrupted, or overwritten, an entire volume appears as raw unallocated space. Partition recovery works by scanning the raw device for file system signatures — NTFS and FAT boot sectors, ext superblock backups, HFS+/APFS volume headers — and rebuilding the table from what it finds.

ToolNotes
TestDiskOpen-source, cross-platform; Analyse then Deeper Search rebuilds MBR/GPT entries; also rewrites a damaged NTFS boot sector from its backup copy at the end of the partition
PhotoRecTestDisk's companion; ignores the file system entirely and carves files by signature
gdisk / sgdiskRepairs GPT from the backup GPT header at the end of the disk
Active@ Partition Recovery, EaseUS, MiniToolCommercial GUI equivalents
Autopsy / TSK mmlsEnumerates partitions and gaps; mmls showing a large unallocated region where a volume should be is the first indicator

[!WARNING] Run recovery only against a working copy of the image, never the original evidence or the original media. TestDisk in write mode alters the partition table. The forensically sound sequence is: image → hash → duplicate the image → run recovery on the duplicate → document the change → re-verify the original's hash is unchanged.

GPT's built-in redundancy is the examiner's friend: a primary GPT header destroyed at LBA 1 has a backup copy in the final sector of the disk, so a "destroyed" GPT disk is often recoverable in a single step.


Program Packers and Unpacking Tools

A packer compresses and/or encrypts an executable and prepends a stub that reconstructs the original in memory at run time. The blueprint lists program packers among anti-forensics techniques and lists program packers unpacking tools in the tool domain.

Identifying a Packed Binary

IndicatorDetail
High section entropyCompressed or encrypted sections approach 8.0 bits per byte; entropy above roughly 7.0 is a strong flag
Abnormal section namesUPX0/UPX1, .aspack, .themida, .vmp0, or random names
Tiny import tableTypically only LoadLibraryA and GetProcAddress — imports are resolved at run time
Raw size far below virtual sizeA section with SizeOfRawData near zero but a large VirtualSize is the unpacking destination
Entry point outside .textThe entry point sits in the last section
Almost no readable stringsStatic strings output collapses to stub text only

Detection tools: Detect It Easy (DiE), PEiD (legacy signatures), PEStudio, ExeinfoPE, pefile plus an entropy script in Python.

Unpacking Approaches

  1. Native unpacker — UPX ships upx -d, which cleanly restores a genuinely UPX-packed file. Attackers often modify UPX headers specifically to break this.
  2. Dynamic unpacking (the general method) — run the sample in an isolated, instrumented VM and dump the process from memory once the stub has reconstructed the payload at the original entry point (OEP), then rebuild the import table. Tools: x64dbg with the Scylla import reconstructor, OllyDumpEx, PE-sieve and HollowsHunter (which detect and dump implanted or hollowed modules automatically).
  3. Emulation / sandbox unpackingunipacker, Qiling, and sandbox platforms that snapshot memory after unpacking.
  4. Memory-image extraction — where only a RAM image exists, Volatility's malfind and VAD dumping recover the unpacked image in exactly the same way described for reflective .NET loading in Section 12.5.

Commercial protectors (Themida, VMProtect, Enigma) go beyond packing into code virtualization, translating the original instructions into a custom bytecode interpreted by an embedded VM. These are not "unpacked" in any straightforward sense; analysis proceeds by behavioral observation and by targeted devirtualization, which is expert-level work and should be scoped accordingly.

Detecting Data Hiding in File System Structures with OSForensics

The blueprint names one product for this task specifically: OSForensics from PassMark Software. It matters here because concealment rarely uses one technique in isolation — a single case may combine a renamed executable, a payload parked in an alternate data stream, and a deleted staging file — and OSForensics puts the corresponding searches in one workflow over a mounted image.

ModuleWhat it exposesThe hiding technique it defeats
Alternate data stream listing and searchEnumerates and searches named $DATA streams attached to files and directoriesPayloads parked in an ADS, which a directory listing and a file-size check both miss (Section 6.2)
Mismatch File SearchFinds files whose contents do not match their declared extensionExtension renaming — the magic-byte contradiction taught in Section 7.3
Deleted Files SearchRecovers files a user attempted to destroy, by walking file-system metadata for unlinked entriesOrdinary deletion, which unlinks the record but leaves the clusters intact (Section 10.3)
Raw Disk ViewerNavigates and searches the raw bytes of a volume outside the file-system abstractionData parked in file slack, volume slack, and unallocated space
File indexing and searchBuilds a ranked index across hundreds of file types for keyword searchContent buried in large archives and document sets that no manual review would reach
Hash verification and hash-set matchingVerifies and matches files by MD5, SHA-1, and SHA-256Known-file elimination, and proving that a recovered copy is bit-identical to the original

Two practical cautions carry into the exam. First, an ADS or mismatch hit is a lead, not a finding — the examiner opens the stream or the header and reads what is actually there, because legitimate software writes both benign streams (the Zone.Identifier mark-of-the-web discussed in Section 6.2) and files whose extensions are genuinely unconventional. Second, the tool-validation rule from Section 16.3 applies with full force to concealment claims: a hiding allegation that rests on a single automated scan is corroborated with a second, independently validated tool before it reaches a report, which is also the defense against the anti-forensic technique of feeding a parser malformed structures.

Detecting overwritten data and metadata is the same problem viewed from the other end. Where a file has been overwritten in place, the surviving proof is circumstantial and lives in the structures around it: $LogFile and $UsnJrnl transaction entries naming the file, an $MFT record whose $STANDARD_INFORMATION and $FILE_NAME timestamps disagree, a Volume Shadow Copy or APFS snapshot predating the overwrite, and Prefetch or Amcache evidence that a wiping utility ran at all.

Loading diagram...
What Private Browsing Leaves Behind
Test Your Knowledge

An examiner parsing a Chromium History database finds last_visit_time = 13405939200000000 for a URL central to the case and converts it using the Unix epoch, producing a date in the year 2394. What is the error and the correct conversion?

A
B
C
D
Test Your Knowledge

A suspect used only Incognito mode and the workstation was seized powered on. What is the highest-priority acquisition step, and which disk artifact proves that private browsing activity occurred even though no history was written?

A
B
C
D
Test Your Knowledge

Static analysis of a suspected malware sample shows a .text section with entropy of 7.91, an import table containing only LoadLibraryA and GetProcAddress, a final section whose SizeOfRawData is near zero but whose VirtualSize is several megabytes, and an entry point outside .text. What is the correct characterization and the general analysis approach?

A
B
C
D
Congratulations!

You've completed this section

Continue exploring other exams