<?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: Muhammad Zain-Ul-Abdin</title>
    <description>The latest articles on DEV Community by Muhammad Zain-Ul-Abdin (@iamzsial).</description>
    <link>https://dev.to/iamzsial</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%2F4021527%2Fb0906ec9-a537-46a1-bb83-272818a1e25e.jpeg</url>
      <title>DEV Community: Muhammad Zain-Ul-Abdin</title>
      <link>https://dev.to/iamzsial</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iamzsial"/>
    <language>en</language>
    <item>
      <title>How to Build a Timestomping Utility: Windows Native APIs &amp; Forensic Evasion</title>
      <dc:creator>Muhammad Zain-Ul-Abdin</dc:creator>
      <pubDate>Tue, 14 Jul 2026 09:35:07 +0000</pubDate>
      <link>https://dev.to/iamzsial/how-to-build-a-timestomping-utility-windows-native-apis-forensic-evasion-33b4</link>
      <guid>https://dev.to/iamzsial/how-to-build-a-timestomping-utility-windows-native-apis-forensic-evasion-33b4</guid>
      <description>&lt;h1&gt;
  
  
  How to Build a Timestomping Utility: Windows Native APIs, NTFS Metadata &amp;amp; Forensic Evasion
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Title:&lt;/strong&gt; How to Build a Timestomping Utility: Windows Native APIs, NTFS Metadata &amp;amp; Forensic Evasion&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Learn how file timestamps work in Windows, how they can be modified using Native APIs, and why forensic examiners need multiple data sources to catch manipulation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;code&gt;#windows&lt;/code&gt; &lt;code&gt;#cybersecurity&lt;/code&gt; &lt;code&gt;#ntfs&lt;/code&gt; &lt;code&gt;#native-api&lt;/code&gt; &lt;code&gt;#forensics&lt;/code&gt; &lt;code&gt;#c&lt;/code&gt; &lt;code&gt;#malware-analysis&lt;/code&gt; &lt;code&gt;#windows-internals&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reading Time:&lt;/strong&gt; 8 min&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Difficulty:&lt;/strong&gt; Intermediate&lt;/p&gt;


&lt;h2&gt;
  
  
  🎯 Introduction
&lt;/h2&gt;

&lt;p&gt;Ever wondered how malware hides its tracks on Windows systems? One of the most overlooked—yet powerful—techniques is &lt;strong&gt;timestomping&lt;/strong&gt;: modifying file creation, modification, and access timestamps to appear innocuous.&lt;/p&gt;

&lt;p&gt;In this post, I'll walk you through:&lt;/p&gt;

&lt;p&gt;✅ How Windows stores file timestamps&lt;br&gt;&lt;br&gt;
✅ Why investigators rely on them&lt;br&gt;&lt;br&gt;
✅ How to build a timestomping utility from scratch&lt;br&gt;&lt;br&gt;
✅ Why timestomping alone is insufficient for evasion&lt;br&gt;&lt;br&gt;
✅ How forensic examiners can detect manipulation  &lt;/p&gt;

&lt;p&gt;I've built a working timestomper in C using Windows Native APIs—let's dissect it.&lt;/p&gt;


&lt;h2&gt;
  
  
  📋 The Problem: File Timestamps in Forensics
&lt;/h2&gt;

&lt;p&gt;When an investigator reconstructs a timeline of events on a compromised system, they often start with &lt;strong&gt;file metadata&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Standard questions during incident response:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When was this executable created?&lt;/li&gt;
&lt;li&gt;When was this configuration file last modified?&lt;/li&gt;
&lt;li&gt;What files were accessed around the time of the breach?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this relies on three critical timestamps:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Timestamp&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Creation Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;When the file was first written to disk&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2026-07-10 10:13 PM&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Last Write Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;When the file contents changed&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2026-07-10 10:15 PM&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Last Access Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;When the file was opened&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2026-07-10 3:00 PM&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If an attacker can modify these timestamps, they can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🕵️ Hide when malware was executed&lt;/li&gt;
&lt;li&gt;📅 Impersonate legitimate system files&lt;/li&gt;
&lt;li&gt;🔄 Obfuscate the attack timeline&lt;/li&gt;
&lt;li&gt;🚪 Evade automated detection systems&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  ⚙️ Understanding Windows File Timestamps
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Where Are Timestamps Stored?
&lt;/h3&gt;

