<?xml version="1.0" encoding="ISO-8859-15"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
   <channel>
      <title>for(ensik){blog;}</title>
      <link>http://computer.forensikblog.de/</link>
      <description>Notizen zur Computer-Forensik</description>
      <language>de</language>
      <copyright>Copyright 2010 Andreas Schuster. Alle Rechte vorbehalten.</copyright>
      <lastBuildDate>Thu, 11 Mar 2010 10:00:00 +0100</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/?v=3.2</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

            <item>
         <title>Null ist nicht immer 0</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2010 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>Die Trennung von Struktur und Inhalt ist zusammen mit dem <a href="/2007/08/substitution.html">Substitutions-Mechanismus</a> eines der grundlegenden Konzepte des Ereignisprotokolls. In die Beschreibung der XML-Struktur sind Platzhalter eingebettet, die mit Werten aus dem SubstitutionArray, einer Tabelle am Ende des jeweiligen Protokolleintrags, gefüllt werden. Wann immer ein Eintrag in dieser Tabelle dem "Wert" NullType enthält, wird in der XML-Struktur der zugehörige Platzhalter mitsamt des ihn umgebenden XML-Elements unterdrückt. Die mit NullTypes gefüllten Einträge der Tabelle enthalten sonst keine weiteren Daten. Jedenfalls nahm ich das an, bis ich mich kürzlich überraschen lassen musste.</p>]]>
            <![CDATA[<p>Die folgende Abbildung zeigt einen Ausschnitt aus einem typischen SubstitutionArray. Die Daten wurden zur besseren Lesbarkeit mit dem <a href="/2007/08/evtx_substarray_template.html">Template</a> für den 010 Editor interpretiert.</p>

<p><img alt="Common substitution array with an empty slot." src="/media/evtx-arr-nullisnotnull1.jpg" width="346" height="128" /></p>

<p>In diesem Beispiel enthält der obere Eintrag 12 Bytes an Daten, die entsprechend dem Inhalt des Feldes "Type" als Security Identifier (SID) interpretiert werden sollen. Der nachfolgende Eintrag, Nr. 13, soll hingegen als NullType interpretiert werden. Dieser Eintrag enthält auch keine weiteren Daten.</p>

<p>Genau das habe ich in unzähligen Protokolleinträgen gesehen. Eines Tages aber schickte mir Roberto De Vivo eine Protokolldatei, die meinen Parser abstürzen ließ. Mehrere SubstitutionArrays in seiner Datei sahen in etwa so aus, wie es die folgende Abbildung zeigt:</p>

<p><img alt="Dieser NullType enthält Daten." src="/media/evtx-arr-nullisnotnull2.jpg" width="346" height="113" /></p>

<p>Die Länge ist eindeutig von 0 verschieden und der Tabelleneintrag enthält Daten. Ich konnte in der Datei weitere NullType-Objekte finden; manche von ihnen enthalten bis zu16 Bytes an Daten.</p>

<p>Zunächst vermutete ich, dass ich ein grundlegend falsches Verständnis des NullType-Objektes entwickelt hatte. Also wandelte ich mit Microsofts eigener Ereignisprotokollanzeige die betreffenden Datensätzte in XML um. In diesem Klartext konnte ich die fraglichen Daten jedoch nicht finden.</p>

<p>Weitere Untersuchungen sind notwendig, um die Ursache für diese Daten zu finden, und ob sie in einer forensischen Analyse von Wert sind.</p>]]>
         </description>
         <link>http://computer.forensikblog.de/2010/03/null_ist_nicht_immer_0.html</link>
         <guid>http://computer.forensikblog.de/2010/03/null_ist_nicht_immer_0.html</guid>
         <category>Vista Eventlog</category>
         <pubDate>Thu, 11 Mar 2010 10:00:00 +0100</pubDate>
      </item>
            <item>
         <title>Workshop zur RAM-Forensik</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2010 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>Erstmals wird es jetzt den Workshop zur forensische Analyse von Arbeitsspeicherinhalten auch in deutscher Sprache geben: Am 22. und 23. April 2010 werde ich den Kurs bei <a href="http://www.securityresearch.at/">Security Research</a> in Wien abhalten.</p>]]>
            <![CDATA[<p>Nach einer Einführung in die technischen Grundlagen des RAM und der Intel x86-Architektur wird es an den zwei Tagen wird es reichlich Gelegenheit geben, Speicherabbilder selbst zu analysieren. Als Hilfsmittel dazu dienen vor allem der Microsoft Debugger und das bekannte Volatility, das jeder Teilnehmer als speziell angepasste Version in einer virtuellen Maschine erhält.</p>

<p>Weitere Informationen gibt es in der <a href="http://www.securityresearch.at/wp-content/uploads/2010/02/kursbeschreibung_forensik_schuster.pdf">Kursbeschreibung</a> des Veranstalters Security Research.</p>]]>
         </description>
         <link>http://computer.forensikblog.de/2010/03/training_zur_speicherforensik.html</link>
         <guid>http://computer.forensikblog.de/2010/03/training_zur_speicherforensik.html</guid>
         <category>Speicheranalyse</category>
         <pubDate>Tue, 02 Mar 2010 10:00:00 +0100</pubDate>
      </item>
            <item>
         <title>Fernstudiengang Digitale Forensik</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2010 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>Die FH Albstadt-Sigmaringen richtet zum kommenden Wintersemester einen Master-Studiengang "Digitale Forensik" ein. Von einigen Präsenzphasen abgesehen, werden Vorlesungen und Übungen online abgehalten werden. Bewerbungen bei der FH Albstandt-Sigmaringen sind ab sofort und bis zum 15. Juli 2010 möglich.</p>]]>
            <![CDATA[<p>Immer wieder werde ich gefragt, wie man eigentlich IT-Forensiker werden kann. Die Antwort hängt natürlich von der Biographie und Persönlichkeit des Fragestellers ab. Eine Möglichkeit ist ein (Aufbau-) Studium. Entsprechende Angebote gibt es zum Beispiel am University College in Dublin und zahlreichen Universitäten in den USA.</p>

<p>Vielen Interessenten sind dann letztlich die Hürden dieser Angebote zu hoch: Vereinbarkeit mit der familiären und beruflichen Situation, Kosten, aktive Fremdsprachenkenntnisse... Das neue Angebot an der FH Albstadt-Sigmaringen mit seiner deutlich niedrigeren Einstiegsschwelle ist hier sicherlich eine interessante Alternative.</p>

<p>Der Master versteht sich als Aufbaustudium, ein erster berufsbefähigender Abschluss an einer wissenschaftlichen Hochschule, Fachhochschule, Berufsakademie oder ein vergleichbarer Abschluss an einer ausländischen Bildungseinrichtung ist also erforderlich. Bewerber auf einen der 30 Studienplätze müssen darüber hinaus mindestens ein Jahr Praxiserfahrung in einem einschlägigen Beruf nachweisen, zum Beispiel als Administrator oder in der IT-Sicherheit.</p>

<p>Wer über keinen Hochschulabschluss verfügt, soll trotzdem einzelne Module aus dem Studiengang belegen können. Ein Abschluss mit dem Master ist dann aber natürlich nicht möglich.</p>

<p>Das Studium findet überwiegend online statt. Präsenzveranstaltungen sollen vorwiegend an Wochenenden und an den kooperierenden Hochschulen, der FH Albstadt-Sigmaringen und den Universitäten Mannheim und Tübingen abgehalten werden. Das Angebot ist damit auch für Interessenten aus Österreich und der Schweiz attraktiv.</p>

<p>Die Unterrichtssprache ist Deutsch. Man wird aber sicherlich nicht umhin kommen, Fachtexte in englischer Sprache zu lesen. Wer seinen Bekanntheitsgrad steigern möchte, wird wahrscheinlich auch seine Master-Thesis in Englisch schreiben.</p>

<p>Das Studium besteht aus 17 Modulen, wobei je Semester drei Module angeboten werden sollen. Die Regelstudienzeit liegt also bei 6 Semestern. Das Studium kostet ca. 15.000 EUR. Vorkenntnisse können angerechnet werden und reduzieren Studiendauer und -Kosten.</p>

<p>Für weitere Auskünfte steht die Studienberatung unter digitale-forensik [at] hs-albsig [punkt] de oder Telefon +49 (0) 7571-732 94 40 zur Verfügung. Weitere Informationen sollen in Kürze auch unter <a href="http://www.digitaleforensik.com">www.digitaleforensik.com</a> veröffentlicht werden. </p>

<p>Eine Aufnahme des Studiums ist jeweils zum Wintersemester möglich. Bewerbungen sind bis zum 15. Juli an die <a href="http://www.fh-albsig.de/">FH Albstadt-Sigmaringen</a> zu richten.</p>]]>
         </description>
         <link>http://computer.forensikblog.de/2010/03/fernstudiengang_master_digitale_forensik.html</link>
         <guid>http://computer.forensikblog.de/2010/03/fernstudiengang_master_digitale_forensik.html</guid>
         <category>Randnotizen</category>
         <pubDate>Mon, 01 Mar 2010 10:00:00 +0100</pubDate>
      </item>
            <item>
         <title>Evtx Parser Version 1.0.3</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2010 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>Ab sofort steht die Version 1.0.3 des Parsers für Ereignisprotokolle von Vista und Windows 2008 <a href="/files/evtx/EvtxParser-current.zip">zum Download</a> bereit. Die neue Version behebt einige Fehler und enthält auch kleinere Neuerungen.</p>]]>
            <![CDATA[<p><a href="/2007/07/evtx_dateiheader.html">Datei-</a> und <a href="/2007/07/evtx_blockheader.html">Block-Header</a> sind mit einer CRC32-Prüfsumme vor versehentlichen Änderungen geschützt. Die Bibliothek kann nun diese Prüfsummen auswerten; das Beispielprogramm <tt>evtxinfo.pl</tt> prüft mit ihrer Hilfe die Datei und die einzelnen Blöcke.</p>

<p>Hexadezimalzahlen werden jetzt in Großbuchstaben ausgegeben und entsprechen insofern der Darstellung im Microsoft Event Viewer. Auch die Ausgabe der GUIDs habe ich angepasst.</p>

<p>Das Modul für den Type0x12 musste ich leider entfernen, da mir bislang nicht ausreichend Testdaten zur Überprüfung seiner korrekten Funktion zur Verfügung stehen.</p>

<p>Neu enthalten ist die Datei <tt>evtxsort.xsl</tt>, mit deren Hilfe sich <a href="/2010/02/event_records_sortieren.html">Protokolldateien im XML-Format sortieren und normalisieren</a> lassen.</p>

<p>Bereits in der Version 1.0.2 gab es folgende Änderungen (aber keine Ankündigung im deutschsprachigen Blog):</p>

<p>XML-Sonderzeichen werden nun richtig codiert. Dieser Fehler wurde von Kristinn Gudjonsson gemeldet.</p>

<p>NullType-Objekte können Daten enthalten. Roberto De Vivo hat mir eine Datei überlassen, aus der dieses seltsame Verhalten klar hervorgeht.</p>

<p>An der Programmarchitektur gab es einige Änderungen in der Behandlung der schließenden Tags von XML-Elementen. Von Bedeutung sind diese Änderungen allerdings nur für Programmierer, die auf der Bibliothek aufsetzen.</p>]]>
         </description>
         <link>http://computer.forensikblog.de/2010/02/evtx_parser_1_0_3.html</link>
         <guid>http://computer.forensikblog.de/2010/02/evtx_parser_1_0_3.html</guid>
         <category>Vista Eventlog</category>
         <pubDate>Thu, 25 Feb 2010 10:00:00 +0100</pubDate>
      </item>
            <item>
         <title>Test von Löschwerkzeugen</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2010 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>Das US NIST hat Hard- und Software zum Löschen von Festplatten getestet. Verwendet werden diese Löschwerkzeuge zum Beispiel dann, wenn ein während der Fallbearbeitung genutzter Datenträger nicht mehr länger benötigt wird. Das sichere Löschen der Daten soll einerseits verhindern, dass schutzwürdige Informationen unbeabsichtigt verbreitet werden. </p>

