メモリイメージの中から実行ファイルの取り出しを行う方法として、古典的な手法はファイルのシグネチャを指定してパターンで切り出す方法があります。代表的なツールとしては、Foremost や Scalpel を使い、EXEファイルのヘッダパターンを使う方法があります。
EXEファイルの先頭部分には、DOSヘッダの 64 byteがあり、マジックナンバーとして “MZ" 16進数では 4D 5A がありますので、これを起点としてカービングすることでファイルの取り出しを行う事ができます。*1
カービングの例などを見ていますと、MZ よりもう少し長く \x4d\x5a\x90\x00 くらいにしている例も見受けられます、PeStudio で DOS Header を見た場合には、Bytes on last page on file までという事でしょうか。
この部分正解はないと思いますので、どこまでこだわるか?という部分になりますが、ノイズを減らす観点では個人的には最初の段階ではもう少し絞れるパターンを使う方がよいと考えています。
ただ、手元のファイルで少し調べてみたところ、4D 5A 50 00 02 や 4D 5A 79 00 1B といった形で MZ は同じでも、続きのバイト列が若干異なるパターンも発見できます。
\x4D\x5A.\x00.\x00\x00.\x04...\xFF\xFF または \x4D\x5A.\x00.\x00\x00.\x04...\xFF\xFF.{50,50}\x0E のような正規表現でもう少しシグネチャを絞る方が、カービングによるノイズを減らしていく事ができると考えています。
残念ながら、この正規表現も十分ではなく、ファイルの先頭部分以外でDOSヘッダ構造を持つファイルはヒットしてしまいます。*2
APT.IMG に対して \x4D\x5A.\x00.\x00\x00.\x04...\xFF\xFF.{50,50}\x0E の Grep パターンを検索すると、2261件のヒットがありました。
先頭部分はこのパターンで良い気がしますが、問題はどこまで切り出すか?という事になります。明確な終端がありませんので、指定したサイズで切り出しを行う必要が出てきますが、ファイルシステムと異なりメモリ上では連続している可能性が低くフラグメントしている可能性が高いようです。
Figure 5: A craph of the number of blocks in a file versus the average number of fragments per file in a memory dump.
この為、大きめにサイズを取っても余りメリットがないように思えますが、では具体的にどの程度のサイズであれば効果が期待できるでしょうか?探しているファイルのサイズがル程度判明している場合では、そのサイズを目安として上限を設定して切り出す事になると思います。
Bulk Extractorのwinpe.txtではSizeOfImageの値を取れるので、これを参考にする案はどうなんでしょうね。Procexedumpプラグインで取り出した PID 796 のファイルサイズは 625,664byte、PeStudio で確認した場合の PE ヘッダ内 SizeOfimageの値は 634,880 byte と近い数字ではありますね。SizeOfImage 自体はファイルサイズとは異なる値*3 なので、使い方として適切なのか私の理解が十分でない部分がありますのでご注意ください。
参考URL
EXEファイルの内部構造(PEヘッダ)
http://codezine.jp/article/detail/412
PE(Portable Executable)ファイルフォーマットの概要
http://home.a00.itscom.net/hatada/mcc/doc/pe.html
Techniques and Tools for Recovering and Analyzing
Data from Volatile Memory
Portable Executable 101 - a windows executable walkthrough
https://code.google.com/p/corkami/wiki/PE101
PeStudio
*1:マルウェアが意図的に先頭パターンをメモリ上から消すなど隠蔽処理をしている場合にはひっかかりません。
*2:ファイルの先頭部分だけ見るケースではノイズ減るはずですがRAW検索ではノイズが発生します
*3:http://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/3_4_2.html