&lt;p&gt;Windows stores file timestamps in the &lt;strong&gt;NTFS MFT (Master File Table)&lt;/strong&gt;. Every file has an associated entry containing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FILE_BASIC_INFORMATION
├── CreationTime
├── LastAccessTime
├── LastWriteTime
├── ChangeTime
└── FileAttributes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How Can We Access Them?
&lt;/h3&gt;

&lt;p&gt;There are two ways to read/modify timestamps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Win32 APIs (High-Level)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;GetFileTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;    &lt;span class="c1"&gt;// Read timestamps&lt;/span&gt;
&lt;span class="n"&gt;SetFileTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;    &lt;span class="c1"&gt;// Write timestamps (limited)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Native APIs (Low-Level)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;NtQueryInformationFile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;    &lt;span class="c1"&gt;// Query file info directly from kernel&lt;/span&gt;
&lt;span class="n"&gt;NtSetInformationFile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;      &lt;span class="c1"&gt;// Modify file info at kernel level&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Native API approach is more powerful because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Win32 may enforce restrictions or validation&lt;/li&gt;
&lt;li&gt;Native APIs interact directly with NTFS structures&lt;/li&gt;
&lt;li&gt;Developers can bypass certain access checks&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 Building the Timestomper
&lt;/h2&gt;

&lt;p&gt;Let's break down the implementation. Full source code: &lt;a href="https://github.com/zainsial866/timestomper" rel="noopener noreferrer"&gt;github.com/zainsial866/timestomper&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Define the Structures
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;_FILE_BASIC_INFORMATION&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;LARGE_INTEGER&lt;/span&gt; &lt;span class="n"&gt;CreationTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;LARGE_INTEGER&lt;/span&gt; &lt;span class="n"&gt;LastAccessTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;LARGE_INTEGER&lt;/span&gt; &lt;span class="n"&gt;LastWriteTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;LARGE_INTEGER&lt;/span&gt; &lt;span class="n"&gt;ChangeTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;ULONG&lt;/span&gt;         &lt;span class="n"&gt;FileAttributes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;FILE_BASIC_INFORMATION&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;LARGE_INTEGER&lt;/code&gt; format stores time as 100-nanosecond intervals since January 1, 1601 (Windows FILETIME).&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Dynamically Resolve Native APIs
&lt;/h3&gt;

&lt;p&gt;Instead of static linking, we resolve the APIs at runtime:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;NtQueryInformationFile_t&lt;/span&gt; &lt;span class="n"&gt;pNtQueryInformationFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NtQueryInformationFile_t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;GetProcAddress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;GetModuleHandleA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ntdll.dll"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
        &lt;span class="s"&gt;"NtQueryInformationFile"&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pNtQueryInformationFile&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[!] Could not resolve NtQueryInformationFile&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;FALSE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Undocumented APIs aren't in import libraries&lt;/li&gt;