<p>Ausserdem müssen Daten, die zu unterschiedlichen Fällen gehören, sauber getrennt werden. Dies ist einfach zu erreichen, indem man für jeden Fall einen eigenen, "sterilen", Datenträger verwendet.</p>]]>
            <![CDATA[<p>Das NIST hat nun Kopier- beziehungsweise Löschgeräte und eine bekannte Boot-CD getestet.</p>

<p><a href="http://www.wiebetech.com/products/Drive_eRazer.php">WiebeTech Drive eRazer DRZR-2-VBND und Drive eRazer PRO</a> löschen beide wie erwartet die sichtbaren Sektoren. Sektoren innerhalb der Host Protected Area (HPA) oder des Device Configuration Overlays (DCO) werden jedoch nicht immer gelöscht. Einzelheiten hierzu enthält der Testbericht. (<a href="http://www.ncjrs.gov/pdffiles1/nij/228228.pdf">PDF</a>)</p>

<p><a href="http://www.voomtech.com/hc2.html">Voom HardCopy II</a> unterstützt nicht das ATA SECURE WRITE Kommando. Die Testmedien wurden vollständig gelöscht. (<a href="http://www.ncjrs.gov/pdffiles1/nij/228980.pdf">PDF</a>)</p>

<p>Die populäre Boot-CD <a href="http://www.dban.org/">Darik's Boot and Nuke 1.0.7</a> unterstützt ebenfalls nicht das SECURE WRITE Kommando, sondern überschreibt Sektoren per WRITE. Laut Untersuchungsbericht ist durch den Hersteller dokumentiert, dass hierbei HPA und DCO nicht angetastet werden; die entsprechenden Tests unterblieben deshalb. (<a href="http://www.ncjrs.gov/pdffiles1/nij/228983.pdf">PDF</a>)</p>]]>
         </description>
         <link>http://computer.forensikblog.de/2010/02/nist_testet_loeschwerkzeuge.html</link>
         <guid>http://computer.forensikblog.de/2010/02/nist_testet_loeschwerkzeuge.html</guid>
         <category>Blog</category>
         <pubDate>Tue, 23 Feb 2010 10:00:00 +0100</pubDate>
      </item>
            <item>
         <title>010 Editor Version 3.1.0</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2010 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>Der <a href="http://www.sweetscape.com/010editor/">010 Editor</a>, ein <a href="http://de.wikipedia.org/wiki/Hex-Editor">Hex-Editor</a> ist für mich zu einem unverzichtbaren Werkzeug für der Untersuchung von Dateien geworden. Jetzt haben die Autoren die Version 3.1 veröffentlicht, die eine <a href="http://www.sweetscape.com/010editor/release_notes.html">Vielzahl neuer Funktionen</a> enthält.</p>]]>
            <![CDATA[<p>Auf zwei Neuerungen möchte ich besonders hinweisen, da sie meine Wunschliste anführten:</p>

<p>Der Editor unterstützt jetzt nativ UNICODE Strings (<tt>wstring</tt> bzw. <tt>wchar</tt>). Damit entfallen in meinen Template zahlreiche unelegante Workarounds.</p>

<p>Der Preprocessor funktioniert jetzt so, wie man es von der Programmiersprache C her kennt. Allerdings erfordert <tt>#include</tt> jetzt, dass das Argument in spitze Klammern oder Anführungszeichen eingeschlossen sein muss. Das ist noch nicht in allen meinen Templates der Fall, kann aber bei Bedarf schnell ausgebessert werden.</p>

<p>Das <a href="http://www.sweetscape.com/download/010EditorInstaller.exe">Update auf Version 3.1</a> ist bei Sweetscape erhältlich.</p>]]>
         </description>
         <link>http://computer.forensikblog.de/2010/02/010_editor_3_1_0.html</link>
         <guid>http://computer.forensikblog.de/2010/02/010_editor_3_1_0.html</guid>
         <category>Labor</category>
         <pubDate>Mon, 22 Feb 2010 10:00:00 +0100</pubDate>
      </item>
            <item>
         <title>Protokolleinträge sortieren</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2010 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>Mit der Zeit musste ich leider feststellen, dass unterschiedliche Programme die einzelnen Ereignisse in einer Protokolldatei in unterschiedlicher Reihenfolge ausgeben. Die Ereignisanzeige in Microsoft Vista und Windows 2008 zum Beispiel sortiert beim Exportieren die Ereignisse in absteigender Reihenfolge von der höchsten zur niedrigsten EventRecordID. Mein eigenes Programm hingegen gibt die Ereignisse in der Reihenfolge wieder, wie es sie in der Datei findet. In den meisten Fällen wird dies in aufsteigender Reihenfolge von der niedrigsten zur höchsten EventRecordID sein. Allerdings lassen sich Protokolle auch in ihrer Größe beschränken; der älteste Teil wird dann bei Bedarf überschrieben. Die niedrigste EventRecordID findet man in diesem Fall mitten in der Datei. Wäre es nicht schön, wenn man diese Dateien einfach sortieren könnte?</p>]]>
            <![CDATA[<p>Glücklicherweise ist die Protokolldatei bereits im XML Format. Es sollte also einfach sein, die einzelnen Einträge mit einer XML Transformation zu sortieren. Ein <a href="http://www.xml.com/pub/a/2002/07/03/transform.html">Artikel von Bob DuCharme</a> führt gut in das Thema ein und enthält auch zahlreiche Code-Beispiele. Insbesondere das <a href="http://www.xml.com/pub/a/2002/07/03/transform.html?page=3">Beispiel xq437.xsl auf Seite 3</a> sah vielversprechend aus. Ich musste lediglich die Namen der XML-Elemente und den Namensraum etwas anpassen. Hier ist die fertige Transformation:</p>
<pre><code>
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;

&lt;xsl:stylesheet version=&quot;1.0&quot; 
  xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot; 
  xmlns:evtx=&quot;http://schemas.microsoft.com/win/2004/08/events/event&quot;&gt;
  
  &lt;xsl:output method=&quot;xml&quot; indent=&quot;yes&quot; encoding=&quot;UTF-8&quot;/&gt;
  &lt;xsl:strip-space elements=&quot;*&quot; /&gt;
  
  &lt;xsl:template match=&quot;Events&quot;&gt;
    &lt;xsl:copy&gt;
      &lt;xsl:apply-templates select=&quot;evtx:Event&quot;&gt;
        &lt;xsl:sort select=&quot;evtx:System/evtx:EventRecordID&quot; 
          data-type=&quot;number&quot; 
          order=&quot;ascending&quot;/&gt;
        &lt;/xsl:apply-templates&gt;
      &lt;/xsl:copy&gt;
  &lt;/xsl:template&gt;
  
  &lt;xsl:template match=&quot;*&quot;&gt;
    &lt;xsl:copy&gt;
      &lt;xsl:apply-templates/&gt;
    &lt;/xsl:copy&gt;
  &lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;
</code></pre>
<p>Sie sollten diese Transformation mit jedem XSLT Prozessor wie Sablotron, Xalan oder SAXON ausführen können. Da ich bereits die Programmbibliothek <a href="http://xmlsoft.org/XSLT/">libxslt</a> installiert hatte, konnte ich deren XSLT Prozessor <a href="http://xmlsoft.org/XSLT/xsltproc.html">xsltproc</a> verwenden:<br />
<tt>xsltproc evtxsort.xsl mylog.xml > mylog.sorted.xml</tt><br />
Die Protokolldatei ist jetzt übersichtlich mit Einrückungen formatiert und ihre Datensätze sind nach der EventRecordID in aufsteigender Reihenfolge sortiert.</p>

<p>Sie können diese Transformation leicht an Ihre eigenen Vorstellungen anpassen, zum Beispiel die Einträge in Absteigender Reihenfolge sortieren, oder nach der EventID (der Art des Ereignisses) sortieren, oder einen zusammenfassenden Bericht erstellen, usw. Den Möglichkeiten sind kaum Grenzen gesetzt.</p>]]>
         </description>
         <link>http://computer.forensikblog.de/2010/02/event_records_sortieren.html</link>
         <guid>http://computer.forensikblog.de/2010/02/event_records_sortieren.html</guid>
         <category>Vista Eventlog</category>
         <pubDate>Mon, 08 Feb 2010 10:00:00 +0100</pubDate>
      </item>
            <item>
         <title>Evtx Parser Version 1.0.1</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2010 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>Nachdem ich vor zwei Jahren einen ersten Parser für die binären, XML-basierten Ereignisprotokolle von Windows Vista veröffentlicht hatte, erreichten mich in der letzten Zeit einige Rückmeldungen zu dem Programm. Als Weihnachtsgeschenk gibt es dieses Jahr deshalb eine <a href="http://computer.forensikblog.de/files/evtx/EvtxParser-current.zip">verbesserte und erweiterte Version dieses Werkzeugs</a>.</p>]]>
            <![CDATA[<p>Die die wichtigsten Änderungen sind:</p>

<ul><li>Im Modul <tt>Node0x0d.pm</tt> habe ich einen zu restriktiven Test entfernt. Der Parser reagiert jetzt flexibler auf unbekannte Datentypen. Ich danke Rob Hulley und Adrian Forschner für die Meldung der Fehler und die Bereitstellung von Testdaten.</li>
<li>Das Modul <tt>Evtx.pm</tt> aktualisiert jetzt selbsttätig einen Zeiger auf den aktuell verarbeiteten Block. Über die Methode <tt>get_current_chunk()</tt> kann der Wert jederzeit abgerufen werden.</li>
<li>Die Module <tt>Evtx.pm</tt> und <tt>Chunk.pm</tt> werten zusätzliche Felder aus den Köpfen der <a href="/2007/07/evtx_dateiheader.html">Datei</a> und der einzelnen <a href="/2007/07/evtx_blockheader.html">Blöcke</a> aus. Dank an Rob Hulley für einen Patch.</li>
<li>Das Programm <tt>evtxinfo.pl</tt> zeigt diese Eigenschaften an. Außerdem nennt es jeweils den ersten und letzten Datensatz in einem Block, und zwar auf die vorliegende Datei und das gesamte Protokoll bezogen:</li></ul>
<pre>
$ ./evtxinfo.pl sample4.evtx 
Information from file header:
Format version  : 3.1
Flags           : 0x00000000
         File is: CLEAN
     Log is full: NO
Current chunk   : 2 of 16
Next Record#    : 5276

Information from chunks:
Chunk file (first/last)     log (first/last)     
----- --------------------- ---------------------
    1       4681       4976       4902       5197
    2       4977       5054       5198       5275
    3        593        888        814       1109
    4        889       1135       1110       1356
    5       1136       1431       1357       1652
    6       1432       1727       1653       1948
    7       1728       2023       1949       2244
    8       2024       2312       2245       2533
    9       2313       2608       2534       2829
   10       2609       2904       2830       3125
   11       2905       3200       3126       3421
   12       3201       3496       3422       3717
   13       3497       3792       3718       4013
   14       3793       4088       4014       4309
   15       4089       4384       4310       4605
   16       4385       4680       4606       4901
</pre>
<p><strong>25.02.2010:</strong> Bitte beachten Sie auch die <a href="/2010/02/evtx_parser_1_0_3.html">Ankündigung der Version 1.0.3</a>.</p>]]>
         </description>
         <link>http://computer.forensikblog.de/2009/12/evtx_parser_1_0_1.html</link>
         <guid>http://computer.forensikblog.de/2009/12/evtx_parser_1_0_1.html</guid>
         <category>Vista Eventlog</category>
         <pubDate>Tue, 22 Dec 2009 10:00:00 +0100</pubDate>
      </item>
            <item>
         <title>Speicheranalyse mit FTK 3</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2009 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>Vor vier Jahren, auf dem DFRWS 2005, wurden die ersten Werkzeuge zur Windows-Speicheranalyse präsentiert. Langsam finden die seitdem entwickelten Methoden Eingang in kommerzielle Werkzeuge. Auch das kürzlich von AccessData öffentlich vorgestellte Forensic Toolkit 3 bietet jetzt einige Funktionen zur Untersuchung von Windows-Speicherabbildern.</p>]]>
            <![CDATA[<p>Im Hauptbildschirm des neuen FTK3 fällt schnell ein neuer Reiter auf: "Volatile" heißt es da. Dahinter verbergen sich die neuen Funktionen zur Untersuchung von Speicherabbildern.</p>

<p><img alt="Die Registertasten im neuen FTK3" src="/media/ftk3-volatile.jpg" width="459" height="26" /></p>

<p>FTK3 zeigt Prozesse, Netzwerk-Sockets, in den Speicher geladene Programmbibliotheken (DLL) und Handles. Letztere lassen auf geöffnete Dateien ebenso schließen wie auf aktive Threads eines Prozesses.</p>

<p>Für einen ersten Test lasse ich FTK3 ein Speicherabbild untersuchen, in dem ein Netcat-Listener mit dem FUto-Rootkit versteckt wurde. Der Listener und sein Socket werden sofort erkannt. Ich vermisse allerdings einen Hinweis auf die manipulierten Datenstrukturen.</p>

<p>Leider steht FTK3 mit diesen Funktionen aber noch weit hinter dem Stand der Forschung zurück. Manipulationen an der Registry im Arbeitsspeicher, in den Kernel geladene Module und maliziöse Aktivitäten bleiben so meist unerkannt.</p>

<p>Interessant könnte eine Funktion zum Vergleich zweier Speicherabbilder sein. Genauere Tests werden zeigen, ob sich mit dieser Funktion Veränderungen am ausgeführten Kernel und der Systemkonfiguration erkennen lassen. </p>

<p><a href="/media/ftk-futo-rootkit.html" onclick="window.open(/media/ftk-futo-rootkit.html','popup','width=1024,height=738,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img alt="Speicheranalyse mit dem FTK3 (für Vollbild bitte klicken)" src="/media/ftk-futo-rootkit-small.jpg" width="480" height="346" /></a></p>

<p>Ich freue mich über die Entscheidung von AccessData, Funktionen zur Speicheranalyse in die Oberfläche von FTK zu integrieren. Dies wird hoffentlich vielen neuen Anwendern einen Zugang zu den Methoden der Speicheranalyse erleichtern.</p>]]>
         </description>
         <link>http://computer.forensikblog.de/2009/10/speicheranalyse_mit_ftk_3.html</link>
         <guid>http://computer.forensikblog.de/2009/10/speicheranalyse_mit_ftk_3.html</guid>
         <category>Speicheranalyse</category>
         <pubDate>Tue, 06 Oct 2009 10:00:00 +0100</pubDate>
      </item>
            <item>
         <title>FTK Imager 2.6.0</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2009 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>AccessData hat die Version 2.6.0 des FTK Imagers veröffentlicht. Neben Fehlerbereinigungen bietet diese Version des FTK Imagers erstmals die Möglichkeit, den Arbeitsspeicher des lokalen Computers zu sichern.</p>]]>
            <![CDATA[<p>Wie den <a href="http://www.accessdata.com/downloads/media/Imager_2-6_ReleaseNotes.pdf">Release Notes</a> zu entnehmen ist, wurden einige Probleme im Zusammenhang mit dem von EnCase her bekannten Expert Witness Format (E01) behoben.</p>

<p>Auch die Verarbeitung von Partitionen der Dateisysteme JFS und UFS, sowie des Logical Volume Managers LVM2 wurde erweitert.</p>

<p>Schließlich kann jetzt auch der FTK Imager den Hauptspeicher des lokalen Computers sichern. Hierzu erstellt der FTK Imager zunächst eine Datei (ad_driver.sys) und lädt diese dann als Treiber \Device\addriver in den Betriebssystemkern. Hierzu benötigt man zumindest lokale Administratorrechte.</p>

<p><img alt="FTK Imager kopiert den Arbeitsspeicher" src="/media/ftkimager260-memory-save.jpg" width="480" height="351" /></p>

<p>Es erscheint fraglich, ob ein komplexes Programm mit grafischer Benutzerschnittstelle wie der <br />
FTK Imager zur Sicherung volatiler Daten geeignet ist. Auf einem Testsystem führte der <br />
Start des FTK Imager zu <a href="/media/ftimager260.dllactivity.txt" target="_blank">Lesezugriffen auf 70 DLLs und zugehörige Dateien</a>. Eine umfassendere <a href="http://doi.acm.org/10.1145/1368506.1368516 ">Untersuchung der Ressourcennutzung</a> ist hier angeraten. </p>

<p>Nach der ersten Ausführung des FTK Imagers ließ sich kein weiteres Speicherabbild mehr <br />
erstellen. Fälschlicherweise behauptet der FTK Imager, dass mit diesem Betriebssystem kein <br />
Speicherabbild erstellt werden könne. Beenden und Neustart des Imagers behebt das Problem.</p>

<p><img alt="Die Meldung des FTK Imagers täuscht über die wahre Ursache des Fehlers" src="/media/ftkimager260-memory-error.jpg" width="374" height="126" /></p>

<p>Am Rande bemerkt empfehle ich auch nicht, dem Vorschlag des FTK Imagers zu folgen und binäre Daten in einer Datei mit der Extension ".txt" zu speichern.</p>]]>
         </description>
         <link>http://computer.forensikblog.de/2009/06/ftk_imager_260.html</link>
         <guid>http://computer.forensikblog.de/2009/06/ftk_imager_260.html</guid>
         <category>Labor</category>
         <pubDate>Tue, 02 Jun 2009 10:00:00 +0100</pubDate>
      </item>
            <item>
         <title>Weitere PTFinder</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2009 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>Csaba Barta hat PTFinders für <a href="http://www.csababarta.com/downloads/ptfinderw2k3sp2.zip">Windows Server 2003 SP2</a>, <a href="http://www.csababarta.com/downloads/ptfinderw2k8sp1.zip">Windows Server 2008 SP1</a> und die öffentlich zugängliche <a href="http://www.csababarta.com/downloads/ptfinderw7beta.zip">Beta von Windows 7</a> entwickelt. Auch die anderen Bereiche seiner <a href="http://www.csababarta.com/">Website</a> sind recht interessant.</p>]]>
            
         </description>
         <link>http://computer.forensikblog.de/2009/05/weitere_ptfinder.html</link>
         <guid>http://computer.forensikblog.de/2009/05/weitere_ptfinder.html</guid>
         <category>Speicheranalyse</category>
         <pubDate>Fri, 08 May 2009 10:00:00 +0100</pubDate>
      </item>
            <item>
         <title>Writeblocker für FireWire-Geräte</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2009 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>Tableau hat mit dem T9 nun auch einen Writeblocker für Geräte mit FireWire-Interface im Angebot. Damit sollen sich portable Festplatten und Apple Macs im Target Disk Mode sichern lassen. Von der Bauform und Bedienung her scheint der T9 weitgehend dem bekannten T8 zu entsprechen, über den sich USB-Geräte schreibgeschützt ansprechen lassen.</p>]]>
            <![CDATA[<p>Quellseitig unterstützt der T9 FireWire mit 400 und 800 Mbit/s mit einem 9-poligen Anschluss. Einige Händler verkaufen den T9 als Kit, das neben einem Netzteil auch Kabel und Adapter 4- und 6-polige Anschlüsse enthält. Vom forensischen Arbeitsplatz lässt sich der T9 über FireWire (9 polig) und USB 2.0 (5 polig mini-B) ansprechen.</p>

<p><img alt="Tableau T9 Forensic FireWire 400/800 Bridge" src="/media/tableau_t9.jpg" width="480" height="441" /></p>

<p>Bei <a href="http://www.tableau.com/>Tableau</a> ist der T9 derzeit noch nicht gelistet. Die üblichen Händler wie <a href="http://www.mh-service.de/">mh SERVICE</a> (noch ohne Preisangabe), <a href="http://www.arina.ch/">arina electronic</a> (540 SFr für das Kit mit Kabeln und Netzteil) und <a href="http://www.forensic-computers.com/">Forensic Computers</a> (329 USD für die Bridge, 399 USD für das Kit) listen den T9 bereits.</p>]]>
         </description>
         <link>http://computer.forensikblog.de/2009/04/firewire_writeblocker_tableau_t9.html</link>
         <guid>http://computer.forensikblog.de/2009/04/firewire_writeblocker_tableau_t9.html</guid>
         <category>Labor</category>
         <pubDate>Mon, 27 Apr 2009 10:00:00 +0100</pubDate>
      </item>
            <item>
         <title>Passwörter im Tastaturpuffer</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2009 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>Das BIOS eines PC enthält auch eine einfache Routine zur Abfrage der Tastatur. Die Tasteneingaben werden in einem Ringpuffer gespeichert, der Platz für etwa 16 Zeichen bietet. Wie Jonathan Brossard in einem <a href="http://www.ivizsecurity.com/research/preboot/preboot_whitepaper.pdf">Aufsatz</a> und einer <a href="https://www.defcon.org/images/defcon-16/dc16-presentations/defcon-16-brossard.pdf">Präsentation</a> auf der DEFCON 16 gezeigt hat, wird der Puffer oftmals nicht sofort nach dem Auslesen gelöscht. Unter Umständen lassen sich deshalb in einem Speicherabbild die Passwörter für den Startvorgang oder eine Festplattenverschlüsselung finden.</p>]]>
            <![CDATA[<p>Der Aufsatz von Jonathan Brossard enthält eine detaillierte Beschreibung der technischen Grundlagen und zahlreiche Beispiele. Ich beschränke mich hier deshalb auf die Ermittlung des BIOS-Startpasswortes. Im folgenden Beispiel habe ich im BIOS das Passwort "1234supe" eingestellt. Nach einem Neustart und der Eingabe des Passwortes habe ich dann ein Speicherabbild erstellt. Die dekodierte BIOS Data Area enthält Informationen über die Position und den Füllstand des Tastaturpuffers. Das Passwort ist gut erkennbar:</p>

<p><img alt="BIOS Data Area mit Passwort" src="/media/bios-password.jpg" width="462" height="431" /></p>

<p>In der Detailansicht des Tastaturpuffers wird deutlich, dass für gewöhnliche Zeichen jeweils zwei Bytes abgelegt werden: der ASCII-Code des Zeichens und der beim Drücken der Taste erzeugte Scancode. Für das Zeichen "1" sind das zum Beispiel der ASCII-Wert <tt>0x31</tt> und der Scancode <tt>0x02</tt>. Allerdings gibt es auch Ausnahmen. Für die Eingabetaste (Return) wird so nur der Scancode hinterlegt. Außerdem berücksichtigt dieser Mechanismus natürlich nicht das deutsche Tastaturlayout. Es ist die Aufgabe des Betriebssystems, die Zeichen entsprechend umzusetzen.</p>

<p><img alt="Der Tastaturpuffer im Detail" src="/media/bios-password-hex.jpg" width="480" height="141" /></p>

<p>Leider enthalten längst nicht alle Abbilder die Speicherseite mit den Daten des BIOS. In Crash Dumps und mittels LiveKd erstellten Abbildern fehlt diese Speicherseite leider immer. Bei <a href="http://win32dd.msuiche.net/">win32dd</a> von Matthieu Suiche lässt sie sich mit der Option "-t 1" in das Abbild aufnehmen.</p>

<p>Für eigene Experimente stelle ich gerne das <a href="/files/010_templates/BIOSdata.bt">Template für den 010 Editor</a> (Abbildung oben) und ein <a href="/files/volatility_plugins/keyboardbuffer.py">Plugin</a> für das Speicheranalyse-Framework Volatility bereit.</p>]]>
         </description>
         <link>http://computer.forensikblog.de/2009/04/passwoerter_im_tastaturpuffer.html</link>
         <guid>http://computer.forensikblog.de/2009/04/passwoerter_im_tastaturpuffer.html</guid>
         <category>Speicheranalyse</category>
         <pubDate>Fri, 17 Apr 2009 10:00:00 +0100</pubDate>
      </item>
            <item>
         <title>Objekttypen auflisten</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2009 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>Es gibt viele Möglichkeiten, um alle Objekttypen des Microsoft Windows Betriebssystemkerns aufzulisten. In diesem kurzen Beitrag stelle ich drei davon vor: den Microsoft Debugger, Sysinternals' WinObj und ein Plugin für das Speicheranalyse-Framework Volatility.</p>]]>
            <![CDATA[<h3>Microsoft Debugger</h3>

<p>Microsofts Debugger "WinDbg" ermöglicht auf sehr einfache Weise die Auflistung aller Objektklassen des Kernels. Hierzu muss man lediglich alle Elemente des Verzeichnisses <tt>\ObjectTypes</tt> abfragen:</p>
<pre>
kd> !object \ObjectTypes
Object: e1004ab0  Type: (812be278) Directory
    ObjectHeader: e1004a98 (old version)
    HandleCount: 0  PointerCount: 25
    Directory Object: e1004dc0  Name: ObjectTypes

    Hash Address  Type          Name
    ---- -------  ----          ----
     00  812be278 Type          Directory
     01  8128f5e0 Type          Mutant
         81292c68 Type          Thread
     03  81293c28 Type          FilterCommunicationPort
     05  812b5e70 Type          Controller
     07  8128eca0 Type          Profile
         8128f980 Type          Event
         812be448 Type          Type
     09  8128e560 Type          Section
         8128f7b0 Type          EventPair
         812be0a8 Type          SymbolicLink
     10  8128e730 Type          Desktop
     11  8128ee70 Type          Timer
     12  812b5730 Type          File
         8128e900 Type          WindowStation
     16  812b5ad0 Type          Driver
     18  812b0e70 Type          WmiGuid
         8128ead0 Type          KeyedEvent
     19  812b5ca0 Type          Device
         81292040 Type          Token
     20  81292398 Type          DebugObject
     21  812b5900 Type          IoCompletion
     22  81292e38 Type          Process
     24  812b5040 Type          Adapter
     26  8128b980 Type          Key
     28  81292a98 Type          Job
     31  812b68c0 Type          WaitablePort
         812b6a90 Type          Port
     32  8128f410 Type          Callback
     33  81293df8 Type          FilterConnectionPort
     34  8128e040 Type          Semaphore
</pre>
<p>Für jede Klasse nennt der Debugger die Basisadresse. Einzelheiten über die Klasse zeigen dann die Kommandos <tt>!object</tt> und "display type" (<tt>dt</tt>):</p>
<pre>
kd> !object 81292e38
Object: 81292e38  Type: (812be448) Type
    ObjectHeader: 81292e20 (old version)
    HandleCount: 0  PointerCount: 1
    Directory Object: e1004ab0  Name: Process

kd> dt _OBJECT_TYPE 81292e38 
ntdll!_OBJECT_TYPE
   +0x000 Mutex            : _ERESOURCE
   +0x038 TypeList         : _LIST_ENTRY [ 0x81292e70 - 0x81292e70 ]
   +0x040 Name             : _UNICODE_STRING "Process"
   +0x048 DefaultObject    : (null) 
   +0x04c Index            : 5
   +0x050 TotalNumberOfObjects : 0x15
   +0x054 TotalNumberOfHandles : 0x4e
   +0x058 HighWaterNumberOfObjects : 0x16
   +0x05c HighWaterNumberOfHandles : 0x52
   +0x060 TypeInfo         : _OBJECT_TYPE_INITIALIZER
   +0x0ac Key              : 0x636f7250
   +0x0b0 ObjectLocks      : [4] _ERESOURCE
</pre>
<h3>WinObj</h3>

<p>Möchten Sie sich einen Eindruck von der Objekthierarchie verschaffen und hierfür lieber eine graphische Oberfläche verwenden, dann ist <br />
<a href="http://technet.microsoft.com/en-us/sysinternals/bb896657.aspx">WinObj</a> von Mark Russinovich möglicherweise das richtige Programm für Sie. Die Objektklassen sind wiederum im Verzeichnis "\ObjectTypes" zu finden.</p>

<p><img alt="WinObj zeigt Objekte des Windows Kernels" src="/media/winobj.objtypes.jpg" width="480" height="341" /></p>

<h3>Volatility</h3>

<p>Letztlich habe ich mich entschlossen, selbst ein Plugin für das Speicheranalyse-Framework <a href="https://www.volatilesystems.com/default/volatility">Volatility</a> zu schreiben. Leider musste ich dazu auch einige Dateien des Frameworks ändern; das Plugin läuft also nicht mit der Standard-Distribution. Bitte entpacken Sie das <a href="/files/volatility_plugins/volatility_objtypescan-current.zip">Archiv</a> im Basisverzeichnis von Volatility (aber vergessen Sie nicht, vorher eine Sicherungskopie zu erstellen!).</p>

<p>Das Plugin enthält ein paar kleine Tricks, um die Struktur <tt>_OBJECT_HEADER</tt> korrekt zu interpretieren und um physische Adressen in virtuelle Adressen des Kernels umzurechnen; letztgenannte Funktion ist deutlich vom Modul "strings" der Volatility-Distribution inspiriert.</p>

<p>Das Plugin gibt die folgenden Informationen aus:</p>
<ul><li><strong>Phys.Addr</strong> - physische Adresse des ObjT Blocks im Pool</li>
<li><strong>Obj Type</strong> - Zeiger auf die Definition der Klasse "ObjectType". Der Wert ist abhängig vom jeweiligen System und kann sich auch nach einem Neustart ändern. Während einer laufenden Sitzung sollten aber alle Objekte der selben Klasse auf die selbe Definition verweisen.</li>
<li><strong>#Ptr</strong> - Anzahl der Zeiger auf das ObjectType Objekt</li>
<li><strong>#Hnd</strong> - Anzahl der Handles für das ObjectType Objekt</li>
<li><strong>Objects</strong> - aktuelle und maximale Anzahl von Objekten dieser Klasse</li>
<li><strong>Handles</strong> - aktuelle und maximale Anzahl von Handles auf Objekte dieser Klasse</li>
<li><strong>Pool alloc</strong> - Pool Tag und Pool Typ (auslagerbar/nicht auslagerbar) für Objekte dieser Klasse</li>
<li><strong>TypePtr</strong> - virtuelle Adresse des Kernels des ObjectType Objektes</li>
<li><strong>Name</strong> - Name der Klasse</li></ul>
<p>Hier ist ein <a href="/media/objtypes.xp-laptop-2005-06-25.dd.txt" target="_blank">Beispiel</a> für die Programmausgabe, das durch Ausführung des Plugins mit einem populären Speicherabbild aus dem <a href="http://www.cfreds.nist.gov/mem/Basic_Memory_Images.html">NIST CFReDS Projekt</a> erzeugt wurde:<br />
<tt>python volatility objtypescan -f xp-laptop-2005-06-25.dd</tt> </p>

<p>Ich muss eingestehen, dass diese Informationen im Rahmen einer forensischen Untersuchung des Arbeitsspeichers eher nicht hilfreich sind. Ich verwende das Plugin eher als Hilfsmittel bei der Entwicklung anderer Tools. Die Maximalstände der Objekt- und Handle-Zahlen können allerdings erste Anhaltspunkte auf einen ungewöhnlichen Systemzustand geben.</p>]]>
         </description>
         <link>http://computer.forensikblog.de/2009/04/objekttypen_auflisten.html</link>
         <guid>http://computer.forensikblog.de/2009/04/objekttypen_auflisten.html</guid>
         <category>Speicheranalyse</category>
         <pubDate>Wed, 08 Apr 2009 10:00:00 +0100</pubDate>
      </item>
            <item>
         <title>Kernelobjekte</title>
         <description>
        <![CDATA[<p>von Andreas Schuster<br />
        Copyright &copy; 2009 <a href="http://computer.forensikblog.de/">for(ensik){blog;}</a>. Alle Rechte vorbehalten.</p>]]>
            <![CDATA[<p>Microsoft Windows ist ein objektorientierter Kernel. Dateien, Prozesse, Threads - alles ist ein Objekt. All diese Objekte haben eine gemeinsame Datenstruktur und Schnittstelle. Dieser Beitrag zeigt, wie der Kernel Objekte erzeugt und im Arbeitsspeicher ablegt.</p>]]>
            <![CDATA[<p>Für jede Klasse von Objekten gibt es eine spezialisierte Routine wie <tt>IoCreateDriver</tt> oder <tt>PspCreateProcess</tt>, die diese Objekte erzeugt. Alle diese Routinen rufen jedoch früher oder später <tt>ObCreateObject</tt> auf und verweisen dabei auf eine geeignete <tt> _OBJECT_TYPE</tt> Struktur.</p>

<p>Wie ein Bauplan beschreibt die Struktur <tt>_OBJECT_TYPE</tt> eine Klasse von Objekten:</p>
<pre>
kd> dt _OBJECT_TYPE
struct _OBJECT_TYPE, 12 elements, 0x190 bytes
   +0x000 Mutex            : _ERESOURCE
   +0x038 TypeList         : _LIST_ENTRY
   +0x040 Name             : _UNICODE_STRING
   +0x048 DefaultObject    : Ptr32 Void
   +0x04c Index            : Uint4B
   +0x050 TotalNumberOfObjects : Uint4B
   +0x054 TotalNumberOfHandles : Uint4B
   +0x058 HighWaterNumberOfObjects : Uint4B
   +0x05c HighWaterNumberOfHandles : Uint4B
   +0x060 TypeInfo         : _OBJECT_TYPE_INITIALIZER
   +0x0ac Key              : Uint4B
   +0x0b0 ObjectLocks      : [4] _ERESOURCE
</pre>
<p><tt>_OBJECT_TYPE_INITIALIZER</tt> legt weitere Einzelheiten über die Klasse fest und enthält Details ihrer Implementierung, zum Beispiel Behandlungsroutinen für Standardereignisse:</p>
<pre>
kd> dt _OBJECT_TYPE_INITIALIZER
struct _OBJECT_TYPE_INITIALIZER, 20 elements, 0x4c bytes
   +0x000 Length           : Uint2B
   +0x002 UseDefaultObject : UChar
   +0x003 CaseInsensitive  : UChar
   +0x004 InvalidAttributes : Uint4B
   +0x008 GenericMapping   : _GENERIC_MAPPING
   +0x018 ValidAccessMask  : Uint4B
   +0x01c SecurityRequired : UChar
   +0x01d MaintainHandleCount : UChar
   +0x01e MaintainTypeList : UChar
   +0x020 PoolType         : _POOL_TYPE
   +0x024 DefaultPagedPoolCharge : Uint4B
   +0x028 DefaultNonPagedPoolCharge : Uint4B
   +0x02c DumpProcedure    : Ptr32     void 
   +0x030 OpenProcedure    : Ptr32     long 
   +0x034 CloseProcedure   : Ptr32     void 
   +0x038 DeleteProcedure  : Ptr32     void 
   +0x03c ParseProcedure   : Ptr32     long 
   +0x040 SecurityProcedure : Ptr32     long 
   +0x044 QueryNameProcedure : Ptr32     long 
   +0x048 OkayToCloseProcedure : Ptr32     unsigned char
</pre>
<p>Objekte werden gewöhnlich mit ihre Startadresse identifiziert. Als Beispiel soll der System-Prozess dienen. Er hat unter Windows XP immer die PID 4, so dass man ihn hierüber im Debugger auswählen kann:</p>
<pre>
kd> !process 4 0
Searching for Process with Cid == 4
PROCESS 812927c0  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
    DirBase: 00039000  ObjectTable: e1000a80  HandleCount: 216.
    Image: System
</pre>
<p>Seine Startadresse ist in deisem Beispiel <tt>0x812927c0</tt>. Hierüber können wir jetzt die für alle Klassen gemeinsamen Daten des Objekts einsehen:</p>
<pre>
kd> !object 812927c0
Object: 812927c0  Type: (81292e38) Process
    ObjectHeader: 812927a8 (old version)
    HandleCount: 2  PointerCount: 57
</pre>
<p>Das Objekt gehört zur Klasse der Prozesse ("Process") und beginnt an der Adresse <tt>0x812927c0</tt>. Beides war in diesem Fall natürlich bereits bekannt, aber dies ist die Bestätigung, dass wir die Daten richtig interpretieren. Wenn Sie die Ausgabe des Debuggers genau betrachten, dann werden Sie feststellen, dass der Objekt-Header an einer niedrigeren Adresse als das Objekt selbst steht, nämlich an <tt>0x812927a8</tt>.</p>

<p>Andere Objekte enthalten möglicherweise auch andere Informationen, wie zum Beispiel einen Verweis auf ein Directory, welches dann wiederum auf das Objekt verweist, einen Namen und im Fall der hier dargestellten symbolischen Verknüpfung auch den Namen des Ziels der Verknüpfung:</p>
<pre>
Object: e13ad800  Type: (812be0a8) SymbolicLink
    ObjectHeader: e13ad7e8 (old version)
    HandleCount: 0  PointerCount: 1
    Directory Object: e10076a0  Name: ScsiPort1
    Target String is '\Device\Ide\IdePort1'
</pre>
<p>Der Name des Ziels gehört zu den spezifischen Informationen dieser Klasse, er wird deshalb im Rumpf des Objekts gespeichert. Der Name des Objektes selbst und das übergeordnete Verzeichnis sind jedoch Eigenschaften, die auch viele andere Klassen aufweisen. Deshalb werden diese Informationen in dem allgemeinen Objekt-Header und einer seiner Erweiterungen abgelegt.</p>

<p>Zurück zur Routine <tt>ObCreateObject</tt>. Bevor sie Speicher für das Objekt belegt, trägt sie einige Meta-Daten über das zu erstellende Objekt zusammen und ruft dazu <tt>ObpCaptureObjectCreateInformation</tt> auf. Diese wiederum ruft weitere Funktionen auf. <tt>SeCaptureSecurityDescriptor</tt> überprüft zunächst gründlich die Eingabedaten, bevor sie einen ausreichend großen Speicherbereich im Paged Pool des Kernels reserviert und mit der Marke "SeSc" versieht. Schließlich kopiert die Routine den Security Descriptor des neuen Objektes aus den ihr übergeben Objekt-Attributen in diesen Speicherbereich.</p>

<p>Die genannten Marken ("pool tags") wurden eingeführt, um den Speicherverbrauch von Routinen zu überwachen und Softwareentwickler auf mögliche Fehler hinzuweisen. Bei der forensischen Untersuchung eines Arbeitssppeicherabbildes sind diese Marken sehr hilfreich, um Objekte bestimmter Klassen zu lokalisieren.</p>

<p>Später ruft <tt>ObpCaptureObjectCreateInformation</tt> dann <tt>ObpCaptureObjectName</tt> auf, um in ähnlicher Weise den Namen des Objekts zu speichern. Den hierfür benötigten Speicherbereich reserviert eine weitere Routine, <tt>ObpAllocateObjectNameBuffer</tt>. Als Markierung vergibt sie die Zeichenfolge "ObNm". Neben dem Namen wird hier auch ein Verweis auf das übergeordnete Verzeichnis abgelegt.</p>

<p>Schließlich benötigen wir auch noch Speicher für den Rumpf des Objektes mit seinen klassen-spezifischen Daten. Hierum kümmert sich <tt>ObpAllocateObject</tt>. Die Funktion ermittelt den gewünschten Pool (einer wird stets im Speicher gehalten, Teile des anderen können bei Bedarf auf die Festplatte ausgelagert werden) aus der Struktur <tt>_OBJECT_TYPE</tt>. Auch das Pool Tag entnimmt sie dieser Struktur. Dabei setzt die Funktion das höchstwertigste Bit des Pool Tags, um eine Verwendung durch das Betriebssystem anzuzeigen. Der Microsoft Debugger markiert diese Speicherblöcke dann als geschützt ("protected"). Allerdings schützt dieses Vorgehen nur gegen eine versehentliche Verwendung eines Tags durch Software anderer Hersteller, zum Beispiel eines Gerätetreibers. <a href="http://msdn.microsoft.com/en-us/library/ms796989.aspx">Microsofts Dokumentation</a> verlangt zwar, dass nur reine ASCII-Zeichen (7 Bit) in Tags verwendet werden. Allerdings kann man die entsprechende Routine <tt>ExAllocatePoolWithTag</tt> auch erfolgreich mit einem "unsauberen" Tag aufrufen. Entsprechende Beispiele findet man unter anderem im Windows XP SP2 MP Kernel, zum Beispiel in der Routine <tt>CmpAllocateKeyControlBlock</tt>.</p>

<p>Sobald <tt>ObCreateObject</tt> seine Arbeit beendet hat, enthält der Arbeitsspeicher die folgenden Strukturen (von niedrigeren zu höheren Adressen):</p>

<ol><li>_POOL_HEADER, 0x08 Bytes</li>
<li>_OBJECT_QUOTA_CHARGES, 0x10 Bytes, optional</li>
<li>_OBJECT_HANDLE_DB, 0x08 Bytes, optional</li>
<li>_OBJECT_NAME, 0x10 Bytes, optional, verweist auf Speicherblock mit "ObNm" Pool Tag</li>
<li>_OBJECT_CREATOR_INFO, 0x10 Bytes, optional</li>
<li>_OBJECT_HEADER, 0x18 bytes, kann auf einen Speicherblock mit "SeSc" Pool Tag verweisen</li>
<li>Rumpf des Objekts, das Objekt wird durch diese Adresse identifiziert!</li></ol>]]>
         </description>
         <link>http://computer.forensikblog.de/2009/04/kernelobjekte.html</link>
         <guid>http://computer.forensikblog.de/2009/04/kernelobjekte.html</guid>
         <category>Speicheranalyse</category>
         <pubDate>Tue, 07 Apr 2009 10:00:00 +0100</pubDate>
      </item>
      
   </channel>
</rss>
