保全した$MFTファイルを直接読み込む、あるいはNTFSフォーマットされた論理/物理パーティションを読み込み、ファイル情報を詳細に表示します。Windows上では通常表示されないような属性までMFTのFILEレコードに従って事細かに表示しますので、ファイルの情報を深堀りしたい方におススメです。そのほか、以下のようなおまけ機能もついています。
ゴミ箱の実際のファイルである$lおよび$Rをパースして本来のファイル名に戻して表示する機能です。また、レジストリハイブ「SOFTWARE」を指定すれば、SIDからユーザー名もパースします。
$ObjIdをパースして表示します。このパース機能についてはだいぶ実用レベルの実装に近づいてきているかなと、、、思いたいです。
すべてのMFTレコードを一覧表示します。ファイル名やファイルパスで並べ替えたり、検索機能を使うことで目的のファイルが探しやすくなるかもしれません。
ファイルリストをツリー形式でテキストファイルに出力します。CSVやTSV形式で出力する機能もいずれ追加できれば、とは思っています。
パーティションブートレコード(PBS)をパースして表示する機能を追加しました。
ダウンロードは以下のGoogleドライブのリンク(マウスを乗せると表示される右上の矢印から進んでください)からお願いします。
※ファイルサイズが異様に大きいのはなぜ?
⇒.NETをはじめとする、アプリの実行に必要なランタイムをすべてバイナリに含んでビルドしているため、一見すると異様にファイルサイズが大きく見えています。
※なぜすべてバイナリに含む形式をとっているの?
⇒私自身、昔からフリーソフトをダウンロードしてウキウキ気分でソフトを起動しようとしたら、特定のDLL(ランタイム)が見つからなくて起動できません、というエラーを何度も見てきました。そのたびにランタイムを探してきてインストールする作業が発生していました。ダウンロードしたらすぐ使いたい!というユーザー目線を考えた結果、どんな環境でも起動できるよう、すべての必要ファイルをバイナリに含ませる形式をとることにしました。
今回から試験的に編集機能を実装しました。
Option(オプション) ⇒ Setting(設定) ⇒ Debug(デバッグ)
から編集を有効設定にすることで、MFTファイルレコードおよびファイルの実体データについて、編集上書きが可能となります。MFTファイルレコードを直接編集できるフリーソフトは有名所ではActiveDiskEditorとかありますが、純日本産のソフトはあまり無いんじゃないかなと個人的に思ってます。
なお、本ソフトは仮想イメージやMFTを抽出した$MFTファイルを直接読み込む機能がありますが、さらに、マウントされた論理ドライブや物理パーティションを読み込む機能があります。論理ドライブや物理パーティションの読み込みに際しては、WindowsのAPIを叩くことで、かなり低レベルで対象のパーティション等を読み込んで編集しています。何が言いたいかといいますと、
論理ドライブ/物理ドライブを読み込んだ際には、OSがNTFSとして管理するよりも低レベルで直接マウントしているため、NTFSの機能である読み込み専用フラグのあるファイルであろうと、あるいはシステムの動作に必要なシステムファイルであろうと、問答無用で上書きします。
ですので、安易にパーティションのMFTファイルレコードを編集すると、最悪、Windowsが正常に稼働しなくなります。十分気を付けてご使用ください。
( •㉦• ) 最新版はこちら( •㉦• )
( •㉦• ) 書き込み機能実装前のバイナリはこちら(書き込み機能が無いので、少なくともパーティションを破壊することはないはず、、、)( •㉦• )
2024/6/6
Created, Modified, Accessed, LastModefiedのいずれかの値がパースできずに空となるレコードがあった場合に、エラーとなる状態だったので修正。原因は単純な単純なコピペミスorz
2024/3/5
ストリームの処理に問題があり、画像ファイルのプレビューやファイルのエクスポートでエラーが出るバグがあることに気づいたので修正。割とクリティカルなバグなのに今まで気づかなかった自分が恥ずかしい。。。
2023/9/30
パーティションブートセクタ(PBS)をパースして表示する機能を追加しました。また、IndexAllocationのスラック領域からもデータを拾って表示するようにしました。MFTスラック領域およびIndexAllocationのスラック領域からデータを拾うことにより、過去に存在したであろうファイルやフォルダのデータの存在を確認できる可能性が向上したのではないかと思います。参考までに、FTKImagerで拾いきれなかったデータが拾えたりしました。(@ManKumaaのツイッター参照)。
また、AttributeListのパースを機能強化しました。
2023/8/27
バイナリエディタ上にてMFTファイルレコードおよびファイルの実体データを編集する機能を追加しました。オプション⇒デバッグの設定から有効化することで、MFTファイルレコードや実体データ、IndexAllocationデータといったものも編集できるようになります。
フォレンジック的に、対象データが編集できてしまうのはいかがなものか、とは思いますが、機能としてあって損は無いかなと。。。
2023/7/23
RAW(dd)イメージファイルの読み込み機能追加。VHDXとかの仮想ディスクイメージ読み込み機能は実装していたくせに単純なRAWイメージの読み込み機能が無かったとは。。。(〃ノдノ)
2023/7/17
ObjectIDのパース機能を強化。具体的には
・読み込んだエビデンスの分だけObjectIDを一括でパース(ようは、C,D,Gドライブを読み込んだなら、それぞれのドライブを一括パースして表示)
・BirthVolumeIDに対応するボリューム名およびボリュームソースを表示(オブジェクトが他のボリュームから移動してきた場合、対応するボリュームをソースとして読み込み済みなら、ボリューム名をパースして表示可能)
・同一端末内でのボリューム移動なのか、リモートドライブからの移動なのかをフラグ列で明示するようにした
・列名に、説明文のツールチップを実装
・列の表示/非表示機能を実装
一見すると地味な更新ですが、実装には割と手がかかってたりします。。。
2023/7/7
ルートNodeを選択していないとゴミ箱パースやObjIDパースがうまく機能していなかったバグを修正。
TreeにVolume名とVolumeIDを表示するように修正。
ツールバーの表示メニューのチェックアイコン表示がおかしかったのを修正。
2023/7/4
今までは、新たなものを読み込むと以前の要素は消えてしまっていたが、複数の要素(MFTファイル/仮想ファイル/論理ドライブ/物理パーティション)を読み込んで保持できるようにした。その分、読み込んだ要素の数だけメモリドカ食い気絶部状態になります。メモリは潤沢に積んでください。
複数要素を読み込めるようになると、ObjIDのパースを真面目にやりたくなってくる。ファイルがどのドライブ(Volume)で生成されて、現在のドライブ(Volumr)へ移動してきたのか、その変遷を視覚的に表示できるようになればいいなと画策中。
あと、高DPI環境でWindows上で画面の拡大・縮小設定をしている場合にいくつかのパーツがレイアウト崩れを起こす問題を修正。
2023/6/23
読み込んだ要素の種類(MFTファイル/仮想ファイル/論理ドライブ/物理パーティション)に応じて、ツリービューのRootNodeにその読み込んだものが何だったか?を示すようにツリービューの改修を行った。
2023/4/23
バージョン管理を日付にした。
2023/3/18
MFTファイルのサイズが2GBを超えた際に読み込めなくなるバグを修正しました。長く使用しているPCの場合、それだけMFTファイルも肥大していくわけですが、MFTファイルが2GBを超えた場合に正常に読み込めなくなる不具合が発見されました。原因は、MFTを読み込む際のオフセット保存用の変数をintで定義していたためです。int型の最大値は2,147,483,647(=2GB)です。そのため、2GBを超えるMFTを読み込もうとした際に、int型で定義されていたオフセット保存用変数が最大値を超えて負の値になってしまうことによる不具合でした。オフセット保存用変数をlong型で定義し、関連する処理もlong型を前提にすることで、このバグ(いわゆる2GBの壁)を修正しました。
2023/1/23
かなりのベータ版ではありますが、仕事が忙しくてなかなか更新する時間が無いので、いったん現状で一般公開を開始することにしました!
2023/1/4
いろいろと微修正
2023/1/3
CPOLの変更箇所を詳細に記載。使用している外部ライブラリのライセンスファイルがhtmlだったものを、WebBrowserコントロールを使用してちゃんと表示するように修正。起動時の注意事項ダイアログを追加
2023/1/2
結局2022年中に一般公開は間に合いませんでした。(一般公開に耐え得るレベルの実装まで持っていけませんでした。。。)
とりあえず、設定を見直して、全レコード表示機能の最適化を図りました。
2023年、ベータレベルでもいいので、早いところ一般公開まで持っていきたいところです。
2022/12/30
ゴミ箱パース機能を強化し、DollerI属性をツリービューとMFTレコードエディタで視覚的に確認できるようにした。暫定的に、$ObjIdをパースする機能を追加。
2022/11/25
ゴミ箱内のSIDフォルダをレジストリハイブファイルである「SOFTWARE」を用いてパースし、元のユーザー名で表示する機能を追加
2022/11/23
ゴミ箱内の$I及び$Rファイルをパースして元のファイル名やファイルパスを表示する機能を追加
2022/10/23
MFTの読み取りをマルチスレッドにして高速化。
AttributeList参照されているFileRecordでかつ参照元となった親レコードが既に存在しないものについて、UnAssociatedとしてツリーに表示。
AttributeList属性については、MFTレコードのツリー内において青色表記するようにした。
ファイルリストをツリー形式で一覧出力する機能を追加した。
2022/9/15
いろいろと機能追加、細かなバグ修正。そろそろベータ版として公開してもいいころか。。。
2022/3/27
ファイルフォルダツリーの構築処理を見直し。
2022/3/22
細かなバグの修正。
ファイルエクスポートの際に、スラック領域を含めるかどうかを選択可能に。
2022/3/16
だいぶ機能修正
2021/9/16
とりあえず版を公開開始
注意点
現在ベータベータベータくらいのバージョンです。安定性は期待しないでください。なお、仕様上、$MFTファイルを一気に読み込んでメモリ上に保持するため、使用するPCのメモリについては可能な限り潤沢に積んでください。私の環境では、1GBの$MFTを読み込んだ際に、約3GBのメモリ使用量になりました。
目指しているソフト
・Eric Zimmerman氏の「MFTExplorer 」
GitHub - EricZimmerman/MFT: MFT parser
・kazamiya氏の「fte」
fte | Forensicist (kazamiya.net)
・Active Disk Editor
Active@ Disk Editor - Freeware Hex Viewer & Hex Editor for raw sectors/clusters (disk-editor.org)
このあたりのソフトのいいとこどりを目指しているつもりです。
あと、個人的なこだわりは読み込み中のプログレスバーダイアログ。個人的に、読み込みに時間がかかるソフトはプログレスバーがあるとないとで感じるストレスが段違いになると思ってます。
列タイトル等、随所にツールチップで細かく説明を入れており、MFT初心者の方のためのテキストも兼ねてるつもりです。といいますか自分がMFTの仕様を忘れたときに英語のテキスト見直すよりもこのソフト起動して、あれ?ここなんだったけ。を思い出すための備忘録的な機能を兼ねてます。
実装している機能(赤字は個人的におすすめしたい機能)
保全したMFTファイルの読み込み
論理ボリュームの読み込み
物理パーティションの読み込み
仮想イメージ(VHD,VHDX,VMDK,VDI)の読み込み(ただし、自環境ではVHDX以外は未検証)
ドラッグで選択したバイナリ部分を様々な形式へ変換表示するダイアログ(バイトチェンジャー)
MFTレコードのスラック領域のパースと表示
IndexAllocationのパースと表示
IndexAllocationのスラック領域のパースと表示
DataRunの個別表示
ファイルリストをツリー形式で一覧出力
個別ファイルのエクスポート(スラック領域を含む/含まないを選択可能)
実データ部分の表示(バイナリ/Text/JSON/XML/Image)
全MFTレコードの一括表示
ゴミ箱内の元のファイル名をパース
使用しているライブラリなど
Be.HexEditor(バイナリエディタ部分)MIT
Be.HexEditor (sourceforge.net)
DiscUtils(NTFS領域の読み込みやVHDX等の仮想イメージの読み込み)MIT
GitHub - DiscUtils/DiscUtils: Utility libraries to interact with discs, filesystem formats and more
lzfse-net(DiscUtilsが参照使用)BSD-3-Clause
GitHub - quamotion/lzfse-net: .NET wrapper for lzfse
lzo.net(DiscUtilsが参照使用)MIT
GitHub - zivillian/lzo.net: implementation of the lzo decoder in plain c#/.NET
DockPanel Suite(Dock機能)MIT
DockPanel Suite - The .NET WinForms Docking Library
IoControl(ディスクドライブのボリュームやパーティション操作等)MIT
GitHub - juner/IoControl: IoControl is C# DeviceIoControl's library
MFTレコードやI30のパース MIT
GitHub - EricZimmerman/MFT: MFT parser
Serilog(MFTが参照使用)Apache-2.0
Serilog — simple .NET logging with fully-structured events
RBCmd(ゴミ箱内のファイルのパース)MIT
GitHub - EricZimmerman/RBCmd: Recycle bin artifact parser
RawDiskLib(ディスクストリームの取得)MIT
GitHub - LordMike/RawDiskLib: A C# Library to read from raw sectors of a disk
ntreg-sharp(レジストリハイブファイルのパース)MIT
GitHub - VolatileMindsLLC/ntreg-sharp: Offline parsing of NT registry hives.
Newtonsoft.JSON(JSONのパース)MIT
Streams(ストリームの仮想結合)MIT
SubStream(ストリームの仮想クリッピング)パブリックドメインとのことです
Streamの一部を取り出す - 七誌の開発日記 (hateblo.jp)
TreeView with Columns(ツリーList部分)The Code Project Open License (CPOL)
TreeView with Columns - CodeProject
CPOLに基づく改変個所の表示
TreeListNode.csに、
①列挙型:NodeTypeの定義を追加
②NodeType型のメンバm_typeおよびプロパティNTypeを追記
③Nodeクラスのコンストラクタの第2引数としてNodeTypeを追加
④パブリックメソッドAddの第2引数としてNodeTypeを追加
------------------------------------------------------------------------
public enum NodeType
{
Normal,
Slack,
AttrListElement
}
NodeType m_type = NodeType.Normal;
public NodeType NType
{
get { return m_type; }
}
public Node(string text, NodeType type = NodeType.Normal)
{
m_data = new object[1] { text };
m_type = type;
}
public Node Add(string text, NodeType type = NodeType.Normal)
{
return Add(new Node(text,type));
}
------------------------------------------------------------------------
TreeListPaiter.csのPaintCellメソッド内において、nodeのプロパティNTypeに応じて描画する色を変更する処理を追加
------------------------------------------------------------------------
Color color;
if (node.NType==Node.NodeType.Slack)
{
color = Color.IndianRed;
}
else if(node.NType == Node.NodeType.AttrListElement)
{
color = Color.RoyalBlue;
}
else
{
color = format.ForeColor;
if (m_owner.FocusedNode == node && Application.RenderWithVisualStyles == false)
color = SystemColors.HighlightText;
}
------------------------------------------------------------------------
Modified locations based on CPOL
In TreeListNode.cs.
(1) Added the definition of enumerated type: NodeType.
(2) Added member m_type and property NType of NodeType type.
(3) NodeType is added as the second argument of the constructor of the Node class.
(4) Added NodeType as the second argument of the public method Add
------------------------------------------------------------------------
public enum NodeType
{
Normal,
Slack,
AttrListElement
}
NodeType m_type = NodeType.Normal;
public NodeType NType
{
get { return m_type; }
}
public Node(string text, NodeType type = NodeType.Normal)
{
m_data = new object[1] { text };
m_type = type;
}
public Node Add(string text, NodeType type = NodeType.Normal)
{
return Add(new Node(text,type));
}
------------------------------------------------------------------------
In the PaintCell method of TreeListPaiter.cs, added a process to change the drawing color according to the node property NType.
------------------------------------------------------------------------
Color color;
if (node.NType==Node.NodeType.Slack)
{
color = Color.IndianRed;
}
else if(node.NType == Node.NodeType.AttrListElement)
{
color = Color.RoyalBlue;
}
else
{
color = format.ForeColor;
if (m_owner.FocusedNode == node && Application.RenderWithVisualStyles == false)
color = SystemColors.HighlightText;
}
------------------------------------------------------------------------
XmlRichTextBox(リッチなXMLテキストボックス)MIT
https://archive.codeplex.com/?p=xmlrichtextbox
いらすとや(熊アイコン)
かわいいフリー素材集 いらすとや (irasutoya.com)
icoon-mono(種々のアイコン)
今後実装したい機能
NTFS以外の形式(FATなど)に対応したい(たぶん、今からやる気力はないから無理)
AttributeList属性をしっかりとパースしたい
E01ファイルの読み込み機能を実装したい(実現するとしたらLIBEWFを使用することになると思うけど、ライセンスがLGPL-3.0, GPL-3.0なので、ちょっと二の足を踏み中)
物理ディスク全体を読み込んで各パーティションを一括確認できるように(FTKImagerみたいに)したい
ゴミ箱データのファイル名をパースして戻して表示できるようにしたい 2022/11/23実装
ObjectIDとショートカットファイルについての何らかの機能を実装したい 2022/12/30暫定機能として実装
USNジャーナル表示機能を実装したい
LogFile表示機能を実装したい