&lt;li&gt;Dynamic resolution makes the tool more portable&lt;/li&gt;
&lt;li&gt;Demonstrates runtime API patching techniques&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Open Source &amp;amp; Destination Files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;fileSrc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;srcfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;GENERIC_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;// Source needs read access&lt;/span&gt;
    &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OPEN_EXISTING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;HANDLE&lt;/span&gt; &lt;span class="n"&gt;fileDst&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;dstfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;GENERIC_READ&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;GENERIC_WRITE&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;FILE_WRITE_ATTRIBUTES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Dst needs write&lt;/span&gt;
    &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OPEN_EXISTING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Query the Source File's Timestamps
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;IO_STATUS_BLOCK&lt;/span&gt; &lt;span class="n"&gt;ioStat&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;FILE_BASIC_INFORMATION&lt;/span&gt; &lt;span class="n"&gt;src_fbi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;pNtQueryInformationFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;fileSrc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                          &lt;span class="c1"&gt;// File handle&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ioStat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                          &lt;span class="c1"&gt;// Status block&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;src_fbi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                         &lt;span class="c1"&gt;// Output buffer&lt;/span&gt;
    &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE_BASIC_INFORMATION&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;   &lt;span class="c1"&gt;// Buffer size&lt;/span&gt;
    &lt;span class="n"&gt;FileBasicInformation&lt;/span&gt;              &lt;span class="c1"&gt;// Information class&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Copy Timestamps
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;FILE_BASIC_INFORMATION&lt;/span&gt; &lt;span class="n"&gt;dst_fbi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Get destination file's current metadata&lt;/span&gt;
&lt;span class="n"&gt;pNtQueryInformationFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileDst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ioStat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;dst_fbi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE_BASIC_INFORMATION&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;FileBasicInformation&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Replace timestamps&lt;/span&gt;
&lt;span class="n"&gt;dst_fbi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LastWriteTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;src_fbi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LastWriteTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;dst_fbi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LastAccessTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;src_fbi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LastAccessTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;dst_fbi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChangeTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;src_fbi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChangeTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;dst_fbi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreationTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;src_fbi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreationTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Write Modified Metadata Back
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;pNtSetInformationFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;fileDst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                          &lt;span class="c1"&gt;// File handle&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ioStat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                          &lt;span class="c1"&gt;// Status block&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;dst_fbi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                         &lt;span class="c1"&gt;// Modified structure&lt;/span&gt;
    &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE_BASIC_INFORMATION&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;   &lt;span class="c1"&gt;// Buffer size&lt;/span&gt;
    &lt;span class="n"&gt;FileBasicInformation&lt;/span&gt;              &lt;span class="c1"&gt;// Information class&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎬 How It Works (Flow)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────┐
│ SOURCE FILE                DESTINATION FILE     │
│ (kernel32.dll)             (malware.exe)        │
└─────────────┬──────────────────────┬────────────┘
              │                      │
              ↓                      ↓
        ┌──────────────┐      ┌──────────────┐
        │ Query        │      │ Query        │
        │ Timestamps   │      │ Timestamps   │
        └──────┬───────┘      └──────┬───────┘
               │                     │
               ↓                     ↓
        ┌──────────────┐      ┌──────────────┐
        │ CreationTime │      │ CreationTime │
        │ LastAccess   │      │ LastAccess   │
        │ LastWrite    │      │ LastWrite    │
        └──────┬───────┘      └──────┬───────┘
               │                     │
               └─────────┬───────────┘
                         ↓
                   COPY TIMESTAMPS
                         ↓
                  ┌──────────────┐
                  │ SetFileInfo  │
                  │ Write Back   │
                  └──────┬───────┘
                         ↓
                    ✅ SUCCESS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📊 Real-World Lab Results
&lt;/h2&gt;

&lt;p&gt;I tested this on Windows 10/11. Here's what happens:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before Timestomping:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;C:\&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt; /tc test.txt
&lt;span class="go"&gt;07/10/2026 10:13 PM

&lt;/span&gt;&lt;span class="gp"&gt;C:\&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt; /tw test.txt
&lt;span class="go"&gt;07/10/2026 10:15 PM
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After timestomping (using kernel32.dll as source):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;C:\&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt; /tc test.txt
&lt;span class="go"&gt;04/30/2026 10:30 PM

