<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fahad Bilal Saleem</title>
    <description>The latest articles on DEV Community by Fahad Bilal Saleem (@bilalmughal1).</description>
    <link>https://dev.to/bilalmughal1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4143241%2Ff895f2c6-8fca-45d7-9917-7fc8fdadf24c.jpg</url>
      <title>DEV Community: Fahad Bilal Saleem</title>
      <link>https://dev.to/bilalmughal1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bilalmughal1"/>
    <language>en</language>
    <item>
      <title>Taphonomy: FAT32 file recovery that refuses to guess</title>
      <dc:creator>Fahad Bilal Saleem</dc:creator>
      <pubDate>Fri, 25 Sep 2026 16:32:32 +0000</pubDate>
      <link>https://dev.to/bilalmughal1/taphonomy-fat32-file-recovery-that-refuses-to-guess-16l2</link>
      <guid>https://dev.to/bilalmughal1/taphonomy-fat32-file-recovery-that-refuses-to-guess-16l2</guid>
      <description>&lt;p&gt;I built Taphonomy, a deleted-file recovery tool for FAT32 disk images written in Rust: &lt;a href="https://github.com/bilalmughal1/taphonomy" rel="noopener noreferrer"&gt;https://github.com/bilalmughal1/taphonomy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It recovers deleted files and files orphaned by a quick format. Evidence is opened read-only and every byte is SHA-256-hashed before anything is reported.&lt;/p&gt;

&lt;p&gt;The design rule: most recovery tools silently return plausible-looking bytes. Taphonomy treats "plausible but wrong" as a failure, not a partial success. Every recovery carries a caveat stating exactly what is and isn't established, and it refuses recoveries it can't support instead of guessing. It also reports its own coverage — every partition, directory, or listing it did not analyse is counted and named.&lt;/p&gt;

&lt;p&gt;Validation: I ran it against three of NIST's CFReDS deleted-file-recovery images, checking each recovery against the sectors NIST documents, and compared side-by-side with The Sleuth Kit 4.12.1. On dfr-01 and dfr-11, every recovery matched NIST's sectors. On dfr-02 — a file fragmented around a live file — Taphonomy refused, because the implied run crosses a cluster still in use. TSK recovered it correctly; its heuristic happened to land on the right one. 4 of 15 deleted files reached; 10 sit on FAT12/16 partitions not yet supported.&lt;/p&gt;

&lt;p&gt;How it's built: every capability starts as an Architecture Decision Record (17 so far); experiments record the hypothesis before the measurement, including wrong predictions; all test fixtures are generated from standard tools, byte-identical on every build, digests committed.&lt;/p&gt;

&lt;p&gt;Limitations: FAT32 only, disk images (not devices), MBR/512-byte sectors, 8.3 filenames. GPL-3.0.&lt;/p&gt;

&lt;p&gt;Where would you draw the line between a defensible recovery and a guess?&lt;/p&gt;

</description>
      <category>rust</category>
      <category>forensics</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
