<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>

<channel>
	<title>Forensic Computing &#187; Host forensics</title>
	<atom:link href="http://www.forensicblog.org/category/digital-forensics/host-forensics/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.forensicblog.org</link>
	<description>Digital forensics from the view of a computer scientist</description>
	<lastBuildDate>Tue, 06 Apr 2010 08:10:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc/3.0/us/</creativeCommons:license>
		<item>
		<title>Computer Forensic Exam of Najibullah Zazi&#8217;s Laptop</title>
		<link>http://www.forensicblog.org/2009/09/25/computer-forensic-exam-of-zazi-najibullahs-laptop/</link>
		<comments>http://www.forensicblog.org/2009/09/25/computer-forensic-exam-of-zazi-najibullahs-laptop/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 02:22:48 +0000</pubDate>
		<dc:creator>Mike Murr</dc:creator>
				<category><![CDATA[Digital forensics]]></category>
		<category><![CDATA[Host forensics]]></category>
		<category><![CDATA[forensic exam]]></category>
		<category><![CDATA[laptop]]></category>
		<category><![CDATA[najibullah zazi]]></category>

		<guid isPermaLink="false">http://www.forensicblog.org/?p=185</guid>
		<description><![CDATA[Earlier today, Jonathan Abolins tweeted about a US DOJ memorandum on detainee Najibullah Zazi.  The memorandum is about the motion the US government filed for a permanent order of detention for Zazi.  Part of the evidence that supports the order of detention, comes from a forensic exam of Zazi&#8217;s laptop.  I found a few pieces [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Earlier today, <span><a href="http://jabolins.livejournal.com/" target="_blank">Jonathan Abolins</a> <a href="http://twitter.com/jabolins/statuses/4375765429" target="_blank">tweeted</a> about a <a href="http://www.usdoj.gov/opa/documents/zazi-detention-memo.pdf" target="_blank">US DOJ memorandum on detainee Najibullah Zazi</a>.  The memorandum is about the motion the US government filed for a permanent order of detention for Zazi.  Part of the evidence that supports the order of detention, comes from a forensic exam of Zazi&#8217;s laptop.  I found a few pieces of evidence quite interesting from a digital forensics perspective.<br />
</span></p>
<ul>
<li><span>Zazi is associated with three separate email accounts.  The memorandum states that one account is &#8220;directly subscribed to Zazi&#8221;, and &#8220;all three accounts contain slight variations of the same password.&#8221;</span>
<ul>
<li><span>While not the best password policy, it could help with attribution.</span></li>
</ul>
</li>
<li><span>JPEG images of handwritten notes about explosives (manufacture, handling, etc.) were found as email attachments.</span>
<ul>
<li><span>Keyword searches would probably fail to find this evidence, since the notes are JPEG images.  Are there any digital forensics tools (or plugins/scripts) that support keyword searching of images? (perhaps by OCR?)</span></li>
</ul>
</li>
<li><span>Browser artifacts were uncovered that suggested Zazi searched for hydrocholoric acid.  Additionally, a site for &#8220;Lab Safety for Hydrocholoric Acid&#8221; was bookmarked with two different web browsers.</span>
<ul>
<li><span>The bookmarking could be useful in demonstrating intent, as users often bookmark sites they wish to remember, and/or return to.  The same bookmark in two different browsers makes this action less likely to be &#8220;accidental&#8221;.<br />
</span></li>
</ul>
</li>
<li><span>Some of the browser artifacts suggested that Zazi &#8220;searched a beauty salon website for hydrocide and peroxide&#8221;.  Later, surveillance videos and receipts were used to show that Zazi purchased hydrogen peroxide products from a beauty supply store.  Other persons associated with Zazi, also purchased hydrogen and acetone, from three other beauty supply stores.</span>
<ul>
<li><span>Digital evidence is just one type of evidence.  Here digital evidence (browser artifacts) is combined with physical evidence (surveillance video and receipts), to make the arguments more persuasive.</span></li>
</ul>
</li>
<li><span>After executing another search warrant (at a later date), Zazi&#8217;s laptop was seized again.  The difference is that in the latter seizure, the hard drive was not recovered (it had been removed).</span>
<ul>
<li><span>This could be considered a rudimentary form of anti-forensics.  You can&#8217;t analyze ones and zeros if they aren&#8217;t there.</span></li>
</ul>
</li>
</ul>
<p>You can view the <a href="http://docs.google.com/viewer?url=http%3A%2F%2Fwww.usdoj.gov%2Fopa%2Fdocuments%2Fzazi-detention-memo.pdf" target="_blank">memorandum here.</a></p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Computer+Forensic+Exam+of+Najibullah+Zazi%E2%80%99s+Laptop+http://bit.ly/3O69OX" title="Post to Twitter"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://www.forensicblog.org/2009/09/25/computer-forensic-exam-of-zazi-najibullahs-laptop/&amp;title=Computer+Forensic+Exam+of+Najibullah+Zazi%E2%80%99s+Laptop" title="Post to Delicious"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a class="tt" href="http://digg.com/submit?url=http://www.forensicblog.org/2009/09/25/computer-forensic-exam-of-zazi-najibullahs-laptop/&amp;title=Computer+Forensic+Exam+of+Najibullah+Zazi%E2%80%99s+Laptop" title="Post to Digg"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://www.forensicblog.org/2009/09/25/computer-forensic-exam-of-zazi-najibullahs-laptop/&amp;t=Computer+Forensic+Exam+of+Najibullah+Zazi%E2%80%99s+Laptop" title="Post to Facebook"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a class="tt" href="http://reddit.com/submit?url=http://www.forensicblog.org/2009/09/25/computer-forensic-exam-of-zazi-najibullahs-laptop/&amp;title=Computer+Forensic+Exam+of+Najibullah+Zazi%E2%80%99s+Laptop" title="Post to Reddit"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-reddit-micro3.png" alt="Post to Reddit" /></a> <a class="tt" href="http://stumbleupon.com/submit?url=http://www.forensicblog.org/2009/09/25/computer-forensic-exam-of-zazi-najibullahs-laptop/&amp;title=Computer+Forensic+Exam+of+Najibullah+Zazi%E2%80%99s+Laptop" title="Post to StumbleUpon"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-su-micro3.png" alt="Post to StumbleUpon" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.forensicblog.org/2009/09/25/computer-forensic-exam-of-zazi-najibullahs-laptop/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>The Meaning of LEAK Records</title>
		<link>http://www.forensicblog.org/2009/09/10/the-meaning-of-leak-records/</link>
		<comments>http://www.forensicblog.org/2009/09/10/the-meaning-of-leak-records/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 03:22:01 +0000</pubDate>
		<dc:creator>Mike Murr</dc:creator>
				<category><![CDATA[Digital forensics]]></category>
		<category><![CDATA[Forensic tools]]></category>
		<category><![CDATA[Host forensics]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[index.dat]]></category>
		<category><![CDATA[LEAK]]></category>
		<category><![CDATA[wininet]]></category>

		<guid isPermaLink="false">http://www.forensicblog.org/?p=104</guid>
		<description><![CDATA[I&#8217;ve been pretty quiet lately, largely due to spending time developing LibForensics.  Currently I&#8217;m adding support to read Microsoft Windows Internet cache containers (a.k.a. index.dat files).  If you&#8217;ve ever dealt with index.dat files before, you&#8217;ve probably encountered the mysterious &#8220;LEAK&#8221; record.  The purpose of this blog post is to explain one way that these records [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I&#8217;ve been pretty quiet lately, largely due to spending time developing <a title="LibForensics" href="http://code.google.com/p/libforensics/" target="_blank">LibForensics</a>.  Currently I&#8217;m adding support to read Microsoft Windows Internet cache containers (a.k.a. index.dat files).  If you&#8217;ve ever dealt with index.dat files before, you&#8217;ve probably encountered the mysterious &#8220;LEAK&#8221; record.  The purpose of this blog post is to explain one way that these records are created.</p>
<h3>Background Information</h3>
<p>In order to understand how LEAK records are created, it is useful to understand the Microsoft Windows Internet API.  <a href="http://msdn.microsoft.com/en-us/library/aa383630(VS.85).aspx" target="_blank">The Microsoft Windows Internet API (WinInet)</a> provides applications with the ability to interact with networked resources, usually over FTP and HTTP.  There are several functions in the WinInet API, including functions to provide caching.  Applications can use the WinInet API caching functions to store local (temporary) copies of files retrieved from the network.  The primary reason to use caching is to speed up future network requests, reading a local copy of a file, instead of from the network.</p>
<p>A cached file is called a &#8220;Temporary Internet File&#8221; (TIF).  The WinInet API manages TIFs using a cache container, which are files named index.dat.  There are several WinInet API functions to work with entries in cache containers, including <a href="http://msdn.microsoft.com/en-us/library/aa383968(VS.85).aspx" target="_blank">creating a URL cache entry</a>, <a href="http://msdn.microsoft.com/en-us/library/aa385354(VS.85).aspx" target="_blank">reading locally cached files</a>, and <a href="http://msdn.microsoft.com/en-us/library/aa383983(VS.85).aspx" target="_blank">deleting URL cache entries</a>.  The WinInet API also provides a cache scavenger, which periodically runs and cleans up entries that are marked for deletion.</p>
<p>The cache containers (index.dat files) are almost always associated with Microsoft Internet Explorer.  This is likely because Internet Explorer is one of the most commonly used applications that uses the WinInet API caching capabilities.  However, since the WinInet API is available to any end-user application, any application can use the caching capabilities.  This can pose an issue when attributing a specific entry in the cache container, to the program which generated the entry.</p>
<p>Internally a cache container is composed of a header, followed by one or more records.  There are several different types of records, including URL records (which describe cached URLs), and REDR records (for describing redirects).  A cached URL can have an associated TIF, which is described in the appropriate URL record.</p>
<h3>LEAK Records</h3>
<p>Now that we&#8217;ve reviewed index.dat files, we&#8217;ll see how to create LEAK records.  However<strong> </strong>before going further I want to emphasize that this is just one approach to creating LEAK records.  LEAK records may have uses outside of what is described in this post.</p>
<p><strong><em>For the impatient:</em></strong> A LEAK record can be generated by attempting to delete a URL cache entry (via DeleteUrlCacheEntry) when the associated temporary internet file (TIF) can not be deleted.</p>
<p>The last paragraph of the <a href="http://msdn.microsoft.com/en-us/library/aa383928(VS.85).aspx#scavenger" target="_blank">MSDN documentation</a> on the cache scavenger, discusses what happens when a cache entry is marked for deletion:</p>
<blockquote><p>The cache scavenger is shared  by multiple processes. When one application deletes a cache entry from its process space by calling DeleteUrlCacheEntry, it is normally deleted on the next cycle of the scavenger. However, when the item that is marked for deletion is in use by another process, the cache entry is marked for deletion by the scavenger, but not deleted until the second process releases it.</p></blockquote>
<p>To summarize, when the cache scavenger runs and it encounters an item that is marked for deletion, but the item in use by another process, then the cache entry is not actually deleted.</p>
<p>Another reference to LEAK records can be found at <a href="http://128.175.24.251/forensics/index_dat1.htm" target="_blank">Understanding index.dat Files</a>.  The author describes LEAK as a &#8220;Microsoft term for an error&#8221;.</p>
<p>Combining these two ideas (deleting a cache entry when it is in use, and LEAK as a term for error), we can come up with a theory: a LEAK record is generated when an error occurs during the deletion of a url cache entry.  If you&#8217;ve ever taken a <a href="http://www.sans.org/training/computer-forensics-investigation-and-response-98-mid" target="_blank">SANS Security 508 course</a> (Computer Forensics, Investigation, and Response) from me, you&#8217;ll probably remember my approach to examinations (and investigations in general): theory (hypothesis) and test.</p>
<p>In order to test the theory, we need to create a series of statements and associated outcomes, that would be true if our theory is correct.</p>
<p>At this stage our theory is fairly generic.  To make the theory testable, we need to make it more specific.  This means we will need to determine a series of actions that will result in the generation of a LEAK record.  The first place to look is at the MSDN documentation on the WinInet API.  To save time, rather than walking through <a href="http://msdn.microsoft.com/en-us/library/aa385473(VS.85).aspx" target="_blank">all the WinInet API functions</a>, I&#8217;ll just reference the relevant ones:</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/aa383968(VS.85).aspx" target="_blank">CreateUrlCacheEntry</a>: Create a TIF (based on a URL) for saving cached data.</li>
<li><a href="http://msdn.microsoft.com/en-us/library/aa383943(VS.85).aspx" target="_blank">CommitUrlCacheEntry</a>: Stores specified data and associates a TIF with a URL.</li>
<li><a href="http://msdn.microsoft.com/en-us/library/aa383983(VS.85).aspx" target="_blank">DeleteUrlCacheEntry</a>: Deletes a cache entry, and an associated TIF.</li>
<li><a href="http://msdn.microsoft.com/en-us/library/aa385368(VS.85).aspx" target="_blank">RetrieveUrlCacheEntryStream</a>: Returns a stream of the contents of a TIF.</li>
<li><a href="http://msdn.microsoft.com/en-us/library/aa385415(VS.85).aspx" target="_blank">UnlockUrlCacheEntryStream</a>: Closes a stream opened with RetrieveUrlCacheEntryStream</li>
</ul>
<p>Looking at this list, there are a few possible ways to generate an error while deleting a URL cache entry:</p>
<ol>
<li>Create/Commit a URL cache entry, and lock the entry using RetrieveUrlCacheEntryStream.</li>
<li>Create/Commit a URL cache entry and corresponding TIF, and open the TIF.</li>
<li>Create/Commit a URL cache entry and corresponding TIF, and make the TIF read-only.</li>
</ol>
<p>The general approach is to create (and commit) a URL cache entry, then create a condition that would make deleting the entry fail.</p>
<p>Let&#8217;s solidify these into testable theories as &#8220;if-then&#8221; statements (logical implications) with function calls:</p>
<ul>
<li><em><strong>IF</strong></em> we create a URL cache entry using CreateUrlCacheEntry and CommitUrlCacheEntry, lock the entry using RetrieveUrlCacheEntryStream, and call DeleteUrlCacheEntry
<ul>
<li><em><strong>THEN</strong></em> we will see a LEAK record.</li>
</ul>
</li>
<li><em><strong>IF</strong></em> we create a URL cache entry and corresponding TIF using CreateUrlCacheEntry and CommitUrlCacheEntry, open the TIF using open(), and call DeleteUrlCacheEntry
<ul>
<li><em><strong>THEN</strong></em> we will see a LEAK record.</li>
</ul>
</li>
<li><em><strong>IF</strong></em> we create a URL cache entry and corresponding TIF using CreateUrlCacheEntry and CommitUrlCacheEntry, make the TIF read-only using chmod, and call DeleteUrlCacheEntry
<ul>
<li><em><strong>THEN</strong></em> we will see a LEAK record.</li>
</ul>
</li>
</ul>
<h3>Theory Testing</h3>
<p>The next step is to test our theories.  It is relatively straight forward to translate the if-then statements into code.  In the &#8220;Sample Code&#8221; section I&#8217;ve included a link to a zip file that contains (amongst other things) three Python files, test_leak1.py, test_leak2.py, and test_leak3.py.  Each file implements one of the if-then statements.</p>
<p>Here is the output from running test_leak1.py (in a Windows 2003 virtual machine):</p>
<p><code>C:\Tools\Python31&gt;python z:\inet_cache\test_leak1.py<br />
Creating URL: http://rand_286715790<br />
Using file: b'C:\\Documents and Settings\\Administrator\\Local Settings\\Temporary Internet Files\\Content.IE5\\81QNCLMB\\CAUJ6C3U'<br />
Locking URL: http://rand_286715790<br />
Deleting URL: http://rand_286715790<br />
ERROR: DeleteUrlCacheEntryA failed with error 0x20: The process cannot access the file because it is being used by another process.<br />
</code></p>
<p>The output from test_leak1.py indicates that there was an error during the call to DeleteUrlCacheEntry.  After copying the associated index.dat file to a Linux system, we can find a reference to http://rand_286715790:</p>
<p><code>xxd -g 1 -u index.dat.leak1<br />
...<br />
000ef00: <span style="text-decoration: underline;"><strong>55 52 4C 20</strong></span> 02 00 00 00 00 00 00 00 00 00 00 00  <span style="text-decoration: underline;"><strong>URL </strong></span>............<br />
000ef10: 50 A1 F4 DB 08 32 CA 01 00 00 00 00 00 00 00 00  P....2..........<br />
000ef20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................<br />
000ef30: 60 00 00 00 68 00 00 00 02 00 10 10 80 00 00 00  `...h...........<br />
000ef40: 01 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00  ..@.............<br />
000ef50: 2A 3B B3 5A 02 00 00 00 01 00 00 00 2A 3B B3 5A  *;.Z........*;.Z<br />
000ef60: 00 00 00 00 EF BE AD DE 68 74 74 70 3A 2F 2F 72  ........http://r<br />
000ef70: 61 6E 64 5F 32 38 36 37 31 35 37 39 30 00 AD DE  and_286715790...<br />
000ef80: 43 41 55 4A 36 43 33 55 00 BE AD DE EF BE AD DE  CAUJ6C3U........<br />
...<br />
</code></p>
<p>The record is still marked as &#8220;URL &#8220;.  Further examination of the file shows no additional references to http://rand_286715790.  Here is the output from running test_leak2.py (in a Windows 2003 virtual machine):</p>
<p><code>C:\Tools\Python31&gt;python z:\inet_cache\test_leak2.py<br />
Creating URL: http://rand_3511348668<br />
Opening file: b'C:\\Documents and Settings\\Administrator\\Local Settings\\Temporary Internet Files\\Content.IE5\\81QNCLMB\\CAC23G8H'<br />
Deleting URL: http://rand_3511348668<br />
</code></p>
<p>There was no clear indication that an error occurred.  After copying the index.dat file to a Linux system, we can find a reference to http://rand_3511348668:</p>
<p><code>xxd -g 1 -u index.dat.leak2<br />
...<br />
000ef00: <span style="text-decoration: underline;"><strong>4C 45 41 4B</strong></span> 02 00 00 00 00 00 00 00 00 00 00 00  <span style="text-decoration: underline;"><strong>LEAK</strong></span>............<br />
000ef10: 90 70 17 74 0C 32 CA 01 00 00 00 00 00 00 00 00  .p.t.2..........<br />
000ef20: 00 04 00 00 00 00 00 00 00 00 00 00 00 E7 00 00  ................<br />
000ef30: 60 00 00 00 68 00 00 00 02 00 10 10 80 00 00 00  `...h...........<br />
000ef40: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................<br />
000ef50: 2A 3B EB 5D 01 00 00 00 00 00 00 00 2A 3B EB 5D  *;.]........*;.]<br />
000ef60: 00 00 00 00 EF BE AD DE 68 74 74 70 3A 2F 2F 72  ........http://r<br />
000ef70: 61 6E 64 5F 33 35 31 31 33 34 38 36 36 38 00 DE  and_3511348668..<br />
000ef80: 43 41 43 32 33 47 38 48 00 BE AD DE EF BE AD DE  CAC23G8H........<br />
...<br />
</code></p>
<p>This time a LEAK record was created.  Further examination of the file shows no additional references to http://rand_3511348668.  Here is the output from running test_leak3.py (in a Windows 2003 virtual machine):</p>
<p><code>C:\Tools\Python31&gt;python z:\inet_cache\test_leak3.py<br />
Creating URL: http://rand_1150829499<br />
chmod'ing file: b'C:\\Documents and Settings\\Administrator\\Local Settings\\Temporary Internet Files\\Content.IE5\\81QNCLMB\\CAKB2RNB'<br />
Deleting URL: http://rand_1150829499</code></p>
<p>Again, there was no clear indication that an error occurred.  After copying the index.dat file to a Linux system, we can find a reference to http://rand_1150829499:</p>
<p><code>xxd -g 1 -u index.dat.leak3<br />
...<br />
000ef00: <span style="text-decoration: underline;"><strong>4C 45 41 4B</strong></span> 02 00 00 00 00 00 00 00 00 00 00 00  <span style="text-decoration: underline;"><strong>LEAK</strong></span>............<br />
000ef10: 00 2B AF B5 0D 32 CA 01 00 00 00 00 00 00 00 00  .+...2..........<br />
000ef20: 00 04 00 00 00 00 00 00 00 00 00 00 00 E7 00 00  ................<br />
000ef30: 60 00 00 00 68 00 00 00 02 00 10 10 80 00 00 00  `...h...........<br />
000ef40: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................<br />
000ef50: 2A 3B 0A 5F 01 00 00 00 00 00 00 00 2A 3B 0A 5F  *;._........*;._<br />
000ef60: 00 00 00 00 EF BE AD DE 68 74 74 70 3A 2F 2F 72  ........http://r<br />
000ef70: 61 6E 64 5F 31 31 35 30 38 32 39 34 39 39 00 DE  and_1150829499..<br />
000ef80: 43 41 4B 42 32 52 4E 42 00 BE AD DE EF BE AD DE  CAKB2RNB........<br />
...<br />
</code><br />
As with test_leak2.py, a LEAK record was generated.  Further examination of the file shows no additional references to  http://rand_1150829499.</p>
<p>Given the results, we can assess the correctness of our theories.  Since test_leak1.py did not generate a LEAK record, while test_leak2.py and test_leak3.py did, we can narrow our original theory to TIFs.  Specifically that a LEAK record is generated when DeleteUrlCacheEntry is called, and the associated TIF (temporary internet file) can not be deleted.</p>
<p>It is also prudent to note that we only ran the tests once.  In all three tests it is possible that there are other (unknown) variables that we did not account for, and in the latter two tests the unknown variables just happened to work in our favor.  To strengthen the theory that LEAK records occur when a TIF can not be deleted, we could run the tests multiple times, as well as attempt other methods to make the TIF file &#8220;undeleteable&#8221;.</p>
<h3>Sample Code</h3>
<p>The file test_leak.zip contains code used to implement the testing of theories in this blog post.  The files test_leak1.py, test_leak2.py, and test_leak3.py implement the tests, while inet_cache_lib.py, groups.py, entries.py, and __init__.py are library files used by the test files.  All of the code was designed to run on Python3.1 on Windows systems, and interfaces with the Windows Internet API via the ctypes module.  The code is licensed under the GPL v3.</p>
<p>To install the sample code, unzip the file test_leak.zip to a directory of your choosing.  You can download the sample code by clicking on the link <a rel="attachment wp-att-133" href="http://www.forensicblog.org/2009/09/10/the-meaning-of-leak-records/test_leak/">test_leak.zip</a>.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=The+Meaning+of+LEAK+Records+http://bit.ly/4gMQkT" title="Post to Twitter"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://www.forensicblog.org/2009/09/10/the-meaning-of-leak-records/&amp;title=The+Meaning+of+LEAK+Records" title="Post to Delicious"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a class="tt" href="http://digg.com/submit?url=http://www.forensicblog.org/2009/09/10/the-meaning-of-leak-records/&amp;title=The+Meaning+of+LEAK+Records" title="Post to Digg"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://www.forensicblog.org/2009/09/10/the-meaning-of-leak-records/&amp;t=The+Meaning+of+LEAK+Records" title="Post to Facebook"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a class="tt" href="http://reddit.com/submit?url=http://www.forensicblog.org/2009/09/10/the-meaning-of-leak-records/&amp;title=The+Meaning+of+LEAK+Records" title="Post to Reddit"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-reddit-micro3.png" alt="Post to Reddit" /></a> <a class="tt" href="http://stumbleupon.com/submit?url=http://www.forensicblog.org/2009/09/10/the-meaning-of-leak-records/&amp;title=The+Meaning+of+LEAK+Records" title="Post to StumbleUpon"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-su-micro3.png" alt="Post to StumbleUpon" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.forensicblog.org/2009/09/10/the-meaning-of-leak-records/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc/3.0/us/</creativeCommons:license>
	</item>
		<item>
		<title>Recovering a FAT filesystem directory entry in five phases</title>
		<link>http://www.forensicblog.org/2007/05/24/recovering-a-fat-filesystem-directory-entry-in-five-phases/</link>
		<comments>http://www.forensicblog.org/2007/05/24/recovering-a-fat-filesystem-directory-entry-in-five-phases/#comments</comments>
		<pubDate>Thu, 24 May 2007 23:00:10 +0000</pubDate>
		<dc:creator>Mike Murr</dc:creator>
				<category><![CDATA[Digital forensics]]></category>
		<category><![CDATA[Forensic tools]]></category>
		<category><![CDATA[Fundamentals]]></category>
		<category><![CDATA[Host forensics]]></category>

		<guid isPermaLink="false">http://www.forensicblog.org/2007/05/24/recovering-a-fat-filesystem-directory-entry-in-five-phases/</guid>
		<description><![CDATA[This is the last in a series of posts about five phases that digital forensics tools go through to recover data structures (digital evidence) from a stream of bytes. The first post covered fundamental concepts of data structures, as well as a high level overview of the phases. The second post examined each phase in [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>This is the last in a series of posts about five phases that digital forensics tools go through to recover data structures (digital evidence) from a stream of bytes. The <a href="http://www.forensicblog.org/2007/05/05/how-forensic-tools-recover-digital-evidence-data-structures/" target="_blank">first post</a> covered fundamental concepts of data structures, as well as a high level overview of the phases. The <a href="http://www.forensicblog.org/2007/05/08/the-five-phases-of-recovering-digital-evidence/" target="_blank">second post</a> examined each phase in more depth. This post applies the five phases to recovering a directory entry from a FAT file system.</p>
<p>The directory entry we&#8217;ll be recovering is from the Honeynet Scan of the Month #24. You can download the file by <a href="http://www.honeynet.org/scans/scan24/" target="_blank">visiting the SOTM24 page</a>. The entry we&#8217;ll recover is the 3rd directory entry in the root directory (the short name entry for _IMMYJ~1.DOC, istat number 5.)</p>
<p><strong>Location </strong></p>
<p>The first step is to locate the entry. It&#8217;s at byte offset 0&#215;2640 (9792 decimal). How do we know this? Well assuming we know we want the third entry in the root directory, we can calculate the offset using values from the boot sector, as well as the fact that each directory entry is 0&#215;20 (32 decimal) bytes long (this piece of information came from the FAT file system specification.)  There is an implicit step that we skipped, recovering the boot sector (so we could use the values).  To keep this post to a (semi) reasonable length, we&#8217;ll skip this step.  It is fairly straightforward though.   The calculation to locate the third entry in the root directory of the image file is:</p>
<blockquote><p>3rd entry in root directory = (bytes per sector) * [(length of reserved area) + [(number of FATs) * (size of one FAT)]] + (offset of 3rd directory entry)</p>
<p>bytes per sector = 0&#215;200 (512 decimal)</p>
<p>length of reserved area = 1 sector</p>
<p>number of FATs = 2</p>
<p>size of one FAT = 9 sectors</p>
<p>size of one directory entry = 0&#215;20 (32 decimal) bytes</p>
<p>offset of 3rd directory entry =  size of one directory entry *2 (start at 0 since it&#8217;s an offset)</p>
<p>3rd entry in root directory = 0&#215;200 * (1 + (2 * 9))+ (0&#215;20 * 2) = 0&#215;2640 (9792 decimal)</p></blockquote>
<p>Using xxd, we can see the hex dump for the 3rd directory entry:</p>
<blockquote><p><code><font size="2">$ xxd -g 1 -u -l 0x20 -s 0x2640 image<br />
0002640: E5 49 4D 4D 59 4A 7E 31 44 4F 43 20 00 68 38 46  .IMMYJ~1DOC .h8F<br />
0002650: 2B 2D 2B 2D 00 00 4F 75 8F 2C 02 00 00 50 00 00  +-+-..Ou.,...P..</font></code></p></blockquote>
<p><strong>Extraction</strong></p>
<p>Continuing to the extraction phase, we need to extract each field. For a short name directory entry, there are roughly 12 fields (depending on whether you consider the first character of the file name as it&#8217;s own field.) The multibyte fields are stored in little endian, so we&#8217;ll need to reverse the bytes that we see in the output from xxd.</p>
<p>To start, the first field we&#8217;ll consider is the name of the file. This starts at offset 0 (relative to the start of the data structure) and is 11 bytes long. It&#8217;s the ASCII representation of the name. <code><font size="2"><br />
</font></code></p>
<blockquote><p><code><font size="2"> 0002640: <u>E5 49 4D 4D 59 4A 7E 31 44 4F 43</u> 20 00 68 38 46  .IMMYJ~1DOC .h8F</font></code><br />
<code><font size="2"> 0002650: 2B 2D 2B 2D 00 00 4F 75 8F 2C 02 00 00 50 00 00  +-+-..Ou.,...P..</font></code><br />
File name = _IMMYJ~1.DOC (_ represents the byte 0xE5)</p></blockquote>
<p>The next field is the attributes field, which is at offset 12 and 1 byte long. It&#8217;s an integer and a bit field, so we&#8217;ll examine it further in the decoding phase.</p>
<blockquote><p><code><font size="2">0002640: E5 49 4D 4D 59 4A 7E 31 44 4F 43 <u>20</u> 00 68 38 46  .IMMYJ~1DOC .h8F</font></code><br />
<code><font size="2"> 0002650: 2B 2D 2B 2D 00 00 4F 75 8F 2C 02 00 00 50 00 00  +-+-..Ou.,...P..</font></code><br />
Attributes = 0&#215;20</p></blockquote>
<p>Continuing in this manner, we can extract the rest of the fields:</p>
<blockquote><p><code><font size="2">0002640: E5 49 4D 4D 59 4A 7E 31 44 4F 43 20 <u>00</u> 68 38 46  .IMMYJ~1DOC .h8F</font></code><br />
<code><font size="2"> 0002650: 2B 2D 2B 2D 00 00 4F 75 8F 2C 02 00 00 50 00 00  +-+-..Ou.,...P..</font></code><br />
Reserved = 0&#215;00</p></blockquote>
<blockquote><p><code><font size="2">0002640: E5 49 4D 4D 59 4A 7E 31 44 4F 43 20 00 <u>68</u> 38 46  .IMMYJ~1DOC .h8F</font></code><br />
<code><font size="2"> 0002650: 2B 2D 2B 2D 00 00 4F 75 8F 2C 02 00 00 50 00 00  +-+-..Ou.,...P..</font></code><br />
Creation time (hundredths of a second) = 0&#215;68</p></blockquote>
<blockquote><p><code><font size="2">0002640: E5 49 4D 4D 59 4A 7E 31 44 4F 43 20 00 68 <u>38 46</u>  .IMMYJ~1DOC .h8F</font></code><br />
<code><font size="2"> 0002650: 2B 2D 2B 2D 00 00 4F 75 8F 2C 02 00 00 50 00 00  +-+-..Ou.,...P..</font></code><br />
Creation time = 0&#215;4638</p></blockquote>
<blockquote><p>  <code><font size="2">0002640: E5 49 4D 4D 59 4A 7E 31 44 4F 43 20 00 68 38 46  .IMMYJ~1DOC .h8F</font></code><br />
<code><font size="2"> 0002650: <u>2B 2D</u> 2B 2D 00 00 4F 75 8F 2C 02 00 00 50 00 00  +-+-..Ou.,...P..</font></code><br />
Creation date = 0x2D2B</p></blockquote>
<blockquote><p><code><font size="2">0002640: E5 49 4D 4D 59 4A 7E 31 44 4F 43 20 00 68 38 46  .IMMYJ~1DOC .h8F</font></code><br />
<code><font size="2"> 0002650: 2B 2D <u>2B 2D</u> 00 00 4F 75 8F 2C 02 00 00 50 00 00  +-+-..Ou.,...P..</font></code><br />
Access date = 0x2D2B</p></blockquote>
<blockquote><p><code><font size="2">0002640: E5 49 4D 4D 59 4A 7E 31 44 4F 43 20 00 68 38 46  .IMMYJ~1DOC .h8F</font></code><br />
<code><font size="2"> 0002650: 2B 2D 2B 2D <u>00 00</u> 4F 75 8F 2C 02 00 00 50 00 00  +-+-..Ou.,...P..</font></code><br />
High word of first cluster = 0&#215;0000</p></blockquote>
<blockquote><p><code><font size="2">0002640: E5 49 4D 4D 59 4A 7E 31 44 4F 43 20 00 68 38 46  .IMMYJ~1DOC .h8F</font></code><br />
<code><font size="2"> 0002650: 2B 2D 2B 2D 00 00 <u>4F 75</u> 8F 2C 02 00 00 50 00 00  +-+-..Ou.,...P..</font></code><br />
Modification time = 0x754F</p></blockquote>
<blockquote><p><code><font size="2">0002640: E5 49 4D 4D 59 4A 7E 31 44 4F 43 20 00 68 38 46  .IMMYJ~1DOC .h8F</font></code><br />
<code><font size="2"> 0002650: 2B 2D 2B 2D 00 00 4F 75 <u>8F 2C</u> 02 00 00 50 00 00  +-+-..Ou.,...P..</font></code><br />
Modification date = 0x2C8F</p></blockquote>
<blockquote><p><code><font size="2">0002640: E5 49 4D 4D 59 4A 7E 31 44 4F 43 20 00 68 38 46  .IMMYJ~1DOC .h8F</font></code><br />
<code><font size="2"> 0002650: 2B 2D 2B 2D 00 00 4F 75 8F 2C <u>02 00</u> 00 50 00 00  +-+-..Ou.,...P..</font></code><br />
Low word of first cluster = 0&#215;0002</p></blockquote>
<blockquote><p><code><font size="2">0002640: E5 49 4D 4D 59 4A 7E 31 44 4F 43 20 00 68 38 46  .IMMYJ~1DOC .h8F</font></code><br />
<code><font size="2"> 0002650: 2B 2D 2B 2D 00 00 4F 75 8F 2C 02 00 <u>00 50 00 00</u>  +-+-..Ou.,...P..</font></code><br />
Size of file = 0&#215;00005000 (bytes)</p></blockquote>
<p><strong>Decoding</strong></p>
<p>With the various fields extracted, we can decode the various bit-fields. Specifically the attributes, dates, and times fields. The attributes field is a single byte, with the following bits used to represent the various attributes:</p>
<ul>
<li>Bit 0: Read only</li>
<li>Bit 1: Hidden</li>
<li>Bit 2: System</li>
<li>Bit 3: Volume label</li>
<li>Bit 4: Directory</li>
<li>Bit 5: Archive</li>
<li>Bits 6 and 7: Unused</li>
<li>Bits 0, 1, 2, 3: Long name</li>
</ul>
<p>When decoding the fields in a FAT file system, the right most bit is considered bit 0. To specify a long name entry, bits 0, 1, 2, and 3 would be set. The value we extracted from the example was 0&#215;20 or 0010 0000 in binary. The bit at offset 5 (starting from the right) is set, and represents the &#8220;Archive&#8221; attribute.</p>
<p>Date fields for a FAT directory entry are encoded in two byte values, and groups of bits are used to represent the various sub-fields. The layout for all date fields (modification, access, and creation) is:</p>
<ul>
<li>Bits 0-4: Day</li>
<li>Bits 5-8: Month</li>
<li>Bits 9-15: Year</li>
</ul>
<p>Using this knowledge, we can decode the creation date. The value we extracted was 0x2D2B which is 0010 1101 0010 1011 in binary. The day, month, and year fields are thus decoded as:</p>
<blockquote><p><code><font size="2">0010 1101 001<u>0 1011</u></font></code><br />
Creation day: 01011 binary = 0xB = 11 decimal</p>
<p><code><font size="2">0010 110<u>1 001</u>0 1011</font></code><br />
Creation month: 1001 binary = 0&#215;9 = 9 decimal</p>
<p><code><font size="2"><u>0010 110</u>1 0010 1011</font></code><br />
Creation year: 0010110 binary = 0&#215;16 = 22 decimal</p></blockquote>
<p>A similar process can be applied to the access and modification dates. The value we extracted for the access date was also 0x2D2B, and consequently the access day, month, and year values are identical to the respective fields for the creation date. The value we extracted for the modification date was 0x2C8F (0010 1100 1000 1111 in binary). The decoded day, month, and year fields are:</p>
<blockquote><p><code><font size="2">0010 1100 100<u>0 1111</u></font></code><br />
Modification day: 01111 binary = 0xF = 15 decimal</p>
<p><code><font size="2">0010 110<u>0 100</u>0 1111</font></code><br />
Modification month: 0100 binary = 0&#215;4 = 4 decimal</p>
<p><code><font size="2"><u>0010 110</u>0 1000 1111</font></code><br />
Modification year: 0010110 binary = 0&#215;16 = 22 decimal</p></blockquote>
<p>You might have noticed the year values seem somewhat small (i.e. 22). This is because the value for the year field is an offset starting from the year 1980. This means that in order to properly interpret the year field, the value 1980 (0x7BC) needs to be added to the value of the year field. This is done during the next phase (interpretation).</p>
<p>The time fields in a directory entry, similar to the date fields, are encoded in two byte values, with groups of bits used to represent the various sub-fields. The layout to decode a time field is:</p>
<ul>
<li>Bits 0-4: Seconds</li>
<li>Bits 5-10: Minutes</li>
<li>Bits 11-15: Hours</li>
</ul>
<p>Recall that we extracted the value 0&#215;4638 (0100 0110 0011 1000 in binary) for the creation time. Thus the decoded seconds, minutes, and hours fields are:</p>
<blockquote><p><code><font size="2">0100 0110 001<u>1 1000</u></font></code><br />
Creation seconds = 11000 binary = 0&#215;18 = 24 decimal</p>
<p><code><font size="2">0100 0<u>110 001</u>1 1000</font></code><br />
Creation minutes = 110001 binary = 0&#215;31 = 49 decimal</p>
<p><code><font size="2"><u>0100 0</u>110 0011 1000</font></code><br />
Creation hours = 01000 binary = 0&#215;8 = 8 decimal</p></blockquote>
<p>The last value we need to decode is the modification time. The bit-field layout is the same for the creation time. The value we extracted for the modification time was 0x754F (0111 0101 0100 1111 in binary). The decoded seconds, minutes, and hours fields for the modification time are:</p>
<blockquote><p><code><font size="2">0111 0101 010<u>0 1111</u></font></code><br />
Modification seconds = 01111 binary = 0xF = 15 decimal</p>
<p><code><font size="2">0111 0<u>101 010</u>0 1111</font></code><br />
Modification minutes = 101010 binary = 0x2A = 42 decimal</p>
<p><code><font size="2"><u>0111 0</u>101 0100 1111</font></code><br />
Modification hours = 01110 binary = 0xE = 14 decimal</p></blockquote>
<p><strong>Interpretation </strong></p>
<p>Now that we&#8217;ve finished extracting and decoding the various fields, we can move into the interpretation phase. The values for the years and seconds fields need to be interpreted. The value of the years field is the offset from 1980 (0x7BC) and the seconds field is the number of seconds divided by two. Consequently, we&#8217;ll need to add 0x7BC to each year field and multiply each second field by two. The newly calculated years and seconds fields are:</p>
<blockquote>
<ul>
<li>Creation year = 22 + 1980 = 2002</li>
<li>Access year = 22 + 1980 = 2002</li>
<li>Modification year = 22 + 1980 = 2002</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>Creation seconds = 24 * 2 = 48</li>
<li>Modification seconds = 15 * 2 = 30</li>
</ul>
</blockquote>
<p>We also need to calculate the first cluster of the file, which simply requires concatenating the high and the low words. Since the high word is 0&#215;0000, the value for the first cluster of the file is the value of the low word (0&#215;0002).</p>
<p>In the next phase (reconstruction) we&#8217;ll use Python, so there are a few additional values that are useful to calculate. The first order of business is to account for the hundredths of a second associated with the seconds field for creation time. The value we extracted for the hundredths of a second for creation time was 0&#215;68 (104 decimal). Since this value is greater than 100 we can add 1 to the seconds field of creation time. Our new creation seconds field is:</p>
<blockquote>
<ul>
<li>Creation seconds = 48 + 1 = 49</li>
</ul>
</blockquote>
<p>This still leaves four hundredths of a second left over.  Since we&#8217;ll be reconstructing this in Python, we&#8217;ll use the Python <a href="http://docs.python.org/lib/datetime-time.html" target="_blank">time</a> class which accepts values for hours, minutes, seconds, and microseconds. To convert the remaining four hundredths of a second to microseconds multiply by 10000. The value for creation microseconds is:</p>
<blockquote>
<ul>
<li>Creation microseconds = 4 * 10000 = 40000</li>
</ul>
</blockquote>
<p>The other calculation is to convert the attributes field into a string. This is purely arbitrary, and is being done for display purposes. So our new attributes value is:</p>
<blockquote>
<ul>
<li>Attributes = &#8220;Archive&#8221;</li>
</ul>
</blockquote>
<p><strong>Reconstruction</strong></p>
<p>This is the final phase of recovering our directory entry. To keep things simple, we&#8217;ll reconstruct the data structure as a Python <a href="http://docs.python.org/lib/typesmapping.html" target="_blank">dictionary</a>. Most applications would likely use a Python object, and doing so is a fairly straight forward translation. Here is a snippet of Python code to create a dictionary with the extracted, decoded, and interpreted values (don&#8217;t type the &gt;&gt;&gt; or &#8230;):<br />
<code><font size="2"><br />
$ python<br />
&gt;&gt;&gt; from datetime import date, time<br />
&gt;&gt;&gt; dirEntry = dict()<br />
&gt;&gt;&gt; dirEntry["File Name"] = "\xE5IMMYJ~1DOC"<br />
&gt;&gt;&gt; dirEntry["Attributes"] = "Archive"<br />
&gt;&gt;&gt; dirEntry["Reserved Byte"] = 0x00<br />
&gt;&gt;&gt; dirEntry["Creation Time"] = time(8, 49, 49, 40000)<br />
&gt;&gt;&gt; dirEntry["Creation Date"] = date(2002, 9, 11)<br />
&gt;&gt;&gt; dirEntry["Access Date"] = date(2002, 9, 11)<br />
&gt;&gt;&gt; dirEntry["First Cluster"] = 2<br />
&gt;&gt;&gt; dirEntry["Modification Time"] = time(14, 42, 30)<br />
&gt;&gt;&gt; dirEntry["Modification Date"] = date(2002, 4, 15)<br />
&gt;&gt;&gt; dirEntry["size"] = 0x5000<br />
&gt;&gt;&gt;</font></code></p>
<p>If you wanted to print out the values in a (semi) formatted fashion you could use the following Python code:<br />
<code><font size="2"><br />
&gt;&gt;&gt; for key in dirEntry.keys():<br />
...     print "%s == %s" % (key, str(dirEntry[key]))<br />
...<br />
</font></code><font size="2"><br />
And you would get the following output<br />
<code><br />
Modification Date == 2002-04-15<br />
Creation Date == 2002-09-11<br />
First Cluster == 2<br />
File Name == ?IMMYJ~1DOC<br />
Creation Time == 08:49:49.040000<br />
Access Date == 2002-09-11<br />
Reserved Byte == 0<br />
Modification Time == 14:42:30<br />
Attributes == Archive<br />
size == 20480<br />
&gt;&gt;&gt;<br />
</code></font></p>
<p>At this point, there are a few additional fields that could have been calculated. For instance, the file name could have been broken into the respective 8.3 (base and extension) components. It might also be useful to calculate the allocation status of the associated file (in this case it would be unallocated). These are left as exercises for the reader <img src='http://www.forensicblog.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>This concludes the 3-post series on recovering data structures from a stream of bytes. Hopefully the example helped clarify the roles and activities of each of the five phases. Realize that the five phases aren&#8217;t specific to recovering file system data structures, they apply to network traffic, code, file formats, etc.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Recovering+a+FAT+filesystem+directory+entry+in+five+phases+http://bit.ly/1meJ4r" title="Post to Twitter"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://www.forensicblog.org/2007/05/24/recovering-a-fat-filesystem-directory-entry-in-five-phases/&amp;title=Recovering+a+FAT+filesystem+directory+entry+in+five+phases" title="Post to Delicious"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-delicious-micro3.png" alt="Post to Delicious" /></a> <a class="tt" href="http://digg.com/submit?url=http://www.forensicblog.org/2007/05/24/recovering-a-fat-filesystem-directory-entry-in-five-phases/&amp;title=Recovering+a+FAT+filesystem+directory+entry+in+five+phases" title="Post to Digg"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://www.forensicblog.org/2007/05/24/recovering-a-fat-filesystem-directory-entry-in-five-phases/&amp;t=Recovering+a+FAT+filesystem+directory+entry+in+five+phases" title="Post to Facebook"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a class="tt" href="http://reddit.com/submit?url=http://www.forensicblog.org/2007/05/24/recovering-a-fat-filesystem-directory-entry-in-five-phases/&amp;title=Recovering+a+FAT+filesystem+directory+entry+in+five+phases" title="Post to Reddit"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-reddit-micro3.png" alt="Post to Reddit" /></a> <a class="tt" href="http://stumbleupon.com/submit?url=http://www.forensicblog.org/2007/05/24/recovering-a-fat-filesystem-directory-entry-in-five-phases/&amp;title=Recovering+a+FAT+filesystem+directory+entry+in+five+phases" title="Post to StumbleUpon"><img class="nothumb" src="http://www.forensicblog.org/wp-content/plugins/tweet-this/icons/tt-su-micro3.png" alt="Post to StumbleUpon" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.forensicblog.org/2007/05/24/recovering-a-fat-filesystem-directory-entry-in-five-phases/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc/3.0/us/</creativeCommons:license>
	</item>
	</channel>
</rss>