&lt;/span&gt;&lt;span class="gp"&gt;C:\&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt; /tw test.txt
&lt;span class="go"&gt;04/30/2026 10:30 PM
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file now appears to have been created and modified in April—months ago—even though we modified it today.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚨 Why Timestomping Alone Doesn't Work
&lt;/h2&gt;

&lt;p&gt;Here's the critical part: &lt;strong&gt;timestomping is easily detected by forensic examiners.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Timestamps Can't Be Trusted Alone
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Creation Time &amp;lt; Last Write Time&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If a file's creation time is &lt;em&gt;after&lt;/em&gt; its last write time, something is wrong&lt;/li&gt;
&lt;li&gt;Legitimate behavior: Creation ≤ Last Write (always)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The NTFS USN Journal&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NTFS maintains a &lt;strong&gt;Change Journal&lt;/strong&gt; recording all file modifications&lt;/li&gt;
&lt;li&gt;This journal is harder to modify than file timestamps&lt;/li&gt;
&lt;li&gt;Forensic examiners cross-reference timestamps with USN entries&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Event Logs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows logs application behavior in &lt;code&gt;Event Viewer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A process execution is recorded regardless of file timestamps&lt;/li&gt;
&lt;li&gt;Malware execution can be tied to specific processes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Link Files &amp;amp; Prefetch&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows creates &lt;code&gt;.lnk&lt;/code&gt; files with accurate timestamps&lt;/li&gt;
&lt;li&gt;Prefetch files (&lt;code&gt;C:\Windows\Prefetch\&lt;/code&gt;) log application execution&lt;/li&gt;
&lt;li&gt;These are harder to modify than file times&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MFT Analysis&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Master File Table stores multiple timestamp variations&lt;/li&gt;
&lt;li&gt;Some entries are resistant to modification&lt;/li&gt;
&lt;li&gt;Examiners compare MFT entries with user-visible timestamps&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How Forensic Examiners Detect Timestomping
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Timeline:
├── File timestamps: April 30
├── USN Journal: July 10 ✅ MISMATCH
├── Windows Event Log: July 10 ✅ MISMATCH
├── Prefetch: July 10 ✅ MISMATCH
└── MFT Record: July 10 ✅ MISMATCH

CONCLUSION: Timestamps are forged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🛡️ Forensic Recommendations
&lt;/h2&gt;

&lt;p&gt;If you're on the &lt;strong&gt;defense side&lt;/strong&gt;, here's how to strengthen your detection:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Collect Multiple Data Sources&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   ✅ File timestamps
   ✅ USN Journal
   ✅ Windows Event Logs
   ✅ Prefetch files
   ✅ Link files
   ✅ MFT analysis
   ✅ Application logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitor File Modifications&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use File Integrity Monitoring (FIM) tools&lt;/li&gt;
&lt;li&gt;Alert on suspicious timestamp changes&lt;/li&gt;
&lt;li&gt;Correlate with process execution logs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hardening&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implement filesystem auditing&lt;/li&gt;
&lt;li&gt;Enable USN Journal on critical partitions&lt;/li&gt;
&lt;li&gt;Use WDAC (Windows Defender Application Control) to restrict executable creation&lt;/li&gt;
&lt;li&gt;Monitor &lt;code&gt;ntdll.dll&lt;/code&gt; function calls (suspicious if processes call &lt;code&gt;NtSetInformationFile&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🎓 Technical Concepts You'll Learn
&lt;/h2&gt;

&lt;p&gt;By studying this code, you'll understand:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Windows Internals&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NTFS file system structures&lt;/li&gt;
&lt;li&gt;Master File Table (MFT)&lt;/li&gt;
&lt;li&gt;File timestamps and their representations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Native APIs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How Win32 abstracts the kernel&lt;/li&gt;
&lt;li&gt;Undocumented API usage&lt;/li&gt;
&lt;li&gt;Dynamic API resolution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Forensics &amp;amp; Incident Response&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timeline reconstruction&lt;/li&gt;
&lt;li&gt;Artifact correlation&lt;/li&gt;
&lt;li&gt;Evidence integrity checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Malware Analysis&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Common evasion techniques&lt;/li&gt;
&lt;li&gt;Timestamp manipulation detection&lt;/li&gt;
&lt;li&gt;Attribution challenges&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 Resources &amp;amp; Further Reading
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Windows Internals:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/sysinternals/resources/windows-internals" rel="noopener noreferrer"&gt;Windows Internals Part 1 &amp;amp; 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://undocumented.ntinternals.net/" rel="noopener noreferrer"&gt;Undocumented Windows NT API Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Forensics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.sans.org/white-papers/" rel="noopener noreferrer"&gt;SANS: File System Forensics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.eccouncil.org/" rel="noopener noreferrer"&gt;EnCase Certification Handbook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;NTFS Deep Dive:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/windows/win32/fileio/file-systems" rel="noopener noreferrer"&gt;NTFS Documentation - Microsoft Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Master_file_table" rel="noopener noreferrer"&gt;NTFS $MFT Analysis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Malware Analysis:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://owasp.org/" rel="noopener noreferrer"&gt;OWASP: Malware Analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.virustotal.com/" rel="noopener noreferrer"&gt;VirusTotal Intelligence Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Full Repository
&lt;/h2&gt;

&lt;p&gt;Check out the complete working code:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/zainsial866/timestomper" rel="noopener noreferrer"&gt;zainsial866/timestomper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's included:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Complete C source code&lt;/li&gt;
&lt;li&gt;✅ Detailed README with examples&lt;/li&gt;
&lt;li&gt;✅ Lab notes documenting behavior&lt;/li&gt;
&lt;li&gt;✅ Header files with structure definitions&lt;/li&gt;
&lt;li&gt;✅ Compilation instructions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚖️ Legal &amp;amp; Ethical Note
&lt;/h2&gt;

&lt;p&gt;This tool is for &lt;strong&gt;educational purposes and authorized security research only&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Modifying file timestamps without authorization may violate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🛑 Computer Fraud &amp;amp; Abuse Act (CFAA)&lt;/li&gt;
&lt;li&gt;📜 Evidence tampering laws&lt;/li&gt;
&lt;li&gt;🔒 Your organization's security policy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Always get explicit authorization before testing on any system.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Conclusion
&lt;/h2&gt;

&lt;p&gt;Timestomping is a powerful technique that demonstrates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How easily file metadata can be modified&lt;/li&gt;
&lt;li&gt;Why forensic investigators use multiple data sources&lt;/li&gt;
&lt;li&gt;The importance of understanding Windows internals&lt;/li&gt;
&lt;li&gt;How attackers hide their footprints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it's also a reminder that &lt;strong&gt;no single artifact tells the whole story&lt;/strong&gt;. Modern incident response requires correlation across logs, events, and file system metadata.&lt;/p&gt;

&lt;p&gt;If you're building a SOC, hunting for threats, or just curious about Windows internals—understanding timestomping is critical.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Have thoughts on forensics, Windows internals, or cybersecurity?&lt;/strong&gt; Drop a comment below. 👇&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to see more deep dives like this?&lt;/strong&gt; Follow for more technical content on offensive security, Windows research, and malware analysis.&lt;/p&gt;




&lt;h3&gt;
  
  
  About the Author
&lt;/h3&gt;

&lt;p&gt;I'm a cybersecurity student at SS-CASE-IT focusing on offensive security, Windows internals, and tool development. I post technical content on &lt;a href="https://github.com/zainsial866" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and maintain a blog covering CTF writeups, security research, and system internals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect with me:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/zainsial866" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔗 &lt;a href="//linkedin.com/in/muhammad-zain-ul-abdin-1b4073375/"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Last updated: July 2026&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windows</category>
      <category>cybersecurity</category>
      <category>forensics</category>
      <category>nativeapi</category>
    </item>
  </channel>
</rss>
